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