]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/nvi/common/multibyte.h
MFV r368746:
[FreeBSD/FreeBSD.git] / contrib / nvi / common / multibyte.h
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
118 isatoz(CHAR_T c)
119 {
120         return 'a' <= c && c <= 'z';
121 }
122
123 static __inline int
124 isAtoZ(CHAR_T c)
125 {
126         return 'A' <= c && c <= 'Z';
127 }
128
129 static __inline int
130 is0to9(CHAR_T c)
131 {
132         return '0' <= c && c <= '9';
133 }
134
135 static __inline int
136 isazAZ(CHAR_T c)
137 {
138         return isatoz(c) || isAtoZ(c);
139 }
140
141 static __inline int
142 is09azAZ(CHAR_T c)
143 {
144         return is0to9(c) || isazAZ(c);
145 }
146
147 #endif