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 */
26typedef	int		ARG_CHAR_T;
27
28#ifdef USE_WIDECHAR
29#include <wchar.h>
30#include <wctype.h>
31
32typedef	wchar_t		CHAR_T;
33typedef	wint_t		UCHAR_T;
34typedef 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
66typedef	u_char		CHAR_T;
67typedef	u_char		UCHAR_T;
68typedef	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
117static __inline int
118isatoz(CHAR_T c)
119{
120	return 'a' <= c && c <= 'z';
121}
122
123static __inline int
124isAtoZ(CHAR_T c)
125{
126	return 'A' <= c && c <= 'Z';
127}
128
129static __inline int
130is0to9(CHAR_T c)
131{
132	return '0' <= c && c <= '9';
133}
134
135static __inline int
136isazAZ(CHAR_T c)
137{
138	return isatoz(c) || isAtoZ(c);
139}
140
141static __inline int
142is09azAZ(CHAR_T c)
143{
144	return is0to9(c) || isazAZ(c);
145}
146
147#endif
148