Annotation of embedaddon/libiconv/lib/hz.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc.
! 3: * This file is part of the GNU LIBICONV Library.
! 4: *
! 5: * The GNU LIBICONV Library is free software; you can redistribute it
! 6: * and/or modify it under the terms of the GNU Library General Public
! 7: * License as published by the Free Software Foundation; either version 2
! 8: * of the License, or (at your option) any later version.
! 9: *
! 10: * The GNU LIBICONV Library is distributed in the hope that it will be
! 11: * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 13: * Library General Public License for more details.
! 14: *
! 15: * You should have received a copy of the GNU Library General Public
! 16: * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
! 17: * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
! 18: */
! 19:
! 20: /*
! 21: * HZ
! 22: */
! 23:
! 24: /* Specification: RFC 1842, RFC 1843 */
! 25:
! 26: /*
! 27: * The state is 1 in GB mode, 0 in ASCII mode.
! 28: */
! 29:
! 30: static int
! 31: hz_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
! 32: {
! 33: state_t state = conv->istate;
! 34: unsigned int count = 0;
! 35: unsigned char c;
! 36: for (;;) {
! 37: c = *s;
! 38: if (c == '~') {
! 39: if (n < count+2)
! 40: goto none;
! 41: c = s[1];
! 42: if (state == 0) {
! 43: if (c == '~') {
! 44: *pwc = (ucs4_t) '~';
! 45: conv->istate = state;
! 46: return count+2;
! 47: }
! 48: if (c == '{') {
! 49: state = 1;
! 50: s += 2; count += 2;
! 51: if (n < count+1)
! 52: goto none;
! 53: continue;
! 54: }
! 55: if (c == '\n') {
! 56: s += 2; count += 2;
! 57: if (n < count+1)
! 58: goto none;
! 59: continue;
! 60: }
! 61: } else {
! 62: if (c == '}') {
! 63: state = 0;
! 64: s += 2; count += 2;
! 65: if (n < count+1)
! 66: goto none;
! 67: continue;
! 68: }
! 69: }
! 70: goto ilseq;
! 71: }
! 72: break;
! 73: }
! 74: if (state == 0) {
! 75: *pwc = (ucs4_t) c;
! 76: conv->istate = state;
! 77: return count+1;
! 78: } else {
! 79: int ret;
! 80: if (n < count+2)
! 81: goto none;
! 82: ret = gb2312_mbtowc(conv,pwc,s,2);
! 83: if (ret == RET_ILSEQ)
! 84: goto ilseq;
! 85: if (ret != 2) abort();
! 86: conv->istate = state;
! 87: return count+2;
! 88: }
! 89:
! 90: none:
! 91: conv->istate = state;
! 92: return RET_TOOFEW(count);
! 93:
! 94: ilseq:
! 95: conv->istate = state;
! 96: return RET_SHIFT_ILSEQ(count);
! 97: }
! 98:
! 99: static int
! 100: hz_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
! 101: {
! 102: state_t state = conv->ostate;
! 103: unsigned char buf[2];
! 104: int ret;
! 105:
! 106: /* Code set 0 (ASCII or GB 1988-89) */
! 107: ret = ascii_wctomb(conv,buf,wc,1);
! 108: if (ret != RET_ILUNI) {
! 109: if (ret != 1) abort();
! 110: if (buf[0] < 0x80) {
! 111: int count = (state ? 3 : 1);
! 112: if (n < count)
! 113: return RET_TOOSMALL;
! 114: if (state) {
! 115: r[0] = '~';
! 116: r[1] = '}';
! 117: r += 2;
! 118: state = 0;
! 119: }
! 120: r[0] = buf[0];
! 121: conv->ostate = state;
! 122: return count;
! 123: }
! 124: }
! 125:
! 126: /* Code set 1 (GB 2312-1980) */
! 127: ret = gb2312_wctomb(conv,buf,wc,2);
! 128: if (ret != RET_ILUNI) {
! 129: if (ret != 2) abort();
! 130: if (buf[0] < 0x80 && buf[1] < 0x80) {
! 131: int count = (state ? 2 : 4);
! 132: if (n < count)
! 133: return RET_TOOSMALL;
! 134: if (!state) {
! 135: r[0] = '~';
! 136: r[1] = '{';
! 137: r += 2;
! 138: state = 1;
! 139: }
! 140: r[0] = buf[0];
! 141: r[1] = buf[1];
! 142: conv->ostate = state;
! 143: return count;
! 144: }
! 145: }
! 146:
! 147: return RET_ILUNI;
! 148: }
! 149:
! 150: static int
! 151: hz_reset (conv_t conv, unsigned char *r, int n)
! 152: {
! 153: state_t state = conv->ostate;
! 154: if (state) {
! 155: if (n < 2)
! 156: return RET_TOOSMALL;
! 157: r[0] = '~';
! 158: r[1] = '}';
! 159: /* conv->ostate = 0; will be done by the caller */
! 160: return 2;
! 161: } else
! 162: return 0;
! 163: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>