Python-2.7.3/Modules/cjkcodecs/_codecs_tw.c

No issues found

  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 ENCODER(big5)
 15 {
 16     while (inleft > 0) {
 17         Py_UNICODE c = **inbuf;
 18         DBCHAR code;
 19 
 20         if (c < 0x80) {
 21             REQUIRE_OUTBUF(1)
 22             **outbuf = (unsigned char)c;
 23             NEXT(1, 1)
 24             continue;
 25         }
 26         UCS4INVALID(c)
 27 
 28         REQUIRE_OUTBUF(2)
 29 
 30         TRYMAP_ENC(big5, code, c);
 31         else return 1;
 32 
 33         OUT1(code >> 8)
 34         OUT2(code & 0xFF)
 35         NEXT(1, 2)
 36     }
 37 
 38     return 0;
 39 }
 40 
 41 DECODER(big5)
 42 {
 43     while (inleft > 0) {
 44         unsigned char c = IN1;
 45 
 46         REQUIRE_OUTBUF(1)
 47 
 48         if (c < 0x80) {
 49             OUT1(c)
 50             NEXT(1, 1)
 51             continue;
 52         }
 53 
 54         REQUIRE_INBUF(2)
 55         TRYMAP_DEC(big5, **outbuf, c, IN2) {
 56             NEXT(2, 1)
 57         }
 58         else return 2;
 59     }
 60 
 61     return 0;
 62 }
 63 
 64 
 65 /*
 66  * CP950 codec
 67  */
 68 
 69 ENCODER(cp950)
 70 {
 71     while (inleft > 0) {
 72         Py_UNICODE c = IN1;
 73         DBCHAR code;
 74 
 75         if (c < 0x80) {
 76             WRITE1((unsigned char)c)
 77             NEXT(1, 1)
 78             continue;
 79         }
 80         UCS4INVALID(c)
 81 
 82         REQUIRE_OUTBUF(2)
 83         TRYMAP_ENC(cp950ext, code, c);
 84         else TRYMAP_ENC(big5, code, c);
 85         else return 1;
 86 
 87         OUT1(code >> 8)
 88         OUT2(code & 0xFF)
 89         NEXT(1, 2)
 90     }
 91 
 92     return 0;
 93 }
 94 
 95 DECODER(cp950)
 96 {
 97     while (inleft > 0) {
 98         unsigned char c = IN1;
 99 
100         REQUIRE_OUTBUF(1)
101 
102         if (c < 0x80) {
103             OUT1(c)
104             NEXT(1, 1)
105             continue;
106         }
107 
108         REQUIRE_INBUF(2)
109 
110         TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
111         else TRYMAP_DEC(big5, **outbuf, c, IN2);
112         else return 2;
113 
114         NEXT(2, 1)
115     }
116 
117     return 0;
118 }
119 
120 
121 
122 BEGIN_MAPPINGS_LIST
123   MAPPING_ENCDEC(big5)
124   MAPPING_ENCDEC(cp950ext)
125 END_MAPPINGS_LIST
126 
127 BEGIN_CODECS_LIST
128   CODEC_STATELESS(big5)
129   CODEC_STATELESS(cp950)
130 END_CODECS_LIST
131 
132 I_AM_A_MODULE_FOR(tw)