Annotation of embedaddon/libiconv/lib/c99.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 1999-2002 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,
        !            18:  * Fifth Floor, Boston, MA 02110-1301, USA.
        !            19:  */
        !            20: 
        !            21: /*
        !            22:  * C99
        !            23:  * This is ASCII with \uXXXX and \UXXXXXXXX escape sequences, denoting Unicode
        !            24:  * characters. See ISO/IEC 9899:1999, section 6.4.3.
        !            25:  * The treatment of control characters in the range U+0080..U+009F is not
        !            26:  * specified; we pass them through unmodified.
        !            27:  */
        !            28: 
        !            29: static int
        !            30: c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
        !            31: {
        !            32:   unsigned char c;
        !            33:   ucs4_t wc;
        !            34:   int i;
        !            35: 
        !            36:   c = s[0];
        !            37:   if (c < 0xa0) {
        !            38:     if (c != '\\') {
        !            39:       *pwc = c;
        !            40:       return 1;
        !            41:     }
        !            42:     if (n < 2)
        !            43:       return RET_TOOFEW(0);
        !            44:     c = s[1];
        !            45:     if (c == 'u') {
        !            46:       wc = 0;
        !            47:       for (i = 2; i < 6; i++) {
        !            48:         if (n <= i)
        !            49:           return RET_TOOFEW(0);
        !            50:         c = s[i];
        !            51:         if (c >= '0' && c <= '9')
        !            52:           c -= '0';
        !            53:         else if (c >= 'A' && c <= 'Z')
        !            54:           c -= 'A'-10;
        !            55:         else if (c >= 'a' && c <= 'z')
        !            56:           c -= 'a'-10;
        !            57:         else
        !            58:           goto simply_backslash;
        !            59:         wc |= (ucs4_t) c << (4 * (5-i));
        !            60:       }
        !            61:       if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
        !            62:           || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
        !            63:         *pwc = wc;
        !            64:         return 6;
        !            65:       }
        !            66:     } else if (c == 'U') {
        !            67:       wc = 0;
        !            68:       for (i = 2; i < 10; i++) {
        !            69:         if (n <= i)
        !            70:           return RET_TOOFEW(0);
        !            71:         c = s[i];
        !            72:         if (c >= '0' && c <= '9')
        !            73:           c -= '0';
        !            74:         else if (c >= 'A' && c <= 'Z')
        !            75:           c -= 'A'-10;
        !            76:         else if (c >= 'a' && c <= 'z')
        !            77:           c -= 'a'-10;
        !            78:         else
        !            79:           goto simply_backslash;
        !            80:         wc |= (ucs4_t) c << (4 * (9-i));
        !            81:       }
        !            82:       if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
        !            83:           || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
        !            84:         *pwc = wc;
        !            85:         return 10;
        !            86:       }
        !            87:     } else
        !            88:       goto simply_backslash;
        !            89:   }
        !            90:   return RET_ILSEQ;
        !            91: simply_backslash:
        !            92:   *pwc = '\\';
        !            93:   return 1;
        !            94: }
        !            95: 
        !            96: static int
        !            97: c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
        !            98: {
        !            99:   if (wc < 0xa0) {
        !           100:     *r = wc;
        !           101:     return 1;
        !           102:   } else {
        !           103:     int result;
        !           104:     unsigned char u;
        !           105:     if (wc < 0x10000) {
        !           106:       result = 6;
        !           107:       u = 'u';
        !           108:     } else {
        !           109:       result = 10;
        !           110:       u = 'U';
        !           111:     }
        !           112:     if (n >= result) {
        !           113:       int count;
        !           114:       r[0] = '\\';
        !           115:       r[1] = u;
        !           116:       r += 2;
        !           117:       for (count = result-3; count >= 0; count--) {
        !           118:         unsigned int i = (wc >> (4*count)) & 0x0f;
        !           119:         *r++ = (i < 10 ? '0'+i : 'a'-10+i);
        !           120:       }
        !           121:       return result;
        !           122:     } else
        !           123:       return RET_TOOSMALL;
        !           124:   }
        !           125: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>