LCOV - code coverage report
Current view: top level - Modules/cjkcodecs - _codecs_tw.c (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 61 63 96.8 %
Date: 2022-07-20 13:12:14 Functions: 5 5 100.0 %
Branches: 70 90 77.8 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * _codecs_tw.c: Codecs collection for Taiwan's encodings
       3                 :            :  *
       4                 :            :  * Written by Hye-Shik Chang <perky@FreeBSD.org>
       5                 :            :  */
       6                 :            : 
       7                 :            : #include "cjkcodecs.h"
       8                 :            : #include "mappings_tw.h"
       9                 :            : 
      10                 :            : /*
      11                 :            :  * BIG5 codec
      12                 :            :  */
      13                 :            : 
      14                 :      18153 : ENCODER(big5)
      15                 :            : {
      16         [ +  + ]:      79309 :     while (*inpos < inlen) {
      17                 :      61284 :         Py_UCS4 c = INCHAR1;
      18                 :            :         DBCHAR code;
      19                 :            : 
      20         [ +  + ]:      61284 :         if (c < 0x80) {
      21         [ +  + ]:      27258 :             REQUIRE_OUTBUF(1);
      22                 :      27257 :             **outbuf = (unsigned char)c;
      23                 :      27257 :             NEXT(1, 1);
      24                 :      27257 :             continue;
      25                 :            :         }
      26                 :            : 
      27         [ -  + ]:      34026 :         if (c > 0xFFFF)
      28                 :          0 :             return 1;
      29                 :            : 
      30         [ -  + ]:      34026 :         REQUIRE_OUTBUF(2);
      31                 :            : 
      32   [ +  +  +  -  :      34026 :         if (TRYMAP_ENC(big5, code, c))
             +  -  +  + ]
      33                 :            :             ;
      34                 :            :         else
      35                 :        127 :             return 1;
      36                 :            : 
      37                 :      33899 :         OUTBYTE1(code >> 8);
      38                 :      33899 :         OUTBYTE2(code & 0xFF);
      39                 :      33899 :         NEXT(1, 2);
      40                 :            :     }
      41                 :            : 
      42                 :      18025 :     return 0;
      43                 :            : }
      44                 :            : 
      45                 :      21149 : DECODER(big5)
      46                 :            : {
      47         [ +  + ]:      88408 :     while (inleft > 0) {
      48                 :      69164 :         unsigned char c = INBYTE1;
      49                 :            :         Py_UCS4 decoded;
      50                 :            : 
      51         [ +  + ]:      69164 :         if (c < 0x80) {
      52         [ -  + ]:      32741 :             OUTCHAR(c);
      53                 :      32741 :             NEXT_IN(1);
      54                 :      32741 :             continue;
      55                 :            :         }
      56                 :            : 
      57         [ +  + ]:      36423 :         REQUIRE_INBUF(2);
      58   [ +  +  +  -  :      34603 :         if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
             +  +  +  - ]
      59         [ -  + ]:      34518 :             OUTCHAR(decoded);
      60                 :      34518 :             NEXT_IN(2);
      61                 :            :         }
      62                 :         85 :         else return 1;
      63                 :            :     }
      64                 :            : 
      65                 :      19244 :     return 0;
      66                 :            : }
      67                 :            : 
      68                 :            : 
      69                 :            : /*
      70                 :            :  * CP950 codec
      71                 :            :  */
      72                 :            : 
      73                 :      13774 : ENCODER(cp950)
      74                 :            : {
      75         [ +  + ]:      28785 :     while (*inpos < inlen) {
      76                 :      15111 :         Py_UCS4 c = INCHAR1;
      77                 :            :         DBCHAR code;
      78                 :            : 
      79         [ +  + ]:      15111 :         if (c < 0x80) {
      80         [ -  + ]:       1520 :             WRITEBYTE1((unsigned char)c);
      81                 :       1520 :             NEXT(1, 1);
      82                 :       1520 :             continue;
      83                 :            :         }
      84                 :            : 
      85         [ -  + ]:      13591 :         if (c > 0xFFFF)
      86                 :          0 :             return 1;
      87                 :            : 
      88         [ -  + ]:      13591 :         REQUIRE_OUTBUF(2);
      89   [ +  +  +  +  :      13591 :         if (TRYMAP_ENC(cp950ext, code, c))
             +  +  +  + ]
      90                 :            :             ;
      91   [ +  +  +  -  :      13544 :         else if (TRYMAP_ENC(big5, code, c))
             +  -  +  - ]
      92                 :            :             ;
      93                 :            :         else
      94                 :        100 :             return 1;
      95                 :            : 
      96                 :      13491 :         OUTBYTE1(code >> 8);
      97                 :      13491 :         OUTBYTE2(code & 0xFF);
      98                 :      13491 :         NEXT(1, 2);
      99                 :            :     }
     100                 :            : 
     101                 :      13674 :     return 0;
     102                 :            : }
     103                 :            : 
     104                 :      13753 : DECODER(cp950)
     105                 :            : {
     106         [ +  + ]:      33816 :     while (inleft > 0) {
     107                 :      20140 :         unsigned char c = INBYTE1;
     108                 :            :         Py_UCS4 decoded;
     109                 :            : 
     110         [ +  + ]:      20140 :         if (c < 0x80) {
     111         [ -  + ]:       6480 :             OUTCHAR(c);
     112                 :       6480 :             NEXT_IN(1);
     113                 :       6480 :             continue;
     114                 :            :         }
     115                 :            : 
     116         [ +  + ]:      13660 :         REQUIRE_INBUF(2);
     117                 :            : 
     118   [ +  +  +  +  :      13658 :         if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
             +  +  +  + ]
     119         [ -  + ]:         47 :             OUTCHAR(decoded);
     120   [ +  +  +  -  :      13611 :         else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
             +  -  +  - ]
     121         [ -  + ]:      13536 :             OUTCHAR(decoded);
     122                 :            :         else
     123                 :         75 :             return 1;
     124                 :            : 
     125                 :      13583 :         NEXT_IN(2);
     126                 :            :     }
     127                 :            : 
     128                 :      13676 :     return 0;
     129                 :            : }
     130                 :            : 
     131                 :            : 
     132                 :            : 
     133                 :            : BEGIN_MAPPINGS_LIST
     134                 :            :   MAPPING_ENCDEC(big5)
     135                 :            :   MAPPING_ENCDEC(cp950ext)
     136                 :            : END_MAPPINGS_LIST
     137                 :            : 
     138                 :            : BEGIN_CODECS_LIST
     139                 :            :   CODEC_STATELESS(big5)
     140                 :            :   CODEC_STATELESS(cp950)
     141                 :            : END_CODECS_LIST
     142                 :            : 
     143                 :          9 : I_AM_A_MODULE_FOR(tw)

Generated by: LCOV version 1.14