Blame gettext-tools/libgettextpo/c-ctype.h

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