File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / lib / c99.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 13:38:46 2021 UTC (3 years, 3 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_16p0, HEAD
libiconv 1.16

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

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