1 /* @(#)wchar.h	1.21 11/07/19 Copyright 2007-2011 J. Schilling */
2 /*
3  *	Abstraction from wchar.h
4  *
5  *	Copyright (c) 2007-2011 J. Schilling
6  */
7 /*
8  * The contents of this file are subject to the terms of the
9  * Common Development and Distribution License, Version 1.0 only
10  * (the "License").  You may not use this file except in compliance
11  * with the License.
12  *
13  * See the file CDDL.Schily.txt in this distribution for details.
14  *
15  * When distributing Covered Code, include this CDDL HEADER in each
16  * file and include the License file CDDL.Schily.txt from this distribution.
17  */
18 
19 #ifndef _SCHILY_WCHAR_H
20 #define	_SCHILY_WCHAR_H
21 
22 #ifndef	_SCHILY_MCONFIG_H
23 #include <schily/mconfig.h>
24 #endif
25 
26 #ifndef	_SCHILY_STDLIB_H
27 #include <schily/stdlib.h>	/* for MB_CUR_MAX, mbtowc()/wctomb() */
28 #endif
29 #ifndef	_SCHILY_TYPES_H
30 #include <schily/types.h>
31 #endif
32 #ifdef	HAVE_STDDEF_H
33 #ifndef	_INCL_STDDEF_H
34 #include <stddef.h>		/* Needed for e.g. size_t (POSIX)  */
35 #define	_INCL_STDDEF_H
36 #endif
37 #endif
38 #ifndef _SCHILY_STDIO_H
39 #include <schily/stdio.h>	/* Needed for e.g. FILE (POSIX)	   */
40 #endif
41 #ifndef	_SCHILY_VARARGS_H
42 #include <schily/varargs.h>	/* Needed for e.g. va_list (POSIX) */
43 #endif
44 
45 
46 #if	!defined(HAVE_MBTOWC) || !defined(HAVE_WCTOMB)
47 #if	defined(HAVE_MBRTOWC) && defined(HAVE_WCRTOMB)
48 #	define	mbtowc(wp, cp, len)	mbrtowc(wp, cp, len, (mbstate_t *)0)
49 #	define	wctomb(cp, wc)		wcrtomb(cp, wc, (mbstate_t *)0)
50 #else
51 #	define	NO_WCHAR
52 #endif
53 #endif
54 
55 #ifdef	HAVE_WCHAR_H
56 
57 #ifndef	_INCL_WCHAR_H
58 #include <wchar.h>
59 #define	_INCL_WCHAR_H
60 #endif
61 
62 #ifndef	HAVE_MBSINIT
63 #define	mbsinit(sp)			((int)((sp) == 0))
64 #endif
65 #ifndef	HAVE_MBRTOWC
66 #define	mbrtowc(wp, cp, len, sp)	mbtowc(wp, cp, len)
67 #endif
68 #ifndef	HAVE_WCRTOMB
69 #define	wcrtomb(cp, wc, sp)		wctomb(cp, wc)
70 #endif
71 
72 #ifndef	USE_WCHAR
73 #define	USE_WCHAR
74 #endif
75 
76 #else	/* HAVE_WCHAR_H */
77 
78 #undef	USE_WCHAR
79 #endif	/* !HAVE_WCHAR_H */
80 
81 #if	!defined(HAVE_WCTYPE_H) && !defined(HAVE_ISWPRINT)
82 #undef	USE_WCHAR
83 #undef	USE_WCTYPE
84 #endif
85 
86 #ifdef	NO_WCTYPE
87 #undef	USE_WCHAR
88 #undef	USE_WCTYPE
89 #endif
90 
91 #ifdef	NO_WCHAR
92 #undef	USE_WCHAR
93 #undef	USE_WCTYPE
94 #endif
95 
96 #ifndef	USE_WCHAR
97 
98 /*
99  * We either don't have wide chars or we don't use them...
100  */
101 #undef	wchar_t
102 #define	wchar_t	char
103 #undef	wint_t
104 #define	wint_t	int
105 /*
106  * We cannot define wctype_t here because of a bug in Linux (missing xctype_t
107  * definition in wchar.h
108  */
109 #ifdef	__never__
110 #undef	wctype_t
111 #define	wctype_t	int
112 #endif
113 
114 #undef	WEOF
115 #define	WEOF	((wint_t)-1)
116 
117 #ifndef	_SCHILY_UTYPES_H
118 #include <schily/utypes.h>	/* For TYPE_MAXVAL() */
119 #endif
120 
121 #undef	WCHAR_MAX
122 #define	WCHAR_MAX	TYPE_MAXVAL(wchar_t)
123 #undef	WCHAR_MIN
124 #define	WCHAR_MIN	TYPE_MINVAL(wchar_t)
125 
126 #undef	WINT_MAX
127 #define	WINT_MAX	TYPE_MAXVAL(wint_t)
128 #undef	WINT_MIN
129 #define	WINT_MIN	TYPE_MINVAL(wint_t)
130 
131 #undef	WCTYPE_MAX
132 #define	WCTYPE_MAX	TYPE_MAXVAL(wctype_t)
133 #undef	WCTYPE_MIN
134 #define	WCTYPE_MIN	TYPE_MINVAL(wctype_t)
135 
136 #undef	SIZEOF_WCHAR_T
137 #define	SIZEOF_WCHAR_T	SIZEOF_CHAR
138 
139 #undef	MB_CUR_MAX
140 #define	MB_CUR_MAX	1
141 #undef	MB_LEN_MAX
142 #define	MB_LEN_MAX	1
143 
144 /*
145  * The mbtowc() for the non-multibyte case could be as simple as
146  *
147  * #define	mbtowc(wp, cp, len)	(*(wp) = *(cp), 1)
148  *
149  * but Mac OS X forces us to do many mbtowc(NULL, NULL, 0) calls in order
150  * to reset the internal state. On other platforms that do not support
151  * wide chars, NULL may be defined as (void *)0, so we need to check
152  * for "wp" != NULL and to cast "wp" and "cp" to their expected types.
153  */
154 #undef	mbtowc
155 #define	mbtowc(wp, cp, len)	((void)((wp) ? \
156 				*(wchar_t *)(wp) = *(char *)(cp) : 1), 1)
157 #undef	mbrtowc
158 #define	mbrtowc(wp, cp, len, sp) ((void)((wp) ? \
159 				*(wchar_t *)(wp) = *(char *)(cp) : 1), 1)
160 #undef	wctomb
161 #define	wctomb(cp, wc)		(*(cp) = wc, 1)
162 #undef	wcrtomb
163 #define	wcrtomb(cp, wc, sp)	(*(cp) = wc, 1)
164 
165 #undef	mbsinit
166 #define	mbsinit(sp)		((int)((sp) == 0))
167 
168 #undef	wcwidth
169 #define	wcwidth(wc)		(1)
170 
171 #else	/* USE_WCHAR */
172 
173 #ifndef	HAVE_WCWIDTH
174 #undef	wcwidth
175 #define	wcwidth(wc)		(1)
176 #endif
177 
178 #endif	/* USE_WCHAR */
179 
180 #endif	/* _SCHILY_WCHAR_H */
181