xref: /dragonfly/contrib/nvi2/common/multibyte.h (revision 07bc39c2f4bbca56f12568e06d89da17f2eeb965)
1 /*-
2  * Copyright (c) 1992, 1993, 1994
3  *        The Regents of the University of California.  All rights reserved.
4  * Copyright (c) 1992, 1993, 1994, 1995, 1996
5  *        Keith Bostic.  All rights reserved.
6  *
7  * See the LICENSE file for redistribution information.
8  */
9 
10 #ifndef MULTIBYTE_H
11 #define MULTIBYTE_H
12 
13 /*
14  * Fundamental character types.
15  *
16  * CHAR_T An integral type that can hold any character.
17  * ARG_CHAR_T       The type of a CHAR_T when passed as an argument using
18  *                  traditional promotion rules.  It should also be able
19  *                  to be compared against any CHAR_T for equality without
20  *                  problems.
21  * UCHAR_T          The shortest unified character type (8-bit clean).
22  * RCHAR_T          The character type used by the internal regex engine.
23  *
24  * If no integral type can hold a character, don't even try the port.
25  */
26 typedef   int                 ARG_CHAR_T;
27 
28 #ifdef USE_WIDECHAR
29 #include <wchar.h>
30 #include <wctype.h>
31 
32 typedef   wchar_t             CHAR_T;
33 typedef   wint_t              UCHAR_T;
34 typedef wchar_t     RCHAR_T;
35 #define REOF                  WEOF
36 
37 #define STRLEN                wcslen
38 #define STRTOL                wcstol
39 #define STRTOUL               wcstoul
40 #define SPRINTF               swprintf
41 #define STRCMP                wcscmp
42 #define STRPBRK               wcspbrk
43 #define ISBLANK               iswblank
44 #define ISCNTRL               iswcntrl
45 #define ISDIGIT               iswdigit
46 #define ISXDIGIT    iswxdigit
47 #define ISGRAPH               iswgraph
48 #define ISLOWER               iswlower
49 #define ISPRINT               iswprint
50 #define ISPUNCT               iswpunct
51 #define ISSPACE               iswspace
52 #define ISUPPER               iswupper
53 #define TOLOWER               towlower
54 #define TOUPPER               towupper
55 #define STRSET                wmemset
56 #define STRCHR                wcschr
57 #define STRRCHR               wcsrchr
58 #define GETC                  getwc
59 
60 #define L(ch)                 L ## ch
61 #define WS                    "%ls"
62 #define WVS                   "%*ls"
63 #define WC                    "%lc"
64 
65 #else
66 typedef   u_char              CHAR_T;
67 typedef   u_char              UCHAR_T;
68 typedef   char                RCHAR_T;
69 #define REOF                  EOF
70 
71 #define STRLEN                strlen
72 #define STRTOL(a,b,c)         (strtol(a,(char**)b,c))
73 #define STRTOUL(a,b,c)        (strtoul(a,(char**)b,c))
74 #define SPRINTF               snprintf
75 #define STRCMP                strcmp
76 #define STRPBRK               strpbrk
77 #define ISBLANK               isblank
78 #define ISCNTRL               iscntrl
79 #define ISDIGIT               isdigit
80 #define ISXDIGIT    isxdigit
81 #define ISGRAPH               isgraph
82 #define ISLOWER               islower
83 #define ISPRINT               isprint
84 #define ISPUNCT               ispunct
85 #define ISSPACE               isspace
86 #define ISUPPER               isupper
87 #define TOLOWER               tolower
88 #define TOUPPER               toupper
89 #define STRSET                memset
90 #define STRCHR                strchr
91 #define STRRCHR               strrchr
92 #define GETC                  getc
93 
94 #define L(ch)                 ch
95 #define WS                    "%s"
96 #define WVS                   "%*s"
97 #define WC                    "%c"
98 
99 #endif
100 
101 #if defined(USE_WIDECHAR) && defined(DEBUG)
102 #define MEMCPY                          wmemcpy
103 #define MEMMOVE                         wmemmove
104 #define MEMCMP                          wmemcmp
105 #else
106 #define MEMCPY(p, t, len)     memcpy(p, t, (len) * sizeof(CHAR_T))
107 #define MEMMOVE(p, t, len)    memmove(p, t, (len) * sizeof(CHAR_T))
108 #define MEMCMP(p, t, len)     memcmp(p, t, (len) * sizeof(CHAR_T))
109 #endif
110 
111 #define SIZE(w)                         (sizeof(w) / sizeof(*w))
112 
113 /*
114  * Locale insensitive character category detection.
115  */
116 
117 static __inline int
isatoz(CHAR_T c)118 isatoz(CHAR_T c)
119 {
120           return 'a' <= c && c <= 'z';
121 }
122 
123 static __inline int
isAtoZ(CHAR_T c)124 isAtoZ(CHAR_T c)
125 {
126           return 'A' <= c && c <= 'Z';
127 }
128 
129 static __inline int
is0to9(CHAR_T c)130 is0to9(CHAR_T c)
131 {
132           return '0' <= c && c <= '9';
133 }
134 
135 static __inline int
isazAZ(CHAR_T c)136 isazAZ(CHAR_T c)
137 {
138           return isatoz(c) || isAtoZ(c);
139 }
140 
141 static __inline int
is09azAZ(CHAR_T c)142 is09azAZ(CHAR_T c)
143 {
144           return is0to9(c) || isazAZ(c);
145 }
146 
147 #endif
148