xref: /freebsd/contrib/nvi/common/multibyte.h (revision d4eeb02986980bf33dd56c41ceb9fc5f180c0d47)
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
148