Blame lib/c-ctype.h

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