[KoCo-CVS] [Commit] cjkcodecs/src _iso_2022_jp_1.c
Brought to you by:
perky
From: Hye-Shik C. <pe...@us...> - 2003-06-02 10:42:47
|
perky 03/06/02 03:42:46 Added: src _iso_2022_jp_1.c Log: Add a ISO-2022-JP-1 codec. Revision Changes Path 1.1 cjkcodecs/src/_iso_2022_jp_1.c Index: _iso_2022_jp_1.c =================================================================== /* * _iso_2022_jp_1.c: the ISO-2022-JP-1 codec (RFC1468) * * Copyright (C) 2003 Hye-Shik Chang <pe...@Fr...>. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * $Id: _iso_2022_jp_1.c,v 1.1 2003/06/02 10:42:46 perky Exp $ */ #include "codeccommon.h" #include "iso2022common.h" #include "maps/alg_jisx0201.h" ENCMAP(jisxcommon) DECMAP(jisx0208) DECMAP(jisx0212) #define HAVE_ENCODER_INIT ENCODER_INIT(iso_2022_jp_1) { state->i = 0; STATE_SETG0(state, CHARSET_ASCII) STATE_SETG1(state, CHARSET_ASCII) return 0; } /* ISO-2022-JP changes designations instead of shifting-out */ ENCODER(iso_2022_jp_1) { while (inleft > 0) { Py_UNICODE c = **inbuf; DBCHAR code; if (c < 0x80) { switch (STATE_GETG0(state)) { case CHARSET_ASCII: PAVE1(c) NEXT(1, 1) break; case CHARSET_JISX0201_R: JISX0201_R_ENCODE(c, code) else { /* FALLTHROUGH (yay!) */ default: PAVE3(ESC, '(', 'B') NEXT_OUT(3) STATE_SETG0(state, CHARSET_ASCII) code = c; } PAVE1(code) NEXT(1, 1) break; } if (c == '\n') STATE_CLEARFLAG(state, F_SHIFTED) } else UCS4INVALID(c) else { unsigned char charset; charset = STATE_GETG0(state); if (charset == CHARSET_JISX0201_R) { code = DBCINV; JISX0201_R_ENCODE(c, code) if (code != DBCINV) { PAVE1(code) NEXT(1, 1) continue; } } TRYMAP_ENC(jisxcommon, code, c) { if (code & 0x8000) { /* MSB set: JIS X 0212 */ if (charset != CHARSET_JISX0212) { PAVE4(ESC, '$', '(', 'D') STATE_SETG0(state, CHARSET_JISX0212) NEXT_OUT(4) } PAVE2((code >> 8) & 0x7f, code & 0x7f) } else { /* MSB unset: JIS X 0208 */ if (charset != CHARSET_JISX0208) { PAVE3(ESC, '$', 'B') STATE_SETG0(state, CHARSET_JISX0208) NEXT_OUT(3) } PAVE2(code >> 8, code & 0xff) } NEXT(1, 2) } else { JISX0201_R_ENCODE(c, code) else return 1; /* if (charset == CHARSET_JISX0201_R) : already checked */ PAVE4(ESC, '(', 'J', code) STATE_SETG0(state, CHARSET_JISX0201_R) NEXT(1, 4) } } } return 0; } #define HAVE_DECODER_INIT DECODER_INIT(iso_2022_jp_1) { state->i = 0; STATE_SETG0(state, CHARSET_ASCII) STATE_SETG1(state, CHARSET_ASCII) return 0; } #define HAVE_DECODER_RESET DECODER_RESET(iso_2022_jp_1) { STATE_CLEARFLAG(state, F_SHIFTED) return 0; } DECODER(iso_2022_jp_1) { while (inleft > 0) { unsigned char c = **inbuf; if (STATE_GETFLAG(state, F_ESCTHROUGHOUT)) { /* ESC throughout mode: for non-iso2022 escape sequences */ RESERVE_OUTBUF(1) **outbuf = c; /* assume as ISO-8859-1 */ NEXT(1, 1) if (IS_ESCEND(c)) { STATE_CLEARFLAG(state, F_ESCTHROUGHOUT) } continue; } switch (c) { case ESC: RESERVE_INBUF(2) if (IS_ISO2022ESC((*inbuf)[1])) { int eslen; eslen = iso2022esclen(*inbuf, inleft); if (eslen < 0) return eslen == MBERR_INTERNAL ? 1 : eslen; if (eslen == 3) { unsigned char charset; if ((*inbuf)[1] == '$') { if ((*inbuf)[2] == '@' || (*inbuf)[2] == 'B') { charset = (*inbuf)[2] | CHARSET_DOUBLEBYTE; STATE_SETG0(state, charset); } else return 3; } else { if ((*inbuf)[2] == 'B' || (*inbuf)[2] == 'J') charset = (*inbuf)[2]; else return 3; if ((*inbuf)[1] == '(') { STATE_SETG0(state, charset) } else if ((*inbuf)[1] == ')') { STATE_SETG1(state, charset) } else return 3; } } else if (eslen == 4) { if ((*inbuf)[1] == '$' && (*inbuf)[3] == 'D') { if ((*inbuf)[2] == '(') { STATE_SETG0(state, CHARSET_JISX0212) } else if ((*inbuf)[2] == ')') { STATE_SETG1(state, CHARSET_JISX0212) } else return 4; } else return 4; } else return eslen; NEXT_IN(eslen) } else { STATE_SETFLAG(state, F_ESCTHROUGHOUT) **outbuf = ESC; NEXT(1, 1) } break; case SI: STATE_CLEARFLAG(state, F_SHIFTED) NEXT_IN(1) break; case SO: STATE_SETFLAG(state, F_SHIFTED) NEXT_IN(1) break; case '\n': STATE_CLEARFLAG(state, F_SHIFTED) /* FALLTHROUGH */ case SP: /* FALLTHROUGH */ case DEL: RESERVE_OUTBUF(1) **outbuf = c; NEXT(1, 1) break; default: if ((c & 0x7f) < 0x20) { /* C0 and C1 */ RESERVE_OUTBUF(1) **outbuf = c & 0x7f; NEXT(1, 1) } else { unsigned char charset; if (!STATE_GETFLAG(state, F_SHIFTED) && c < 0x80) /* G0 */ charset = STATE_GETG0(state); else /* G1 */ charset = STATE_GETG1(state); if (charset & CHARSET_DOUBLEBYTE) { RESERVE_INBUF(2) RESERVE_OUTBUF(1) if (charset == CHARSET_JISX0208 || charset == CHARSET_JISX0208_O) { TRYMAP_DEC(jisx0208, **outbuf, c & 0x7f, (*inbuf)[1] & 0x7f); else return 2; } else if (charset == CHARSET_JISX0212) { TRYMAP_DEC(jisx0212, **outbuf, c & 0x7f, (*inbuf)[1] & 0x7f); else return 2; } else return MBERR_INTERNAL; NEXT(2, 1) } else if (charset == CHARSET_ASCII) { RESERVE_OUTBUF(1) **outbuf = c & 0x7f; NEXT(1, 1) } else if (charset == CHARSET_JISX0201_R) { RESERVE_OUTBUF(1) JISX0201_R_DECODE(c & 0x7f, **outbuf) else return 1; NEXT(1, 1) } else return MBERR_INTERNAL; } } } return 0; } #include "codecentry.h" BEGIN_CODEC_REGISTRY(iso_2022_jp_1) MAPOPEN(ja_JP) IMPORTMAP_DEC(jisx0208) IMPORTMAP_DEC(jisx0212) IMPORTMAP_ENC(jisxcommon) MAPCLOSE() END_CODEC_REGISTRY(iso_2022_jp_1) /* * ex: ts=8 sts=4 et */ |