]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/wxchar.h
1. wxMSW seems to work (please test and send your bug reports!)
[wxWidgets.git] / include / wx / wxchar.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: wxchar.h
3// Purpose: Declarations common to wx char/wchar_t usage (wide chars)
4// Author: Joel Farley
5// Modified by:
6// Created: 1998/06/12
7// RCS-ID: $Id$
8// Copyright: (c) wxWindows copyright
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_WXCHAR_H_
13#define _WX_WXCHAR_H_
14
15#ifdef __GNUG__
16#pragma interface "wxchar.h"
17#endif
18
19// only do SBCS or _UNICODE
20#if defined (_MBCS )
21#error "MBCS is not supported by wxChar"
22#endif
23
24// set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined
25#if defined(_UNICODE) || defined(UNICODE)
26#undef wxUSE_UNICODE
27#define wxUSE_UNICODE 1
28#else
29#ifndef wxUSE_UNICODE
30#define wxUSE_UNICODE 0
31#endif
32#endif
33
34// and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1...
35#if wxUSE_UNICODE
36#ifndef _UNICODE
37#define _UNICODE
38#endif
39#ifndef UNICODE
40#define UNICODE
41#endif
42#endif
43
44// Windows (VC++) has broad TCHAR support
45#if defined(__VISUALC__) && defined(__WIN32__)
46
47#define HAVE_WCSLEN 1
48
49#include <tchar.h>
50#if wxUSE_UNICODE // temporary - preserve binary compatibility
51typedef _TCHAR wxChar;
52typedef _TSCHAR wxSChar;
53typedef _TUCHAR wxUChar;
54#else
55#define wxChar char
56#define wxSChar signed char
57#define wxUChar unsigned char
58#endif
59 // wchar_t is available
60#undef wxUSE_WCHAR_T
61#define wxUSE_WCHAR_T 1
62
63 // ctype.h functions
64#define wxIsalnum _istalnum
65#define wxIsalpha _istalpha
66#define wxIsctrl _istctrl
67#define wxIsdigit _istdigit
68#define wxIsgraph _istgraph
69#define wxIslower _istlower
70#define wxIsprint _istprint
71#define wxIspunct _istpunct
72#define wxIsspace _istspace
73#define wxIsupper _istupper
74#define wxIsxdigit _istxdigit
75#define wxTolower _totlower
76#define wxToupper _totupper
77
78 // locale.h functons
79#define wxSetlocale _tsetlocale
80
81 // string.h functions
82#define wxStrcat _tcscat
83#define wxStrchr _tcschr
84#define wxStrcmp _tcscmp
85#define wxStrcoll _tcscoll
86#define wxStrcpy _tcscpy
87#define wxStrcspn _tcscspn
88#define wxStrftime _tcsftime
89#define wxStricmp _tcsicmp
90#define wxStrlen_ _tcslen // used in wxStrlen inline function
91#define wxStrncat _tcsncat
92#define wxStrncmp _tcsncmp
93#define wxStrncpy _tcsncpy
94#define wxStrpbrk _tcspbrk
95#define wxStrrchr _tcsrchr
96#define wxStrspn _tcsspn
97#define wxStrstr _tcsstr
98#define wxStrtod _tcstod
99// is there a _tcstok[_r] ?
100#define wxStrtol _tcstol
101#define wxStrtoul _tcstoul
102#define wxStrxfrm _tcsxfrm
103
104 // stdio.h functions
105#define wxFgetc _fgettc
106#define wxFgetchar _fgettchar
107#define wxFgets _fgetts
108#define wxFopen _tfopen
109#define wxFputc _fputtc
110#define wxFputchar _fputtchar
111#define wxFprintf _ftprintf
112#define wxFreopen _tfreopen
113#define wxFscanf _ftscanf
114#define wxGetc _gettc
115#define wxGetchar _gettchar
116#define wxGets _getts
117#define wxPerror _tperror
118#define wxPrintf _tprintf
119#define wxPutc _puttc
120#define wxPutchar _puttchar
121#define wxPuts _putts
122#define wxRemove _tremove
123#define wxRename _trename
124#define wxScanf _tscanf
125#define wxSprintf _stprintf
126#define wxSscanf _stscanf
127#define wxTmpnam _ttmpnam
128#define wxUngetc _tungetc
129#define wxVfprint _vftprintf
130#define wxVprintf _vtprintf
131#define wxVsscanf _vstscanf
132#define wxVsprintf _vstprintf
133
134 // stdlib.h functions
135#if !wxUSE_UNICODE
136#define wxAtof atof
137#endif
138#define wxAtoi _ttoi
139#define wxAtol _ttol
140#define wxGetenv _tgetenv
141#define wxSystem _tsystem
142
143 // time.h functions
144#define wxAsctime _tasctime
145#define wxCtime _tctime
146
147// #elif defined(XXX)
148 // #include XXX-specific files here
149 // typeddef YYY wxChar;
150
151 // translate wxZZZ names
152
153#elif defined(__BORLANDC__) && defined(__WIN32__)
154
155// Borland C++ 4.52 doesn't have much tchar support
156// maybe Borland C++ 5.02 has, can't check right now
157// but I'll use the Win32 API instead here
158
159#include <tchar.h>
160#if wxUSE_UNICODE // temporary - preserve binary compatibility
161typedef _TCHAR wxChar;
162typedef _TSCHAR wxSChar;
163typedef _TUCHAR wxUChar;
164#else
165#define wxChar char
166#define wxSChar signed char
167#define wxUChar unsigned char
168#endif
169 // wchar_t is available
170#undef wxUSE_WCHAR_T
171#define wxUSE_WCHAR_T 1
172
173#define wxNEED_WX_CTYPE_H
174// #define wxStrtok strtok_r // Borland C++ 4.52 doesn't have strtok_r
175#define wxNEED_WX_STRING_H
176#define wxNEED_WX_STDIO_H
177#define wxNEED_WX_STDLIB_H
178#define wxNEED_WX_TIME_H
179#define wxNEED_WCSLEN
180
181#else//!TCHAR-aware compilers
182
183// check whether we should include wchar.h or equivalent
184#if wxUSE_UNICODE
185 #undef wxUSE_WCHAR_T
186 #define wxUSE_WCHAR_T 1 // wchar_t *must* be available in Unicode mode
187#elif !defined(wxUSE_WCHAR_T)
188 #if defined(__VISUALC__) && (__VISUALC__ < 900)
189 #define wxUSE_WCHAR_T 0 // wchar_t is not available for MSVC++ 1.5
190 #elif defined(__UNIX__)
191 #if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__)
192 #define wxUSE_WCHAR_T 1
193 #else
194 #define wxUSE_WCHAR_T 0
195 #endif
196 #elif defined(__GNUWIN32__) && !defined(__MINGW32__) // Cygwin (not Mingw32) doesn't have wcslen.h, needed in buffer.h
197 #define wxUSE_WCHAR_T 0
198 #else
199 // add additional compiler checks if this fails
200 #define wxUSE_WCHAR_T 1
201 #endif
202#endif//wxUSE_UNICODE
203
204#if wxUSE_WCHAR_T
205 #ifdef HAVE_WCSTR_H
206 #include <wcstr.h>
207 #else
208 #ifndef __FreeBSD__
209 #include <wchar.h>
210 #else
211 #include <stdlib.h>
212 #define wxNEED_WCSLEN
213 #endif
214 #endif
215#endif
216
217// check whether we are doing Unicode
218#if wxUSE_UNICODE
219
220#include <wctype.h>
221
222// this is probably glibc-specific
223#if defined(__WCHAR_TYPE__)
224
225typedef __WCHAR_TYPE__ wxChar;
226typedef signed __WCHAR_TYPE__ wxSChar;
227typedef unsigned __WCHAR_TYPE__ wxUChar;
228
229#define _T(x) L##x
230
231 // ctype.h functions (wctype.h)
232#define wxIsalnum iswalnum
233#define wxIsalpha iswalpha
234#define wxIsctrl iswcntrl
235#define wxIsdigit iswdigit
236#define wxIsgraph iswgraph
237#define wxIslower iswlower
238#define wxIsprint iswprint
239#define wxIspunct iswpunct
240#define wxIsspace iswspace
241#define wxIsupper iswupper
242#define wxIsxdigit iswxdigit
243
244#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)
245 // /usr/include/wctype.h incorrectly declares translations tables which
246 // provokes tons of compile-time warnings - try to correct this
247 #define wxTolower(wc) towctrans((wc), (wctrans_t)__ctype_tolower)
248 #define wxToupper(wc) towctrans((wc), (wctrans_t)__ctype_toupper)
249#else
250 #define wxTolower towlower
251 #define wxToupper towupper
252#endif // gcc/!gcc
253
254 // string.h functions (wchar.h)
255#define wxStrcat wcscat
256#define wxStrchr wcschr
257#define wxStrcmp wcscmp
258#define wxStrcoll wcscoll
259#define wxStrcpy wcscpy
260#define wxStrcspn wcscspn
261#define wxStrlen_ wcslen // used in wxStrlen inline function
262#define wxStrncat wcsncat
263#define wxStrncmp wcsncmp
264#define wxStrncpy wcsncpy
265#define wxStrpbrk wcspbrk
266#define wxStrrchr wcsrchr
267#define wxStrspn wcsspn
268#define wxStrstr wcsstr
269#define wxStrtod wcstod
270#define wxStrtok wcstok
271#define wxStrtol wcstol
272#define wxStrtoul wcstoul
273#define wxStrxfrm wcsxfrm
274
275// glibc doesn't have wc equivalents of the other stuff
276#define wxNEED_WX_STDIO_H
277#define wxNEED_WX_STDLIB_H
278#define wxNEED_WX_TIME_H
279
280#else//!glibc
281#error "Please define your compiler's Unicode conventions in wxChar.h"
282#endif
283#else//!Unicode
284
285#include <ctype.h>
286#include <string.h>
287
288#if 0 // temporary - preserve binary compatibilty
289typedef char wxChar;
290typedef signed char wxSChar;
291typedef unsigned char wxUChar;
292#else
293#define wxChar char
294#define wxSChar signed char
295#define wxUChar unsigned char
296#endif
297
298#ifdef __FreeBSD__
299 #undef _T
300#endif
301#define _T(x) x
302
303 // ctype.h functions
304#define wxIsalnum isalnum
305#define wxIsalpha isalpha
306#define wxIsctrl isctrl
307#define wxIsdigit isdigit
308#define wxIsgraph isgraph
309#define wxIslower islower
310#define wxIsprint isprint
311#define wxIspunct ispunct
312#define wxIsspace isspace
313#define wxIsupper isupper
314#define wxIsxdigit isxdigit
315#define wxTolower tolower
316#define wxToupper toupper
317
318 // locale.h functons
319#define wxSetlocale setlocale
320
321 // string.h functions
322#define wxStricmp strcasecmp
323// #define wxStrtok strtok_r // this needs a configure check
324
325 // leave the rest to defaults below
326#define wxNEED_WX_STRING_H
327#define wxNEED_WX_STDIO_H
328#define wxNEED_WX_STDLIB_H
329#define wxNEED_WX_TIME_H
330
331#endif//Unicode
332#endif//TCHAR-aware compilers
333
334// define wxStricmp for various compilers without Unicode possibilities
335#if !defined(wxStricmp) && !wxUSE_UNICODE
336#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__SALFORDC__)
337 #define wxStricmp stricmp
338#elif defined(__SC__) || defined(__VISUALC__) || (defined(__MWERKS) && defined(__INTEL__))
339 #define wxStricmp _stricmp
340#elif defined(__UNIX__) || defined(__GNUWIN32__)
341 #define wxStricmp strcasecmp
342#elif defined(__MWERKS__) && !defined(__INTEL__)
343 // use wxWindows' implementation
344#else
345 // if you leave wxStricmp undefined, wxWindows' implementation will be used
346 #error "Please define string case-insensitive compare for your OS/compiler"
347#endif
348#endif
349
350// if we need to define for standard headers, and we're not using Unicode,
351// just define to standard C library routines
352#if !wxUSE_UNICODE
353#ifdef wxNEED_WX_STRING_H
354#define wxStrcat strcat
355#define wxStrchr strchr
356#define wxStrcmp strcmp
357#define wxStrcoll strcoll
358#define wxStrcpy strcpy
359#define wxStrcspn strcspn
360#define wxStrdup strdup
361#define wxStrlen_ strlen // used in wxStrlen inline function
362#define wxStrncat strncat
363#define wxStrncmp strncmp
364#define wxStrncpy strncpy
365#define wxStrpbrk strpbrk
366#define wxStrrchr strrchr
367#define wxStrspn strspn
368#define wxStrstr strstr
369#define wxStrtod strtod
370#define wxStrtol strtol
371#define wxStrtoul strtoul
372#define wxStrxfrm strxfrm
373#undef wxNEED_WX_STRING_H
374#endif
375
376#ifdef wxNEED_WX_STDIO_H
377#define wxFgetc fgetc
378#define wxFgetchar fgetchar
379#define wxFgets fgets
380#define wxFopen fopen
381#define wxFputc fputc
382#define wxFputchar fputchar
383#define wxFprintf fprintf
384#define wxFreopen freopen
385#define wxFscanf fscanf
386#define wxGetc getc
387#define wxGetchar getchar
388#define wxGets gets
389#define wxPerror perror
390#define wxPrintf printf
391#define wxPutc putc
392#define wxPutchar putchar
393#define wxPuts puts
394#define wxRemove remove
395#define wxRename rename
396#define wxScanf scanf
397#define wxSprintf sprintf
398#define wxSscanf sscanf
399#define wxTmpnam tmpnam
400#define wxUngetc ungetc
401#define wxVfprint vfprintf
402#define wxVprintf vprintf
403#define wxVsscanf vsscanf
404#define wxVsprintf vsprintf
405#undef wxNEED_WX_STDIO_H
406#endif
407
408#ifdef wxNEED_WX_STDLIB_H
409#define wxAtof atof
410#define wxAtoi atoi
411#define wxAtol atol
412#define wxGetenv getenv
413#define wxSystem system
414#undef wxNEED_WX_STDLIB_H
415#endif
416
417#ifdef wxNEED_WX_TIME_H
418#define wxAsctime asctime
419#define wxCtime ctime
420#define wxStrftime strftime
421#undef wxNEED_WX_TIME_H
422#endif
423#endif //!Unicode
424
425#if defined(wxNEED_WCSLEN) && wxUSE_UNICODE
426#define wcslen wxStrlen
427#undef wxNEED_WCSLEN
428#endif
429
430/// checks whether the passed in pointer is NULL and if the string is empty
431WXDLLEXPORT inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }
432
433#ifndef wxNEED_WX_STRING_H
434/// safe version of strlen() (returns 0 if passed NULL pointer)
435WXDLLEXPORT inline size_t wxStrlen(const wxChar *psz)
436 { return psz ? wxStrlen_(psz) : 0; }
437#endif
438
439#if wxUSE_WCHAR_T
440// multibyte<->widechar conversion
441WXDLLEXPORT size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n);
442WXDLLEXPORT size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n);
443#if wxUSE_UNICODE
444#define wxMB2WX wxMB2WC
445#define wxWX2MB wxWC2MB
446#define wxWC2WX wxStrncpy
447#define wxWX2WC wxStrncpy
448#else
449#define wxMB2WX wxStrncpy
450#define wxWX2MB wxStrncpy
451#define wxWC2WX wxWC2MB
452#define wxWX2WC wxMB2WC
453#endif
454#else
455// No wxUSE_WCHAR_T: we have to do something (JACS)
456#define wxMB2WC wxStrncpy
457#define wxWC2MB wxStrncpy
458#define wxMB2WX wxStrncpy
459#define wxWX2MB wxStrncpy
460#define wxWC2WX wxWC2MB
461#define wxWX2WC wxMB2WC
462#endif
463
464WXDLLEXPORT bool wxOKlibc(); // for internal use
465
466// if libc versions are not available, use replacements defined in wxchar.cpp
467#ifndef wxStrdup
468WXDLLEXPORT wxChar * wxStrdup(const wxChar *psz);
469#endif
470
471#ifndef wxStricmp
472WXDLLEXPORT int wxStricmp(const wxChar *psz1, const wxChar *psz2);
473#endif
474
475#ifndef wxStrtok
476WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr);
477#endif
478
479#ifndef wxSetlocale
480WXDLLEXPORT wxChar * wxSetlocale(int category, const wxChar *locale);
481#endif
482
483#ifdef wxNEED_WCSLEN // for use in buffer.h
484WXDLLEXPORT size_t wcslen(const wchar_t *s);
485#endif
486
487#ifdef wxNEED_WX_CTYPE_H
488WXDLLEXPORT int wxIsalnum(wxChar ch);
489WXDLLEXPORT int wxIsalpha(wxChar ch);
490WXDLLEXPORT int wxIsctrl(wxChar ch);
491WXDLLEXPORT int wxIsdigit(wxChar ch);
492WXDLLEXPORT int wxIsgraph(wxChar ch);
493WXDLLEXPORT int wxIslower(wxChar ch);
494WXDLLEXPORT int wxIsprint(wxChar ch);
495WXDLLEXPORT int wxIspunct(wxChar ch);
496WXDLLEXPORT int wxIsspace(wxChar ch);
497WXDLLEXPORT int wxIsupper(wxChar ch);
498WXDLLEXPORT int wxIsxdigit(wxChar ch);
499WXDLLEXPORT int wxTolower(wxChar ch);
500WXDLLEXPORT int wxToupper(wxChar ch);
501#endif
502
503#ifdef wxNEED_WX_STRING_H
504WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src);
505WXDLLEXPORT wxChar * wxStrchr(const wxChar *s, wxChar c);
506WXDLLEXPORT int wxStrcmp(const wxChar *s1, const wxChar *s2);
507WXDLLEXPORT int wxStrcoll(const wxChar *s1, const wxChar *s2);
508WXDLLEXPORT wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
509WXDLLEXPORT size_t wxStrcspn(const wxChar *s, const wxChar *reject);
510WXDLLEXPORT size_t wxStrlen(const wxChar *s);
511WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
512WXDLLEXPORT int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
513WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
514WXDLLEXPORT wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
515WXDLLEXPORT wxChar * wxStrrchr(const wxChar *s, wxChar c);
516WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept);
517WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
518WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr);
519WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base);
520WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base);
521WXDLLEXPORT size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
522#endif
523
524#ifdef wxNEED_WX_STDIO_H
525#include <stdio.h>
526#include <stdarg.h>
527WXDLLEXPORT int wxPrintf(const wxChar *fmt, ...);
528WXDLLEXPORT int wxVprintf(const wxChar *fmt, va_list argptr);
529WXDLLEXPORT int wxFprintf(FILE *stream, const wxChar *fmt, ...);
530WXDLLEXPORT int wxVfprintf(FILE *stream, const wxChar *fmt, va_list argptr);
531WXDLLEXPORT int wxSprintf(wxChar *buf, const wxChar *fmt, ...);
532WXDLLEXPORT int wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr);
533WXDLLEXPORT int wxSscanf(const wxChar *buf, const wxChar *fmt, ...);
534WXDLLEXPORT int wxVsscanf(const wxChar *buf, const wxChar *fmt, va_list argptr);
535#endif
536
537#ifndef wxAtof
538WXDLLEXPORT double wxAtof(const wxChar *psz);
539#endif
540
541#ifdef wxNEED_WX_STDLIB_H
542WXDLLEXPORT int wxAtoi(const wxChar *psz);
543WXDLLEXPORT long wxAtol(const wxChar *psz);
544WXDLLEXPORT wxChar * wxGetenv(const wxChar *name);
545WXDLLEXPORT int wxSystem(const wxChar *psz);
546#endif
547
548#endif
549 //_WX_WXCHAR_H_