| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * _codecs_tw.c: Codecs collection for Taiwan's encodings | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Written by Hye-Shik Chang <perky@FreeBSD.org> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "cjkcodecs.h"
 | 
					
						
							|  |  |  | #include "mappings_tw.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * BIG5 codec | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENCODER(big5) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |     while (*inpos < inlen) { | 
					
						
							|  |  |  |         Py_UCS4 c = INCHAR1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         DBCHAR code; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (c < 0x80) { | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |             REQUIRE_OUTBUF(1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             **outbuf = (unsigned char)c; | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |             NEXT(1, 1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (c > 0xFFFF) | 
					
						
							|  |  |  |             return 1; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |         REQUIRE_OUTBUF(2); | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:09:41 +01:00
										 |  |  |         if (TRYMAP_ENC(big5, code, c)) | 
					
						
							|  |  |  |             ; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             return 1; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |         OUTBYTE1(code >> 8); | 
					
						
							|  |  |  |         OUTBYTE2(code & 0xFF); | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |         NEXT(1, 2); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DECODER(big5) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     while (inleft > 0) { | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |         unsigned char c = INBYTE1; | 
					
						
							| 
									
										
										
										
											2013-10-28 23:18:39 +01:00
										 |  |  |         Py_UCS4 decoded; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (c < 0x80) { | 
					
						
							| 
									
										
										
										
											2013-04-11 22:09:04 +02:00
										 |  |  |             OUTCHAR(c); | 
					
						
							|  |  |  |             NEXT_IN(1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:59:44 +01:00
										 |  |  |         REQUIRE_INBUF(2); | 
					
						
							| 
									
										
										
										
											2013-10-28 23:18:39 +01:00
										 |  |  |         if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) { | 
					
						
							|  |  |  |             OUTCHAR(decoded); | 
					
						
							| 
									
										
										
										
											2013-04-11 22:09:04 +02:00
										 |  |  |             NEXT_IN(2); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-07-08 01:45:13 +02:00
										 |  |  |         else return 1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * CP950 codec | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENCODER(cp950) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |     while (*inpos < inlen) { | 
					
						
							|  |  |  |         Py_UCS4 c = INCHAR1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         DBCHAR code; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (c < 0x80) { | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |             WRITEBYTE1((unsigned char)c); | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |             NEXT(1, 1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (c > 0xFFFF) | 
					
						
							|  |  |  |             return 1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |         REQUIRE_OUTBUF(2); | 
					
						
							| 
									
										
										
										
											2013-10-29 00:09:41 +01:00
										 |  |  |         if (TRYMAP_ENC(cp950ext, code, c)) | 
					
						
							|  |  |  |             ; | 
					
						
							|  |  |  |         else if (TRYMAP_ENC(big5, code, c)) | 
					
						
							|  |  |  |             ; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             return 1; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:19:27 +01:00
										 |  |  |         OUTBYTE1(code >> 8); | 
					
						
							|  |  |  |         OUTBYTE2(code & 0xFF); | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |         NEXT(1, 2); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DECODER(cp950) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     while (inleft > 0) { | 
					
						
							| 
									
										
										
										
											2013-04-14 02:06:32 +02:00
										 |  |  |         unsigned char c = INBYTE1; | 
					
						
							| 
									
										
										
										
											2013-10-28 23:18:39 +01:00
										 |  |  |         Py_UCS4 decoded; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (c < 0x80) { | 
					
						
							| 
									
										
										
										
											2013-04-11 22:09:04 +02:00
										 |  |  |             OUTCHAR(c); | 
					
						
							|  |  |  |             NEXT_IN(1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 00:59:44 +01:00
										 |  |  |         REQUIRE_INBUF(2); | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 23:18:39 +01:00
										 |  |  |         if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2)) | 
					
						
							|  |  |  |             OUTCHAR(decoded); | 
					
						
							|  |  |  |         else if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) | 
					
						
							|  |  |  |             OUTCHAR(decoded); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             return 1; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-11 22:09:04 +02:00
										 |  |  |         NEXT_IN(2); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2004-07-18 03:06:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BEGIN_MAPPINGS_LIST | 
					
						
							|  |  |  |   MAPPING_ENCDEC(big5) | 
					
						
							|  |  |  |   MAPPING_ENCDEC(cp950ext) | 
					
						
							|  |  |  | END_MAPPINGS_LIST | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BEGIN_CODECS_LIST | 
					
						
							|  |  |  |   CODEC_STATELESS(big5) | 
					
						
							|  |  |  |   CODEC_STATELESS(cp950) | 
					
						
							|  |  |  | END_CODECS_LIST | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I_AM_A_MODULE_FOR(tw) |