Annotation of embedaddon/libiconv/srclib/c-ctype.h, revision 1.1.1.3

1.1       misho       1: /* Character handling in C locale.
                      2: 
                      3:    These functions work like the corresponding functions in <ctype.h>,
                      4:    except that they have the C (POSIX) locale hardwired, whereas the
                      5:    <ctype.h> functions' behaviour depends on the current locale set via
                      6:    setlocale.
                      7: 
1.1.1.3 ! misho       8:    Copyright (C) 2000-2003, 2006, 2008-2019 Free Software Foundation, Inc.
1.1       misho       9: 
                     10: This program is free software; you can redistribute it and/or modify
                     11: it under the terms of the GNU General Public License as published by
                     12: the Free Software Foundation; either version 3 of the License, or
                     13: (at your option) any later version.
                     14: 
                     15: This program is distributed in the hope that it will be useful,
                     16: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: GNU General Public License for more details.
                     19: 
                     20: You should have received a copy of the GNU General Public License
1.1.1.3 ! misho      21: along with this program; if not, see <https://www.gnu.org/licenses/>.  */
1.1       misho      22: 
                     23: #ifndef C_CTYPE_H
                     24: #define C_CTYPE_H
                     25: 
                     26: #include <stdbool.h>
                     27: 
1.1.1.3 ! misho      28: #ifndef _GL_INLINE_HEADER_BEGIN
        !            29:  #error "Please include config.h first."
        !            30: #endif
        !            31: _GL_INLINE_HEADER_BEGIN
        !            32: #ifndef C_CTYPE_INLINE
        !            33: # define C_CTYPE_INLINE _GL_INLINE
        !            34: #endif
1.1       misho      35: 
                     36: #ifdef __cplusplus
                     37: extern "C" {
                     38: #endif
                     39: 
                     40: 
                     41: /* The functions defined in this file assume the "C" locale and a character
                     42:    set without diacritics (ASCII-US or EBCDIC-US or something like that).
                     43:    Even if the "C" locale on a particular system is an extension of the ASCII
                     44:    character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
                     45:    is ISO-8859-1), the functions in this file recognize only the ASCII
                     46:    characters.  */
                     47: 
                     48: 
                     49: #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
                     50:     && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
                     51:     && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
                     52:     && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
                     53:     && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
                     54:     && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
                     55:     && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
                     56:     && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
                     57:     && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
                     58:     && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
                     59:     && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
                     60:     && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
                     61:     && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
                     62:     && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
                     63:     && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
                     64:     && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
                     65:     && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
                     66:     && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
                     67:     && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
                     68:     && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
                     69:     && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
                     70:     && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
                     71:     && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
                     72: /* The character set is ASCII or one of its variants or extensions, not EBCDIC.
                     73:    Testing the value of '\n' and '\r' is not relevant.  */
1.1.1.3 ! misho      74: # define C_CTYPE_ASCII 1
        !            75: #elif ! (' ' == '\x40' && '0' == '\xf0'                     \
        !            76:          && 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \
        !            77:          && 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2')
        !            78: # error "Only ASCII and EBCDIC are supported"
1.1       misho      79: #endif
                     80: 
1.1.1.3 ! misho      81: #if 'A' < 0
        !            82: # error "EBCDIC and char is signed -- not supported"
        !            83: #endif
        !            84: 
        !            85: /* Cases for control characters.  */
        !            86: 
        !            87: #define _C_CTYPE_CNTRL \
        !            88:    case '\a': case '\b': case '\f': case '\n': \
        !            89:    case '\r': case '\t': case '\v': \
        !            90:    _C_CTYPE_OTHER_CNTRL
        !            91: 
        !            92: /* ASCII control characters other than those with \-letter escapes.  */
        !            93: 
        !            94: #if C_CTYPE_ASCII
        !            95: # define _C_CTYPE_OTHER_CNTRL \
        !            96:     case '\x00': case '\x01': case '\x02': case '\x03': \
        !            97:     case '\x04': case '\x05': case '\x06': case '\x0e': \
        !            98:     case '\x0f': case '\x10': case '\x11': case '\x12': \
        !            99:     case '\x13': case '\x14': case '\x15': case '\x16': \
        !           100:     case '\x17': case '\x18': case '\x19': case '\x1a': \
        !           101:     case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
        !           102:     case '\x1f': case '\x7f'
        !           103: #else
        !           104:    /* Use EBCDIC code page 1047's assignments for ASCII control chars;
        !           105:       assume all EBCDIC code pages agree about these assignments.  */
        !           106: # define _C_CTYPE_OTHER_CNTRL \
        !           107:     case '\x00': case '\x01': case '\x02': case '\x03': \
        !           108:     case '\x07': case '\x0e': case '\x0f': case '\x10': \
        !           109:     case '\x11': case '\x12': case '\x13': case '\x18': \
        !           110:     case '\x19': case '\x1c': case '\x1d': case '\x1e': \
        !           111:     case '\x1f': case '\x26': case '\x27': case '\x2d': \
        !           112:     case '\x2e': case '\x32': case '\x37': case '\x3c': \
        !           113:     case '\x3d': case '\x3f'
        !           114: #endif
        !           115: 
        !           116: /* Cases for lowercase hex letters, and lowercase letters, all offset by N.  */
        !           117: 
        !           118: #define _C_CTYPE_LOWER_A_THRU_F_N(N) \
        !           119:    case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \
        !           120:    case 'e' + (N): case 'f' + (N)
        !           121: #define _C_CTYPE_LOWER_N(N) \
        !           122:    _C_CTYPE_LOWER_A_THRU_F_N(N): \
        !           123:    case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \
        !           124:    case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \
        !           125:    case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \
        !           126:    case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \
        !           127:    case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N)
        !           128: 
        !           129: /* Cases for hex letters, digits, lower, punct, and upper.  */
        !           130: 
        !           131: #define _C_CTYPE_A_THRU_F \
        !           132:    _C_CTYPE_LOWER_A_THRU_F_N (0): \
        !           133:    _C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a')
        !           134: #define _C_CTYPE_DIGIT                     \
        !           135:    case '0': case '1': case '2': case '3': \
        !           136:    case '4': case '5': case '6': case '7': \
        !           137:    case '8': case '9'
        !           138: #define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0)
        !           139: #define _C_CTYPE_PUNCT \
        !           140:    case '!': case '"': case '#': case '$':  \
        !           141:    case '%': case '&': case '\'': case '(': \
        !           142:    case ')': case '*': case '+': case ',':  \
        !           143:    case '-': case '.': case '/': case ':':  \
        !           144:    case ';': case '<': case '=': case '>':  \
        !           145:    case '?': case '@': case '[': case '\\': \
        !           146:    case ']': case '^': case '_': case '`':  \
        !           147:    case '{': case '|': case '}': case '~'
        !           148: #define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a')
        !           149: 
1.1       misho     150: 
1.1.1.3 ! misho     151: /* Function definitions.  */
1.1       misho     152: 
                    153: /* Unlike the functions in <ctype.h>, which require an argument in the range
                    154:    of the 'unsigned char' type, the functions here operate on values that are
                    155:    in the 'unsigned char' range or in the 'char' range.  In other words,
                    156:    when you have a 'char' value, you need to cast it before using it as
                    157:    argument to a <ctype.h> function:
                    158: 
                    159:          const char *s = ...;
                    160:          if (isalpha ((unsigned char) *s)) ...
                    161: 
                    162:    but you don't need to cast it for the functions defined in this file:
                    163: 
                    164:          const char *s = ...;
                    165:          if (c_isalpha (*s)) ...
                    166:  */
                    167: 
1.1.1.3 ! misho     168: C_CTYPE_INLINE bool
        !           169: c_isalnum (int c)
        !           170: {
        !           171:   switch (c)
        !           172:     {
        !           173:     _C_CTYPE_DIGIT:
        !           174:     _C_CTYPE_LOWER:
        !           175:     _C_CTYPE_UPPER:
        !           176:       return true;
        !           177:     default:
        !           178:       return false;
        !           179:     }
        !           180: }
1.1       misho     181: 
1.1.1.3 ! misho     182: C_CTYPE_INLINE bool
        !           183: c_isalpha (int c)
        !           184: {
        !           185:   switch (c)
        !           186:     {
        !           187:     _C_CTYPE_LOWER:
        !           188:     _C_CTYPE_UPPER:
        !           189:       return true;
        !           190:     default:
        !           191:       return false;
        !           192:     }
        !           193: }
1.1       misho     194: 
1.1.1.3 ! misho     195: /* The function isascii is not locale dependent.
        !           196:    Its use in EBCDIC is questionable. */
        !           197: C_CTYPE_INLINE bool
        !           198: c_isascii (int c)
        !           199: {
        !           200:   switch (c)
        !           201:     {
        !           202:     case ' ':
        !           203:     _C_CTYPE_CNTRL:
        !           204:     _C_CTYPE_DIGIT:
        !           205:     _C_CTYPE_LOWER:
        !           206:     _C_CTYPE_PUNCT:
        !           207:     _C_CTYPE_UPPER:
        !           208:       return true;
        !           209:     default:
        !           210:       return false;
        !           211:     }
        !           212: }
1.1       misho     213: 
1.1.1.3 ! misho     214: C_CTYPE_INLINE bool
        !           215: c_isblank (int c)
        !           216: {
        !           217:   return c == ' ' || c == '\t';
        !           218: }
1.1       misho     219: 
1.1.1.3 ! misho     220: C_CTYPE_INLINE bool
        !           221: c_iscntrl (int c)
        !           222: {
        !           223:   switch (c)
        !           224:     {
        !           225:     _C_CTYPE_CNTRL:
        !           226:       return true;
        !           227:     default:
        !           228:       return false;
        !           229:     }
        !           230: }
1.1       misho     231: 
1.1.1.3 ! misho     232: C_CTYPE_INLINE bool
        !           233: c_isdigit (int c)
        !           234: {
        !           235:   switch (c)
        !           236:     {
        !           237:     _C_CTYPE_DIGIT:
        !           238:       return true;
        !           239:     default:
        !           240:       return false;
        !           241:     }
        !           242: }
1.1       misho     243: 
1.1.1.3 ! misho     244: C_CTYPE_INLINE bool
        !           245: c_isgraph (int c)
        !           246: {
        !           247:   switch (c)
        !           248:     {
        !           249:     _C_CTYPE_DIGIT:
        !           250:     _C_CTYPE_LOWER:
        !           251:     _C_CTYPE_PUNCT:
        !           252:     _C_CTYPE_UPPER:
        !           253:       return true;
        !           254:     default:
        !           255:       return false;
        !           256:     }
        !           257: }
1.1       misho     258: 
1.1.1.3 ! misho     259: C_CTYPE_INLINE bool
        !           260: c_islower (int c)
        !           261: {
        !           262:   switch (c)
        !           263:     {
        !           264:     _C_CTYPE_LOWER:
        !           265:       return true;
        !           266:     default:
        !           267:       return false;
        !           268:     }
        !           269: }
1.1       misho     270: 
1.1.1.3 ! misho     271: C_CTYPE_INLINE bool
        !           272: c_isprint (int c)
        !           273: {
        !           274:   switch (c)
        !           275:     {
        !           276:     case ' ':
        !           277:     _C_CTYPE_DIGIT:
        !           278:     _C_CTYPE_LOWER:
        !           279:     _C_CTYPE_PUNCT:
        !           280:     _C_CTYPE_UPPER:
        !           281:       return true;
        !           282:     default:
        !           283:       return false;
        !           284:     }
        !           285: }
1.1       misho     286: 
1.1.1.3 ! misho     287: C_CTYPE_INLINE bool
        !           288: c_ispunct (int c)
        !           289: {
        !           290:   switch (c)
        !           291:     {
        !           292:     _C_CTYPE_PUNCT:
        !           293:       return true;
        !           294:     default:
        !           295:       return false;
        !           296:     }
        !           297: }
1.1       misho     298: 
1.1.1.3 ! misho     299: C_CTYPE_INLINE bool
        !           300: c_isspace (int c)
        !           301: {
        !           302:   switch (c)
        !           303:     {
        !           304:     case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
        !           305:       return true;
        !           306:     default:
        !           307:       return false;
        !           308:     }
        !           309: }
1.1       misho     310: 
1.1.1.3 ! misho     311: C_CTYPE_INLINE bool
        !           312: c_isupper (int c)
        !           313: {
        !           314:   switch (c)
        !           315:     {
        !           316:     _C_CTYPE_UPPER:
        !           317:       return true;
        !           318:     default:
        !           319:       return false;
        !           320:     }
        !           321: }
1.1       misho     322: 
1.1.1.3 ! misho     323: C_CTYPE_INLINE bool
        !           324: c_isxdigit (int c)
        !           325: {
        !           326:   switch (c)
        !           327:     {
        !           328:     _C_CTYPE_DIGIT:
        !           329:     _C_CTYPE_A_THRU_F:
        !           330:       return true;
        !           331:     default:
        !           332:       return false;
        !           333:     }
        !           334: }
1.1       misho     335: 
1.1.1.3 ! misho     336: C_CTYPE_INLINE int
        !           337: c_tolower (int c)
        !           338: {
        !           339:   switch (c)
        !           340:     {
        !           341:     _C_CTYPE_UPPER:
        !           342:       return c - 'A' + 'a';
        !           343:     default:
        !           344:       return c;
        !           345:     }
        !           346: }
1.1       misho     347: 
1.1.1.3 ! misho     348: C_CTYPE_INLINE int
        !           349: c_toupper (int c)
        !           350: {
        !           351:   switch (c)
        !           352:     {
        !           353:     _C_CTYPE_LOWER:
        !           354:       return c - 'a' + 'A';
        !           355:     default:
        !           356:       return c;
        !           357:     }
        !           358: }
1.1       misho     359: 
                    360: #ifdef __cplusplus
                    361: }
                    362: #endif
                    363: 
1.1.1.3 ! misho     364: _GL_INLINE_HEADER_END
        !           365: 
1.1       misho     366: #endif /* C_CTYPE_H */

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