Blame src/gl/c-ctype.h

Packit aea12f
/* Character handling in C locale.
Packit aea12f
Packit aea12f
   These functions work like the corresponding functions in <ctype.h>,
Packit aea12f
   except that they have the C (POSIX) locale hardwired, whereas the
Packit aea12f
   <ctype.h> functions' behaviour depends on the current locale set via
Packit aea12f
   setlocale.
Packit aea12f
Packit Service 991b93
   Copyright (C) 2000-2003, 2006, 2008-2020 Free Software Foundation, Inc.
Packit aea12f
Packit aea12f
This program is free software; you can redistribute it and/or modify
Packit aea12f
it under the terms of the GNU General Public License as published by
Packit aea12f
the Free Software Foundation; either version 3 of the License, or
Packit aea12f
(at your option) any later version.
Packit aea12f
Packit aea12f
This program is distributed in the hope that it will be useful,
Packit aea12f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit aea12f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit aea12f
GNU General Public License for more details.
Packit aea12f
Packit aea12f
You should have received a copy of the GNU General Public License
Packit aea12f
along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Packit aea12f
Packit aea12f
#ifndef C_CTYPE_H
Packit aea12f
#define C_CTYPE_H
Packit aea12f
Packit aea12f
#include <stdbool.h>
Packit aea12f
Packit aea12f
#ifndef _GL_INLINE_HEADER_BEGIN
Packit aea12f
 #error "Please include config.h first."
Packit aea12f
#endif
Packit aea12f
_GL_INLINE_HEADER_BEGIN
Packit aea12f
#ifndef C_CTYPE_INLINE
Packit aea12f
# define C_CTYPE_INLINE _GL_INLINE
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#ifdef __cplusplus
Packit aea12f
extern "C" {
Packit aea12f
#endif
Packit aea12f
Packit aea12f
Packit aea12f
/* The functions defined in this file assume the "C" locale and a character
Packit aea12f
   set without diacritics (ASCII-US or EBCDIC-US or something like that).
Packit aea12f
   Even if the "C" locale on a particular system is an extension of the ASCII
Packit aea12f
   character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
Packit aea12f
   is ISO-8859-1), the functions in this file recognize only the ASCII
Packit aea12f
   characters.  */
Packit aea12f
Packit aea12f
Packit aea12f
#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
Packit aea12f
    && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
Packit aea12f
    && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
Packit aea12f
    && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
Packit aea12f
    && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
Packit aea12f
    && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
Packit aea12f
    && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
Packit aea12f
    && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
Packit aea12f
    && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
Packit aea12f
    && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
Packit aea12f
    && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
Packit aea12f
    && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
Packit aea12f
    && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
Packit aea12f
    && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
Packit aea12f
    && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
Packit aea12f
    && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
Packit aea12f
    && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
Packit aea12f
    && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
Packit aea12f
    && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
Packit aea12f
    && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
Packit aea12f
    && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
Packit aea12f
    && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
Packit aea12f
    && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
Packit aea12f
/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
Packit aea12f
   Testing the value of '\n' and '\r' is not relevant.  */
Packit aea12f
# define C_CTYPE_ASCII 1
Packit aea12f
#elif ! (' ' == '\x40' && '0' == '\xf0'                     \
Packit aea12f
         && 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \
Packit aea12f
         && 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2')
Packit aea12f
# error "Only ASCII and EBCDIC are supported"
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#if 'A' < 0
Packit aea12f
# error "EBCDIC and char is signed -- not supported"
Packit aea12f
#endif
Packit aea12f
Packit aea12f
/* Cases for control characters.  */
Packit aea12f
Packit aea12f
#define _C_CTYPE_CNTRL \
Packit aea12f
   case '\a': case '\b': case '\f': case '\n': \
Packit aea12f
   case '\r': case '\t': case '\v': \
Packit aea12f
   _C_CTYPE_OTHER_CNTRL
Packit aea12f
Packit aea12f
/* ASCII control characters other than those with \-letter escapes.  */
Packit aea12f
Packit aea12f
#if C_CTYPE_ASCII
Packit aea12f
# define _C_CTYPE_OTHER_CNTRL \
Packit aea12f
    case '\x00': case '\x01': case '\x02': case '\x03': \
Packit aea12f
    case '\x04': case '\x05': case '\x06': case '\x0e': \
Packit aea12f
    case '\x0f': case '\x10': case '\x11': case '\x12': \
Packit aea12f
    case '\x13': case '\x14': case '\x15': case '\x16': \
Packit aea12f
    case '\x17': case '\x18': case '\x19': case '\x1a': \
Packit aea12f
    case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
Packit aea12f
    case '\x1f': case '\x7f'
Packit aea12f
#else
Packit aea12f
   /* Use EBCDIC code page 1047's assignments for ASCII control chars;
Packit aea12f
      assume all EBCDIC code pages agree about these assignments.  */
Packit aea12f
# define _C_CTYPE_OTHER_CNTRL \
Packit aea12f
    case '\x00': case '\x01': case '\x02': case '\x03': \
Packit aea12f
    case '\x07': case '\x0e': case '\x0f': case '\x10': \
Packit aea12f
    case '\x11': case '\x12': case '\x13': case '\x18': \
Packit aea12f
    case '\x19': case '\x1c': case '\x1d': case '\x1e': \
Packit aea12f
    case '\x1f': case '\x26': case '\x27': case '\x2d': \
Packit aea12f
    case '\x2e': case '\x32': case '\x37': case '\x3c': \
Packit aea12f
    case '\x3d': case '\x3f'
Packit aea12f
#endif
Packit aea12f
Packit aea12f
/* Cases for lowercase hex letters, and lowercase letters, all offset by N.  */
Packit aea12f
Packit aea12f
#define _C_CTYPE_LOWER_A_THRU_F_N(N) \
Packit aea12f
   case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \
Packit aea12f
   case 'e' + (N): case 'f' + (N)
Packit aea12f
#define _C_CTYPE_LOWER_N(N) \
Packit aea12f
   _C_CTYPE_LOWER_A_THRU_F_N(N): \
Packit aea12f
   case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \
Packit aea12f
   case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \
Packit aea12f
   case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \
Packit aea12f
   case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \
Packit aea12f
   case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N)
Packit aea12f
Packit aea12f
/* Cases for hex letters, digits, lower, punct, and upper.  */
Packit aea12f
Packit aea12f
#define _C_CTYPE_A_THRU_F \
Packit aea12f
   _C_CTYPE_LOWER_A_THRU_F_N (0): \
Packit aea12f
   _C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a')
Packit aea12f
#define _C_CTYPE_DIGIT                     \
Packit aea12f
   case '0': case '1': case '2': case '3': \
Packit aea12f
   case '4': case '5': case '6': case '7': \
Packit aea12f
   case '8': case '9'
Packit aea12f
#define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0)
Packit aea12f
#define _C_CTYPE_PUNCT \
Packit aea12f
   case '!': case '"': case '#': case '$':  \
Packit aea12f
   case '%': case '&': case '\'': case '(': \
Packit aea12f
   case ')': case '*': case '+': case ',':  \
Packit aea12f
   case '-': case '.': case '/': case ':':  \
Packit aea12f
   case ';': case '<': case '=': case '>':  \
Packit aea12f
   case '?': case '@': case '[': case '\\': \
Packit aea12f
   case ']': case '^': case '_': case '`':  \
Packit aea12f
   case '{': case '|': case '}': case '~'
Packit aea12f
#define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a')
Packit aea12f
Packit aea12f
Packit aea12f
/* Function definitions.  */
Packit aea12f
Packit aea12f
/* Unlike the functions in <ctype.h>, which require an argument in the range
Packit aea12f
   of the 'unsigned char' type, the functions here operate on values that are
Packit aea12f
   in the 'unsigned char' range or in the 'char' range.  In other words,
Packit aea12f
   when you have a 'char' value, you need to cast it before using it as
Packit aea12f
   argument to a <ctype.h> function:
Packit aea12f
Packit aea12f
         const char *s = ...;
Packit aea12f
         if (isalpha ((unsigned char) *s)) ...
Packit aea12f
Packit aea12f
   but you don't need to cast it for the functions defined in this file:
Packit aea12f
Packit aea12f
         const char *s = ...;
Packit aea12f
         if (c_isalpha (*s)) ...
Packit aea12f
 */
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isalnum (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isalpha (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
/* The function isascii is not locale dependent.
Packit aea12f
   Its use in EBCDIC is questionable. */
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isascii (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    case ' ':
Packit aea12f
    _C_CTYPE_CNTRL:
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
    _C_CTYPE_PUNCT:
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isblank (int c)
Packit aea12f
{
Packit aea12f
  return c == ' ' || c == '\t';
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_iscntrl (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_CNTRL:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isdigit (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isgraph (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
    _C_CTYPE_PUNCT:
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_islower (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isprint (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    case ' ':
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
    _C_CTYPE_PUNCT:
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_ispunct (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_PUNCT:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isspace (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isupper (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE bool
Packit aea12f
c_isxdigit (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_DIGIT:
Packit aea12f
    _C_CTYPE_A_THRU_F:
Packit aea12f
      return true;
Packit aea12f
    default:
Packit aea12f
      return false;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE int
Packit aea12f
c_tolower (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_UPPER:
Packit aea12f
      return c - 'A' + 'a';
Packit aea12f
    default:
Packit aea12f
      return c;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
C_CTYPE_INLINE int
Packit aea12f
c_toupper (int c)
Packit aea12f
{
Packit aea12f
  switch (c)
Packit aea12f
    {
Packit aea12f
    _C_CTYPE_LOWER:
Packit aea12f
      return c - 'a' + 'A';
Packit aea12f
    default:
Packit aea12f
      return c;
Packit aea12f
    }
Packit aea12f
}
Packit aea12f
Packit aea12f
#ifdef __cplusplus
Packit aea12f
}
Packit aea12f
#endif
Packit aea12f
Packit aea12f
_GL_INLINE_HEADER_END
Packit aea12f
Packit aea12f
#endif /* C_CTYPE_H */