/Modules/cjkcodecs/_codecs_tw.c

http://unladen-swallow.googlecode.com/ · C · 132 lines · 89 code · 32 blank · 11 comment · 14 complexity · 4af4c55abd2054e9d1eab2b03e9a1801 MD5 · raw file

  1. /*
  2. * _codecs_tw.c: Codecs collection for Taiwan's encodings
  3. *
  4. * Written by Hye-Shik Chang <perky@FreeBSD.org>
  5. */
  6. #include "cjkcodecs.h"
  7. #include "mappings_tw.h"
  8. /*
  9. * BIG5 codec
  10. */
  11. ENCODER(big5)
  12. {
  13. while (inleft > 0) {
  14. Py_UNICODE c = **inbuf;
  15. DBCHAR code;
  16. if (c < 0x80) {
  17. REQUIRE_OUTBUF(1)
  18. **outbuf = (unsigned char)c;
  19. NEXT(1, 1)
  20. continue;
  21. }
  22. UCS4INVALID(c)
  23. REQUIRE_OUTBUF(2)
  24. TRYMAP_ENC(big5, code, c);
  25. else return 1;
  26. OUT1(code >> 8)
  27. OUT2(code & 0xFF)
  28. NEXT(1, 2)
  29. }
  30. return 0;
  31. }
  32. DECODER(big5)
  33. {
  34. while (inleft > 0) {
  35. unsigned char c = IN1;
  36. REQUIRE_OUTBUF(1)
  37. if (c < 0x80) {
  38. OUT1(c)
  39. NEXT(1, 1)
  40. continue;
  41. }
  42. REQUIRE_INBUF(2)
  43. TRYMAP_DEC(big5, **outbuf, c, IN2) {
  44. NEXT(2, 1)
  45. }
  46. else return 2;
  47. }
  48. return 0;
  49. }
  50. /*
  51. * CP950 codec
  52. */
  53. ENCODER(cp950)
  54. {
  55. while (inleft > 0) {
  56. Py_UNICODE c = IN1;
  57. DBCHAR code;
  58. if (c < 0x80) {
  59. WRITE1((unsigned char)c)
  60. NEXT(1, 1)
  61. continue;
  62. }
  63. UCS4INVALID(c)
  64. REQUIRE_OUTBUF(2)
  65. TRYMAP_ENC(cp950ext, code, c);
  66. else TRYMAP_ENC(big5, code, c);
  67. else return 1;
  68. OUT1(code >> 8)
  69. OUT2(code & 0xFF)
  70. NEXT(1, 2)
  71. }
  72. return 0;
  73. }
  74. DECODER(cp950)
  75. {
  76. while (inleft > 0) {
  77. unsigned char c = IN1;
  78. REQUIRE_OUTBUF(1)
  79. if (c < 0x80) {
  80. OUT1(c)
  81. NEXT(1, 1)
  82. continue;
  83. }
  84. REQUIRE_INBUF(2)
  85. TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
  86. else TRYMAP_DEC(big5, **outbuf, c, IN2);
  87. else return 2;
  88. NEXT(2, 1)
  89. }
  90. return 0;
  91. }
  92. BEGIN_MAPPINGS_LIST
  93. MAPPING_ENCDEC(big5)
  94. MAPPING_ENCDEC(cp950ext)
  95. END_MAPPINGS_LIST
  96. BEGIN_CODECS_LIST
  97. CODEC_STATELESS(big5)
  98. CODEC_STATELESS(cp950)
  99. END_CODECS_LIST
  100. I_AM_A_MODULE_FOR(tw)