xref: /dflybsd-src/contrib/grep/lib/mbchar.h (revision 91b9ed38d3db6a8a8ac5b66da1d43e6e331e259a)
195b7b453SJohn Marino /* Multibyte character data type.
2*09d4459fSDaniel Fojt    Copyright (C) 2001, 2005-2007, 2009-2020 Free Software Foundation, Inc.
395b7b453SJohn Marino 
495b7b453SJohn Marino    This program is free software: you can redistribute it and/or modify
595b7b453SJohn Marino    it under the terms of the GNU General Public License as published by
695b7b453SJohn Marino    the Free Software Foundation; either version 3 of the License, or
795b7b453SJohn Marino    (at your option) any later version.
895b7b453SJohn Marino 
995b7b453SJohn Marino    This program is distributed in the hope that it will be useful,
1095b7b453SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
1195b7b453SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1295b7b453SJohn Marino    GNU General Public License for more details.
1395b7b453SJohn Marino 
1495b7b453SJohn Marino    You should have received a copy of the GNU General Public License
15*09d4459fSDaniel Fojt    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
1695b7b453SJohn Marino 
1795b7b453SJohn Marino /* Written by Bruno Haible <bruno@clisp.org>.  */
1895b7b453SJohn Marino 
1995b7b453SJohn Marino /* A multibyte character is a short subsequence of a char* string,
2095b7b453SJohn Marino    representing a single wide character.
2195b7b453SJohn Marino 
2295b7b453SJohn Marino    We use multibyte characters instead of wide characters because of
2395b7b453SJohn Marino    the following goals:
2495b7b453SJohn Marino    1) correct multibyte handling, i.e. operate according to the LC_CTYPE
2595b7b453SJohn Marino       locale,
2695b7b453SJohn Marino    2) ease of maintenance, i.e. the maintainer needs not know all details
2795b7b453SJohn Marino       of the ISO C 99 standard,
2895b7b453SJohn Marino    3) don't fail grossly if the input is not in the encoding set by the
2995b7b453SJohn Marino       locale, because often different encodings are in use in the same
3095b7b453SJohn Marino       countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...),
3195b7b453SJohn Marino    4) fast in the case of ASCII characters,
3295b7b453SJohn Marino    5) portability, i.e. don't make unportable assumptions about wchar_t.
3395b7b453SJohn Marino 
3495b7b453SJohn Marino    Multibyte characters are only accessed through the mb* macros.
3595b7b453SJohn Marino 
3695b7b453SJohn Marino    mb_ptr (mbc)
3795b7b453SJohn Marino      return a pointer to the beginning of the multibyte sequence.
3895b7b453SJohn Marino 
3995b7b453SJohn Marino    mb_len (mbc)
4095b7b453SJohn Marino      returns the number of bytes occupied by the multibyte sequence.
4195b7b453SJohn Marino      Always > 0.
4295b7b453SJohn Marino 
4395b7b453SJohn Marino    mb_iseq (mbc, sc)
4495b7b453SJohn Marino      returns true if mbc is the standard ASCII character sc.
4595b7b453SJohn Marino 
4695b7b453SJohn Marino    mb_isnul (mbc)
4795b7b453SJohn Marino      returns true if mbc is the nul character.
4895b7b453SJohn Marino 
4995b7b453SJohn Marino    mb_cmp (mbc1, mbc2)
5095b7b453SJohn Marino      returns a positive, zero, or negative value depending on whether mbc1
5195b7b453SJohn Marino      sorts after, same or before mbc2.
5295b7b453SJohn Marino 
5395b7b453SJohn Marino    mb_casecmp (mbc1, mbc2)
5495b7b453SJohn Marino      returns a positive, zero, or negative value depending on whether mbc1
5595b7b453SJohn Marino      sorts after, same or before mbc2, modulo upper/lowercase conversion.
5695b7b453SJohn Marino 
5795b7b453SJohn Marino    mb_equal (mbc1, mbc2)
5895b7b453SJohn Marino      returns true if mbc1 and mbc2 are equal.
5995b7b453SJohn Marino 
6095b7b453SJohn Marino    mb_caseequal (mbc1, mbc2)
6195b7b453SJohn Marino      returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion.
6295b7b453SJohn Marino 
6395b7b453SJohn Marino    mb_isalnum (mbc)
6495b7b453SJohn Marino      returns true if mbc is alphanumeric.
6595b7b453SJohn Marino 
6695b7b453SJohn Marino    mb_isalpha (mbc)
6795b7b453SJohn Marino      returns true if mbc is alphabetic.
6895b7b453SJohn Marino 
6995b7b453SJohn Marino    mb_isascii(mbc)
7095b7b453SJohn Marino      returns true if mbc is plain ASCII.
7195b7b453SJohn Marino 
7295b7b453SJohn Marino    mb_isblank (mbc)
7395b7b453SJohn Marino      returns true if mbc is a blank.
7495b7b453SJohn Marino 
7595b7b453SJohn Marino    mb_iscntrl (mbc)
7695b7b453SJohn Marino      returns true if mbc is a control character.
7795b7b453SJohn Marino 
7895b7b453SJohn Marino    mb_isdigit (mbc)
7995b7b453SJohn Marino      returns true if mbc is a decimal digit.
8095b7b453SJohn Marino 
8195b7b453SJohn Marino    mb_isgraph (mbc)
8295b7b453SJohn Marino      returns true if mbc is a graphic character.
8395b7b453SJohn Marino 
8495b7b453SJohn Marino    mb_islower (mbc)
8595b7b453SJohn Marino      returns true if mbc is lowercase.
8695b7b453SJohn Marino 
8795b7b453SJohn Marino    mb_isprint (mbc)
8895b7b453SJohn Marino      returns true if mbc is a printable character.
8995b7b453SJohn Marino 
9095b7b453SJohn Marino    mb_ispunct (mbc)
9195b7b453SJohn Marino      returns true if mbc is a punctuation character.
9295b7b453SJohn Marino 
9395b7b453SJohn Marino    mb_isspace (mbc)
9495b7b453SJohn Marino      returns true if mbc is a space character.
9595b7b453SJohn Marino 
9695b7b453SJohn Marino    mb_isupper (mbc)
9795b7b453SJohn Marino      returns true if mbc is uppercase.
9895b7b453SJohn Marino 
9995b7b453SJohn Marino    mb_isxdigit (mbc)
10095b7b453SJohn Marino      returns true if mbc is a hexadecimal digit.
10195b7b453SJohn Marino 
10295b7b453SJohn Marino    mb_width (mbc)
10395b7b453SJohn Marino      returns the number of columns on the output device occupied by mbc.
10495b7b453SJohn Marino      Always >= 0.
10595b7b453SJohn Marino 
10695b7b453SJohn Marino    mb_putc (mbc, stream)
10795b7b453SJohn Marino      outputs mbc on stream, a byte oriented FILE stream opened for output.
10895b7b453SJohn Marino 
10995b7b453SJohn Marino    mb_setascii (&mbc, sc)
11095b7b453SJohn Marino      assigns the standard ASCII character sc to mbc.
11195b7b453SJohn Marino 
11295b7b453SJohn Marino    mb_copy (&destmbc, &srcmbc)
11395b7b453SJohn Marino      copies srcmbc to destmbc.
11495b7b453SJohn Marino 
11595b7b453SJohn Marino    Here are the function prototypes of the macros.
11695b7b453SJohn Marino 
11795b7b453SJohn Marino    extern const char *  mb_ptr (const mbchar_t mbc);
11895b7b453SJohn Marino    extern size_t        mb_len (const mbchar_t mbc);
11995b7b453SJohn Marino    extern bool          mb_iseq (const mbchar_t mbc, char sc);
12095b7b453SJohn Marino    extern bool          mb_isnul (const mbchar_t mbc);
12195b7b453SJohn Marino    extern int           mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2);
12295b7b453SJohn Marino    extern int           mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2);
12395b7b453SJohn Marino    extern bool          mb_equal (const mbchar_t mbc1, const mbchar_t mbc2);
12495b7b453SJohn Marino    extern bool          mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2);
12595b7b453SJohn Marino    extern bool          mb_isalnum (const mbchar_t mbc);
12695b7b453SJohn Marino    extern bool          mb_isalpha (const mbchar_t mbc);
12795b7b453SJohn Marino    extern bool          mb_isascii (const mbchar_t mbc);
12895b7b453SJohn Marino    extern bool          mb_isblank (const mbchar_t mbc);
12995b7b453SJohn Marino    extern bool          mb_iscntrl (const mbchar_t mbc);
13095b7b453SJohn Marino    extern bool          mb_isdigit (const mbchar_t mbc);
13195b7b453SJohn Marino    extern bool          mb_isgraph (const mbchar_t mbc);
13295b7b453SJohn Marino    extern bool          mb_islower (const mbchar_t mbc);
13395b7b453SJohn Marino    extern bool          mb_isprint (const mbchar_t mbc);
13495b7b453SJohn Marino    extern bool          mb_ispunct (const mbchar_t mbc);
13595b7b453SJohn Marino    extern bool          mb_isspace (const mbchar_t mbc);
13695b7b453SJohn Marino    extern bool          mb_isupper (const mbchar_t mbc);
13795b7b453SJohn Marino    extern bool          mb_isxdigit (const mbchar_t mbc);
13895b7b453SJohn Marino    extern int           mb_width (const mbchar_t mbc);
13995b7b453SJohn Marino    extern void          mb_putc (const mbchar_t mbc, FILE *stream);
14095b7b453SJohn Marino    extern void          mb_setascii (mbchar_t *new, char sc);
14195b7b453SJohn Marino    extern void          mb_copy (mbchar_t *new, const mbchar_t *old);
14295b7b453SJohn Marino  */
14395b7b453SJohn Marino 
14495b7b453SJohn Marino #ifndef _MBCHAR_H
14595b7b453SJohn Marino #define _MBCHAR_H 1
14695b7b453SJohn Marino 
14795b7b453SJohn Marino #include <stdbool.h>
14895b7b453SJohn Marino #include <string.h>
14995b7b453SJohn Marino 
15095b7b453SJohn Marino /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
15195b7b453SJohn Marino    <wchar.h>.
15295b7b453SJohn Marino    BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
15395b7b453SJohn Marino    <wchar.h>.  */
15495b7b453SJohn Marino #include <stdio.h>
15595b7b453SJohn Marino #include <time.h>
15695b7b453SJohn Marino #include <wchar.h>
15795b7b453SJohn Marino #include <wctype.h>
15895b7b453SJohn Marino 
159680a9cb8SJohn Marino #ifndef _GL_INLINE_HEADER_BEGIN
160680a9cb8SJohn Marino  #error "Please include config.h first."
161680a9cb8SJohn Marino #endif
162680a9cb8SJohn Marino _GL_INLINE_HEADER_BEGIN
163680a9cb8SJohn Marino #ifndef MBCHAR_INLINE
164680a9cb8SJohn Marino # define MBCHAR_INLINE _GL_INLINE
165680a9cb8SJohn Marino #endif
166680a9cb8SJohn Marino 
16795b7b453SJohn Marino #define MBCHAR_BUF_SIZE 24
16895b7b453SJohn Marino 
16995b7b453SJohn Marino struct mbchar
17095b7b453SJohn Marino {
17195b7b453SJohn Marino   const char *ptr;      /* pointer to current character */
17295b7b453SJohn Marino   size_t bytes;         /* number of bytes of current character, > 0 */
17395b7b453SJohn Marino   bool wc_valid;        /* true if wc is a valid wide character */
17495b7b453SJohn Marino   wchar_t wc;           /* if wc_valid: the current character */
17595b7b453SJohn Marino   char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */
17695b7b453SJohn Marino };
17795b7b453SJohn Marino 
17895b7b453SJohn Marino /* EOF (not a real character) is represented with bytes = 0 and
17995b7b453SJohn Marino    wc_valid = false.  */
18095b7b453SJohn Marino 
18195b7b453SJohn Marino typedef struct mbchar mbchar_t;
18295b7b453SJohn Marino 
18395b7b453SJohn Marino /* Access the current character.  */
18495b7b453SJohn Marino #define mb_ptr(mbc) ((mbc).ptr)
18595b7b453SJohn Marino #define mb_len(mbc) ((mbc).bytes)
18695b7b453SJohn Marino 
18795b7b453SJohn Marino /* Comparison of characters.  */
18895b7b453SJohn Marino #define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
18995b7b453SJohn Marino #define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
19095b7b453SJohn Marino #define mb_cmp(mbc1, mbc2) \
19195b7b453SJohn Marino   ((mbc1).wc_valid                                                      \
19295b7b453SJohn Marino    ? ((mbc2).wc_valid                                                   \
19395b7b453SJohn Marino       ? (int) (mbc1).wc - (int) (mbc2).wc                               \
19495b7b453SJohn Marino       : -1)                                                             \
19595b7b453SJohn Marino    : ((mbc2).wc_valid                                                   \
19695b7b453SJohn Marino       ? 1                                                               \
19795b7b453SJohn Marino       : (mbc1).bytes == (mbc2).bytes                                    \
19895b7b453SJohn Marino         ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes)                 \
19995b7b453SJohn Marino         : (mbc1).bytes < (mbc2).bytes                                   \
20095b7b453SJohn Marino           ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
20195b7b453SJohn Marino           : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
20295b7b453SJohn Marino #define mb_casecmp(mbc1, mbc2) \
20395b7b453SJohn Marino   ((mbc1).wc_valid                                                      \
20495b7b453SJohn Marino    ? ((mbc2).wc_valid                                                   \
20595b7b453SJohn Marino       ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc)         \
20695b7b453SJohn Marino       : -1)                                                             \
20795b7b453SJohn Marino    : ((mbc2).wc_valid                                                   \
20895b7b453SJohn Marino       ? 1                                                               \
20995b7b453SJohn Marino       : (mbc1).bytes == (mbc2).bytes                                    \
21095b7b453SJohn Marino         ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes)                 \
21195b7b453SJohn Marino         : (mbc1).bytes < (mbc2).bytes                                   \
21295b7b453SJohn Marino           ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
21395b7b453SJohn Marino           : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
21495b7b453SJohn Marino #define mb_equal(mbc1, mbc2) \
21595b7b453SJohn Marino   ((mbc1).wc_valid && (mbc2).wc_valid                                   \
21695b7b453SJohn Marino    ? (mbc1).wc == (mbc2).wc                                             \
21795b7b453SJohn Marino    : (mbc1).bytes == (mbc2).bytes                                       \
21895b7b453SJohn Marino      && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
21995b7b453SJohn Marino #define mb_caseequal(mbc1, mbc2) \
22095b7b453SJohn Marino   ((mbc1).wc_valid && (mbc2).wc_valid                                   \
22195b7b453SJohn Marino    ? towlower ((mbc1).wc) == towlower ((mbc2).wc)                       \
22295b7b453SJohn Marino    : (mbc1).bytes == (mbc2).bytes                                       \
22395b7b453SJohn Marino      && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
22495b7b453SJohn Marino 
22595b7b453SJohn Marino /* <ctype.h>, <wctype.h> classification.  */
22695b7b453SJohn Marino #define mb_isascii(mbc) \
22795b7b453SJohn Marino   ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
22895b7b453SJohn Marino #define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
22995b7b453SJohn Marino #define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
23095b7b453SJohn Marino #define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
23195b7b453SJohn Marino #define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
23295b7b453SJohn Marino #define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
23395b7b453SJohn Marino #define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
23495b7b453SJohn Marino #define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
23595b7b453SJohn Marino #define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
23695b7b453SJohn Marino #define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
23795b7b453SJohn Marino #define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
23895b7b453SJohn Marino #define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
23995b7b453SJohn Marino #define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
24095b7b453SJohn Marino 
24195b7b453SJohn Marino /* Extra <wchar.h> function.  */
24295b7b453SJohn Marino 
24395b7b453SJohn Marino /* Unprintable characters appear as a small box of width 1.  */
24495b7b453SJohn Marino #define MB_UNPRINTABLE_WIDTH 1
24595b7b453SJohn Marino 
246680a9cb8SJohn Marino MBCHAR_INLINE int
mb_width_aux(wint_t wc)24795b7b453SJohn Marino mb_width_aux (wint_t wc)
24895b7b453SJohn Marino {
24995b7b453SJohn Marino   int w = wcwidth (wc);
25095b7b453SJohn Marino   /* For unprintable characters, arbitrarily return 0 for control characters
25195b7b453SJohn Marino      and MB_UNPRINTABLE_WIDTH otherwise.  */
25295b7b453SJohn Marino   return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
25395b7b453SJohn Marino }
25495b7b453SJohn Marino 
25595b7b453SJohn Marino #define mb_width(mbc) \
25695b7b453SJohn Marino   ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
25795b7b453SJohn Marino 
25895b7b453SJohn Marino /* Output.  */
25995b7b453SJohn Marino #define mb_putc(mbc, stream)  fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
26095b7b453SJohn Marino 
26195b7b453SJohn Marino /* Assignment.  */
26295b7b453SJohn Marino #define mb_setascii(mbc, sc) \
26395b7b453SJohn Marino   ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
26495b7b453SJohn Marino    (mbc)->wc = (mbc)->buf[0] = (sc))
26595b7b453SJohn Marino 
26695b7b453SJohn Marino /* Copying a character.  */
267680a9cb8SJohn Marino MBCHAR_INLINE void
mb_copy(mbchar_t * new_mbc,const mbchar_t * old_mbc)26895b7b453SJohn Marino mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
26995b7b453SJohn Marino {
27095b7b453SJohn Marino   if (old_mbc->ptr == &old_mbc->buf[0])
27195b7b453SJohn Marino     {
27295b7b453SJohn Marino       memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
27395b7b453SJohn Marino       new_mbc->ptr = &new_mbc->buf[0];
27495b7b453SJohn Marino     }
27595b7b453SJohn Marino   else
27695b7b453SJohn Marino     new_mbc->ptr = old_mbc->ptr;
27795b7b453SJohn Marino   new_mbc->bytes = old_mbc->bytes;
27895b7b453SJohn Marino   if ((new_mbc->wc_valid = old_mbc->wc_valid))
27995b7b453SJohn Marino     new_mbc->wc = old_mbc->wc;
28095b7b453SJohn Marino }
28195b7b453SJohn Marino 
28295b7b453SJohn Marino 
28395b7b453SJohn Marino /* is_basic(c) tests whether the single-byte character c is in the
28495b7b453SJohn Marino    ISO C "basic character set".
28595b7b453SJohn Marino    This is a convenience function, and is in this file only to share code
28695b7b453SJohn Marino    between mbiter_multi.h and mbfile_multi.h.  */
28795b7b453SJohn Marino #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
28895b7b453SJohn Marino     && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
28995b7b453SJohn Marino     && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
29095b7b453SJohn Marino     && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
29195b7b453SJohn Marino     && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
29295b7b453SJohn Marino     && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
29395b7b453SJohn Marino     && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
29495b7b453SJohn Marino     && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
29595b7b453SJohn Marino     && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
29695b7b453SJohn Marino     && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
29795b7b453SJohn Marino     && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
29895b7b453SJohn Marino     && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
29995b7b453SJohn Marino     && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
30095b7b453SJohn Marino     && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
30195b7b453SJohn Marino     && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
30295b7b453SJohn Marino     && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
30395b7b453SJohn Marino     && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
30495b7b453SJohn Marino     && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
30595b7b453SJohn Marino     && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
30695b7b453SJohn Marino     && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
30795b7b453SJohn Marino     && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
30895b7b453SJohn Marino     && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
30995b7b453SJohn Marino     && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
31095b7b453SJohn Marino /* The character set is ISO-646, not EBCDIC. */
31195b7b453SJohn Marino # define IS_BASIC_ASCII 1
31295b7b453SJohn Marino 
31395b7b453SJohn Marino extern const unsigned int is_basic_table[];
31495b7b453SJohn Marino 
315680a9cb8SJohn Marino MBCHAR_INLINE bool
is_basic(char c)31695b7b453SJohn Marino is_basic (char c)
31795b7b453SJohn Marino {
31895b7b453SJohn Marino   return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
31995b7b453SJohn Marino          & 1;
32095b7b453SJohn Marino }
32195b7b453SJohn Marino 
32295b7b453SJohn Marino #else
32395b7b453SJohn Marino 
324680a9cb8SJohn Marino MBCHAR_INLINE bool
is_basic(char c)32595b7b453SJohn Marino is_basic (char c)
32695b7b453SJohn Marino {
32795b7b453SJohn Marino   switch (c)
32895b7b453SJohn Marino     {
32995b7b453SJohn Marino     case '\t': case '\v': case '\f':
33095b7b453SJohn Marino     case ' ': case '!': case '"': case '#': case '%':
33195b7b453SJohn Marino     case '&': case '\'': case '(': case ')': case '*':
33295b7b453SJohn Marino     case '+': case ',': case '-': case '.': case '/':
33395b7b453SJohn Marino     case '0': case '1': case '2': case '3': case '4':
33495b7b453SJohn Marino     case '5': case '6': case '7': case '8': case '9':
33595b7b453SJohn Marino     case ':': case ';': case '<': case '=': case '>':
33695b7b453SJohn Marino     case '?':
33795b7b453SJohn Marino     case 'A': case 'B': case 'C': case 'D': case 'E':
33895b7b453SJohn Marino     case 'F': case 'G': case 'H': case 'I': case 'J':
33995b7b453SJohn Marino     case 'K': case 'L': case 'M': case 'N': case 'O':
34095b7b453SJohn Marino     case 'P': case 'Q': case 'R': case 'S': case 'T':
34195b7b453SJohn Marino     case 'U': case 'V': case 'W': case 'X': case 'Y':
34295b7b453SJohn Marino     case 'Z':
34395b7b453SJohn Marino     case '[': case '\\': case ']': case '^': case '_':
34495b7b453SJohn Marino     case 'a': case 'b': case 'c': case 'd': case 'e':
34595b7b453SJohn Marino     case 'f': case 'g': case 'h': case 'i': case 'j':
34695b7b453SJohn Marino     case 'k': case 'l': case 'm': case 'n': case 'o':
34795b7b453SJohn Marino     case 'p': case 'q': case 'r': case 's': case 't':
34895b7b453SJohn Marino     case 'u': case 'v': case 'w': case 'x': case 'y':
34995b7b453SJohn Marino     case 'z': case '{': case '|': case '}': case '~':
35095b7b453SJohn Marino       return 1;
35195b7b453SJohn Marino     default:
35295b7b453SJohn Marino       return 0;
35395b7b453SJohn Marino     }
35495b7b453SJohn Marino }
35595b7b453SJohn Marino 
35695b7b453SJohn Marino #endif
35795b7b453SJohn Marino 
358680a9cb8SJohn Marino _GL_INLINE_HEADER_END
359680a9cb8SJohn Marino 
36095b7b453SJohn Marino #endif /* _MBCHAR_H */
361