]> git.saurik.com Git - wxWidgets.git/blob - include/wx/wxchar.h
Win64 compilation fixes: define SIZEOF_SIZE_T, added wxUIntPtr
[wxWidgets.git] / include / wx / wxchar.h
1 /*
2 * Name: wx/wxchar.h
3 * Purpose: Declarations common to wx char/wchar_t usage (wide chars)
4 * Author: Joel Farley, Ove Kåven
5 * Modified by: Vadim Zeitlin, Robert Roebling
6 * Created: 1998/06/12
7 * RCS-ID: $Id$
8 * Copyright: (c) 1998-2002 wxWindows dev team
9 * Licence: wxWindows licence
10 */
11
12 /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
13
14 #ifndef _WX_WXCHAR_H_
15 #define _WX_WXCHAR_H_
16
17 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
18 #pragma interface "wxchar.h"
19 #endif
20
21 #include "wx/defs.h" /* for wxUSE_UNICODE */
22
23 /* check whether we have wchar_t and which size it is if we do */
24 #if !defined(wxUSE_WCHAR_T)
25 #if defined(__WIN16__)
26 /* no wchar_t under Win16 regadrless of compiler used */
27 #define wxUSE_WCHAR_T 0
28 #elif defined(__UNIX__)
29 #if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__)
30 #define wxUSE_WCHAR_T 1
31 #else
32 #define wxUSE_WCHAR_T 0
33 #endif
34 #elif defined(__GNUWIN32__) && !defined(__MINGW32__)
35 #define wxUSE_WCHAR_T 0
36 #elif defined(__WATCOMC__)
37 #define wxUSE_WCHAR_T 0
38 #elif defined(__VISAGECPP__) && (__IBMCPP__ < 400)
39 #define wxUSE_WCHAR_T 0
40 #else
41 /* add additional compiler checks if this fails */
42 #define wxUSE_WCHAR_T 1
43 #endif
44 #endif /* !defined(wxUSE_WCHAR_T) */
45
46 /* Unicode support requires wchar_t */
47 #if wxUSE_UNICODE && !wxUSE_WCHAR_T
48 #error "wchar_t must be available in Unicode build"
49 #endif /* Unicode */
50
51 /*
52 Standard headers we need here.
53
54 NB: don't include any wxWindows headers here because almost of them include
55 this one!
56 */
57
58 /* Required for wxPrintf() etc */
59 #include <stdarg.h>
60
61 /* Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac */
62 /* and VC++ for Windows CE don't provide it */
63 #if !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__)
64 /* use #define, not inline wrapper, as it is tested with #ifndef below */
65 #define wxStrdupA strdup
66 #endif
67
68 /*
69 non Unix compilers which do have wchar.h (but not tchar.h which is included
70 below and which includes wchar.h anyhow).
71
72 Actually MinGW has tchar.h, but it does not include wchar.h
73 */
74 #if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
75 #ifndef HAVE_WCHAR_H
76 #define HAVE_WCHAR_H
77 #endif
78 #endif
79
80 #if wxUSE_WCHAR_T
81 #ifdef HAVE_WCHAR_H
82 /* the current (as of Nov 2002) version of cygwin has a bug in its */
83 /* wchar.h -- there is no extern "C" around the declarations in it and */
84 /* this results in linking errors later; also, at least on some */
85 /* Cygwin versions, wchar.h requires sys/types.h */
86 #ifdef __CYGWIN__
87 #include <sys/types.h>
88 extern "C" {
89 #endif /* Cygwin */
90 #include <wchar.h>
91 #ifdef __CYGWIN__
92 }
93 #endif /* Cygwin */
94 #elif defined(HAVE_WCSTR_H)
95 /* old compilers have relevant declarations here */
96 #include <wcstr.h>
97 #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
98 /* include stdlib.h for wchar_t */
99 #include <stdlib.h>
100 #endif /* HAVE_WCHAR_H */
101 #endif /* wxUSE_WCHAR_T */
102
103 /* ---------------------------------------------------------------------------- */
104 /* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */
105 /* mapped to either char or wchar_t depending on the ASCII/Unicode mode and have */
106 /* the function mapping _tfoo() -> foo() or wfoo() */
107 /* ---------------------------------------------------------------------------- */
108
109 /* VC++ and BC++ starting with 5.2 have TCHAR support */
110 #ifdef __VISUALC__
111 #define wxHAVE_TCHAR_SUPPORT
112 #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)
113 #define wxHAVE_TCHAR_SUPPORT
114 #include <ctype.h>
115 #elif defined(__WATCOMC__)
116 #define wxHAVE_TCHAR_SUPPORT
117 #elif defined(__DMC__)
118 #define wxHAVE_TCHAR_SUPPORT
119 #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
120 #define wxHAVE_TCHAR_SUPPORT
121 #include <stddef.h>
122 #include <string.h>
123 #include <ctype.h>
124 #elif 0 && defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
125 /* VZ: the old VisualAge definitions were completely wrong and had no */
126 /* chance at all to work in Unicode build anyhow so let's pretend that */
127 /* VisualAge does _not_ support TCHAR for the moment (as indicated by */
128 /* "0 &&" above) until someone really has time to delve into Unicode */
129 /* issues under OS/2 */
130
131 /* VisualAge 4.0+ supports TCHAR */
132 #define wxHAVE_TCHAR_SUPPORT
133 #endif /* compilers with (good) TCHAR support */
134
135 #ifdef __MWERKS__
136 #define HAVE_WPRINTF
137 #endif
138
139 #ifdef wxHAVE_TCHAR_SUPPORT
140 /* get TCHAR definition if we've got it */
141 #include <tchar.h>
142
143 /* we surely do have wchar_t if we have TCHAR */
144 #ifndef wxUSE_WCHAR_T
145 #define wxUSE_WCHAR_T 1
146 #endif /* !defined(wxUSE_WCHAR_T) */
147
148 /* and we also do have wcslen() */
149 #ifndef HAVE_WCSLEN
150 #define HAVE_WCSLEN
151 #endif
152 #endif /* wxHAVE_TCHAR_SUPPORT */
153
154 /* ---------------------------------------------------------------------------- */
155 /* define wxChar type */
156 /* ---------------------------------------------------------------------------- */
157
158 /* TODO: define wxCharInt to be equal to either int or wint_t? */
159
160 #if !wxUSE_UNICODE
161 typedef char wxChar;
162 typedef signed char wxSChar;
163 typedef unsigned char wxUChar;
164 #else /* Unicode */
165 /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as */
166 /* signed/unsigned version of it which (a) makes sense to me (unlike */
167 /* char wchar_t is always unsigned) and (b) was how the previous */
168 /* definitions worked so keep it like this */
169
170 /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */
171 /* comment below */
172 #if !defined(__WCHAR_TYPE__) || \
173 (!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96))
174 /* standard case */
175 typedef wchar_t wxChar;
176 typedef wchar_t wxSChar;
177 typedef wchar_t wxUChar;
178 #else /* __WCHAR_TYPE__ and gcc < 2.96 */
179 /* VS: wxWindows used to define wxChar as __WCHAR_TYPE__ here. However, */
180 /* this doesn't work with new GCC 3.x compilers because wchar_t is */
181 /* C++'s builtin type in the new standard. OTOH, old compilers (GCC */
182 /* 2.x) won't accept new definition of wx{S,U}Char, therefore we */
183 /* have to define wxChar conditionally depending on detected */
184 /* compiler & compiler version. */
185 /* with old definition of wxChar. */
186 typedef __WCHAR_TYPE__ wxChar;
187 typedef __WCHAR_TYPE__ wxSChar;
188 typedef __WCHAR_TYPE__ wxUChar;
189 #endif /* __WCHAR_TYPE__ */
190 #endif /* ASCII/Unicode */
191
192 /* ---------------------------------------------------------------------------- */
193 /* define _T() and related macros */
194 /* ---------------------------------------------------------------------------- */
195
196 /* BSD systems define _T() to be something different in ctype.h, override it */
197 #if defined(__FreeBSD__) || defined(__DARWIN__)
198 #include <ctype.h>
199 #undef _T
200 #endif
201
202 /* could already be defined by tchar.h (it's quasi standard) */
203 #ifndef _T
204 #if !wxUSE_UNICODE
205 #define _T(x) x
206 #else /* Unicode */
207 #define _T(x) L ## x
208 #endif /* ASCII/Unicode */
209 #endif /* !defined(_T) */
210
211 /* although global macros with such names are normally bad, we want to have */
212 /* another name for _T() which should be used to avoid confusion between _T() */
213 /* and _() in wxWindows sources */
214 #define wxT(x) _T(x)
215
216 /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
217 #ifndef __TFILE__
218 #define __XFILE__(x) wxT(x)
219 #define __TFILE__ __XFILE__(__FILE__)
220 #endif
221
222 #ifndef __TDATE__
223 #define __XDATE__(x) wxT(x)
224 #define __TDATE__ __XDATE__(__DATE__)
225 #endif
226
227 #ifndef __TTIME__
228 #define __XTIME__(x) wxT(x)
229 #define __TTIME__ __XTIME__(__TIME__)
230 #endif
231
232 /*
233 define wxFoo() function for each standard foo() function whose signature
234 (exceptionally including the return type) includes any mention of char:
235 wxFoo() is going to be a Unicode-friendly version of foo(), i.e. will have
236 the same signature but with char replaced by wxChar which allows us to use
237 it in Unicode build as well
238 */
239
240 #ifdef wxHAVE_TCHAR_SUPPORT
241 #include <ctype.h>
242
243 /* ctype.h functions */
244 #define wxIsalnum _istalnum
245 #define wxIsalpha _istalpha
246 #define wxIscntrl _istcntrl
247 #define wxIsdigit _istdigit
248 #define wxIsgraph _istgraph
249 #define wxIslower _istlower
250 #define wxIsprint _istprint
251 #define wxIspunct _istpunct
252 #define wxIsspace _istspace
253 #define wxIsupper _istupper
254 #define wxIsxdigit _istxdigit
255 #define wxTolower _totlower
256 #define wxToupper _totupper
257
258 /* locale.h functons */
259 #define wxSetlocale _tsetlocale
260
261 /* string.h functions */
262 #define wxStrcat _tcscat
263 #define wxStrchr _tcschr
264 #define wxStrcmp _tcscmp
265 #define wxStrcoll _tcscoll
266 #define wxStrcpy _tcscpy
267 #define wxStrcspn _tcscspn
268 #define wxStrdupW _wcsdup /* notice the 'W'! */
269 #define wxStrftime _tcsftime
270 #define wxStricmp _tcsicmp
271 #define wxStrnicmp _tcsnicmp
272 #define wxStrlen_ _tcslen /* used in wxStrlen inline function */
273 #define wxStrncat _tcsncat
274 #define wxStrncmp _tcsncmp
275 #define wxStrncpy _tcsncpy
276 #define wxStrpbrk _tcspbrk
277 #define wxStrrchr _tcsrchr
278 #define wxStrspn _tcsspn
279 #define wxStrstr _tcsstr
280 #define wxStrtod _tcstod
281 #define wxStrtol _tcstol
282 #define wxStrtoul _tcstoul
283 #define wxStrxfrm _tcsxfrm
284
285 /* stdio.h functions */
286 #define wxFgetc _fgettc
287 #define wxFgetchar _fgettchar
288 #define wxFgets _fgetts
289 #define wxFopen _tfopen
290 #define wxFputc _fputtc
291 #define wxFputchar _fputtchar
292 #define wxFprintf _ftprintf
293 #define wxFputs _fputts
294 #define wxFreopen _tfreopen
295 #define wxFscanf _ftscanf
296 #define wxGetc _gettc
297 #define wxGetchar _gettchar
298 #define wxGets _getts
299 #define wxPerror _tperror
300 #define wxPrintf _tprintf
301 #define wxPutc _puttc
302 #define wxPutchar _puttchar
303 #define wxPuts _putts
304 #define wxScanf _tscanf
305 #if defined(__DMC__)
306 /* Digital Mars adds count to _stprintf (C99) so it does not fit wxWindows needs */
307 /* Instead of it we can use function from MSW api (FIXME: doesn't work) */
308 #ifdef wxUSE_UNICODE
309 #define wxSprintf wsprintfW
310 #else
311 #define wxSprintf wsprintfA
312 #endif
313 #else
314 #define wxSprintf _stprintf
315 #endif
316 #define wxSscanf _stscanf
317 #define wxTmpnam _ttmpnam
318 #define wxUngetc _tungetc
319 #define wxVfprintf _vftprintf
320 #define wxVprintf _vtprintf
321 #define wxVsscanf _vstscanf
322 #define wxVsprintf _vstprintf
323
324 /* special case: not all TCHAR-aware compilers have those */
325 #if defined(__VISUALC__) || \
326 (defined(__BORLANDC__) && __BORLANDC__ >= 0x540)
327 #define wxVsnprintf_ _vsntprintf
328 #define wxSnprintf_ _sntprintf
329 #endif
330
331 /* special case: these functions are missing under Win9x with Unicows so we */
332 /* have to implement them ourselves */
333 #if wxUSE_UNICODE_MSLU
334 #define wxRemove wxMSLU__tremove
335 #define wxRename wxMSLU__trename
336 #else
337 #ifdef __WXWINCE__
338 #define wxRemove DeleteFile
339 #else
340 #define wxRemove _tremove
341 #define wxRename _trename
342 #endif
343 #endif
344
345 /* stdlib.h functions */
346 #define wxAtoi _ttoi
347 #define wxAtol _ttol
348 /* #define wxAtof _tttof -- notice that there is no such thing (why?) */
349 #define wxGetenv _tgetenv
350 #define wxSystem _tsystem
351
352 /* time.h functions */
353 #define wxAsctime _tasctime
354 #define wxCtime _tctime
355 #else /* !TCHAR-aware compilers */
356 #if wxUSE_UNICODE
357 #include <wctype.h>
358
359 /* this is probably glibc-specific */
360 #if defined(__WCHAR_TYPE__) && !defined(__MWERKS__)
361 /* ctype.h functions (wctype.h) */
362 #define wxIsalnum iswalnum
363 #define wxIsalpha iswalpha
364 #define wxIscntrl iswcntrl
365 #define wxIsdigit iswdigit
366 #define wxIsgraph iswgraph
367 #define wxIslower iswlower
368 #define wxIsprint iswprint
369 #define wxIspunct iswpunct
370 #define wxIsspace iswspace
371 #define wxIsupper iswupper
372 #define wxIsxdigit iswxdigit
373
374 #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)
375 /* /usr/include/wctype.h incorrectly declares translations */
376 /* tables which provokes tons of compile-time warnings -- try */
377 /* to correct this */
378 #define wxTolower(wc) towctrans((wc), (wctrans_t)__ctype_tolower)
379 #define wxToupper(wc) towctrans((wc), (wctrans_t)__ctype_toupper)
380 #else /* !glibc 2.0 */
381 #define wxTolower towlower
382 #define wxToupper towupper
383 #endif /* gcc/!gcc */
384
385 /* string.h functions (wchar.h) */
386 #define wxStrcat wcscat
387 #define wxStrchr wcschr
388 #define wxStrcmp wcscmp
389 #define wxStrcoll wcscoll
390 #define wxStrcpy wcscpy
391 #define wxStrcspn wcscspn
392 #define wxStrlen_ wxWcslen /* wxStrlen_() is used in wxStrlen() */
393 #define wxStrncat wcsncat
394 #define wxStrncmp wcsncmp
395 #define wxStrncpy wcsncpy
396 #define wxStrpbrk wcspbrk
397 #define wxStrrchr wcsrchr
398 #define wxStrspn wcsspn
399 #define wxStrstr wcsstr
400 #define wxStrtod wcstod
401 #define wxStrtol wcstol
402 #define wxStrtoul wcstoul
403 #define wxStrxfrm wcsxfrm
404
405 #define wxFgetc fgetwc
406 #define wxFgetchar fgetwchar
407 #define wxFgets fgetws
408 #define wxFputc fputwc
409 #define wxFputchar fputwchar
410 #define wxGetc getwc
411 #define wxGetchar getwchar
412 #define wxGets getws
413 #define wxUngetc ungetwc
414
415 #ifdef HAVE_FPUTWC
416 #define wxPutc wputc
417 #define wxPutchar wputchar
418 #define wxPuts putws
419 #define wxFputs fputws
420 #else
421 #define wxNEED_FPUTWC
422
423 #include <stdio.h>
424
425 int wxFputs(const wxChar *ch, FILE *stream);
426 int wxPutc(wxChar ch, FILE *stream);
427
428 #define wxPuts(ws) wxFputs(ws, stdout)
429 #define wxPutchar(wch) wxPutc(wch, stdout)
430 #endif
431
432 /* we need %s to %ls conversion for printf and scanf etc */
433 #define wxNEED_PRINTF_CONVERSION
434
435 /* glibc doesn't have wide char equivalents of the other stuff so */
436 /* use our own versions */
437 #define wxNEED_WX_STDIO_H
438 #define wxNEED_WX_STDLIB_H
439 #define wxNEED_WX_TIME_H
440 #elif defined(__MWERKS__) && ( defined(macintosh) || defined(__MACH__) )
441 /* ctype.h functions (wctype.h) */
442 #define wxIsalnum iswalnum
443 #define wxIsalpha iswalpha
444 #define wxIscntrl iswcntrl
445 #define wxIsdigit iswdigit
446 #define wxIsgraph iswgraph
447 #define wxIslower iswlower
448 #define wxIsprint iswprint
449 #define wxIspunct iswpunct
450 #define wxIsspace iswspace
451 #define wxIsupper iswupper
452 #define wxIsxdigit iswxdigit
453 #define wxTolower towlower
454 #define wxToupper towupper
455
456 /* string.h functions (wchar.h) */
457 #define wxStrcat wcscat
458 #define wxStrchr wcschr
459 #define wxStrcmp wcscmp
460 #define wxStrcoll wcscoll
461 #define wxStrcpy wcscpy
462 #define wxStrcspn wcscspn
463 #define wxStrlen_ wxWcslen /* wxStrlen_() is used in wxStrlen() */
464 #define wxStrncat wcsncat
465 #define wxStrncmp wcsncmp
466 #define wxStrncpy wcsncpy
467 #define wxStrpbrk wcspbrk
468 #define wxStrrchr wcsrchr
469 #define wxStrspn wcsspn
470 #define wxStrstr wcsstr
471 #define wxStrtod wcstod
472 #define wxStrtol wcstol
473 #define wxStrtoul wcstoul
474 #define wxStrxfrm wcsxfrm
475
476 #define wxFgetc fgetwc
477 #define wxFgetchar fgetwchar
478 #define wxFgets fgetws
479 #define wxFputc fputwc
480 #define wxFputchar fputwchar
481 #define wxGetc getwc
482 #define wxGetchar getwchar
483 #define wxGets getws
484 #define wxUngetc ungetwc
485
486 #define wxNEED_PRINTF_CONVERSION
487
488 #define wxPutc putwc
489 #define wxPutchar putwchar
490 #define wxFputs fputws
491
492 /* stdio.h functions */
493
494 #define wxNEED_WX_STDIO_H
495
496 /* stdlib.h functions */
497 #define wxAtof watof
498 #define wxAtoi watoi
499 #define wxAtol watol
500 #define wxGetenv(a) ((wxChar*)NULL)
501 #define wxSystem(a) ((int)NULL)
502
503 /* time.h functions */
504 #define wxAsctime wasciitime
505 #define wxCtime wctime
506 /* #define wxStrftime wcsftime */
507
508 #define wxNEED_WX_TIME_H
509 #else /* !metrowerks for apple */
510 #error "Please define wide character functions for your environment"
511 #endif
512 #else /* ASCII */
513 #include <ctype.h>
514 #include <string.h>
515
516 /* ctype.h functions */
517 #define wxIsalnum isalnum
518 #define wxIsalpha isalpha
519 #define wxIscntrl iscntrl
520 #define wxIsdigit isdigit
521 #define wxIsgraph isgraph
522 #define wxIslower islower
523 #define wxIsprint isprint
524 #define wxIspunct ispunct
525 #define wxIsspace isspace
526 #define wxIsupper isupper
527 #define wxIsxdigit isxdigit
528 #define wxTolower tolower
529 #define wxToupper toupper
530
531 /* locale.h functons */
532 #define wxSetlocale setlocale
533
534 /* string.h functions */
535 #define wxStrcat strcat
536 #define wxStrchr strchr
537 #define wxStrcmp strcmp
538 #define wxStrcoll strcoll
539 #define wxStrcpy strcpy
540 #define wxStrcspn strcspn
541
542 /* wxStricmp and wxStrnicmp are defined below */
543 #define wxStrlen_ strlen /* used in wxStrlen inline function */
544 #define wxStrncat strncat
545 #define wxStrncmp strncmp
546 #define wxStrncpy strncpy
547 #define wxStrpbrk strpbrk
548 #define wxStrrchr strrchr
549 #define wxStrspn strspn
550 #define wxStrstr strstr
551 #define wxStrtod strtod
552 #ifdef HAVE_STRTOK_R
553 #define wxStrtok(str, sep, last) strtok_r(str, sep, last)
554 #endif
555 #define wxStrtol strtol
556 #define wxStrtoul strtoul
557 #define wxStrxfrm strxfrm
558
559 /* stdio.h functions */
560 #define wxFopen fopen
561 #define wxFreopen freopen
562 #define wxRemove remove
563 #define wxRename rename
564
565 #define wxPerror perror
566 #define wxTmpnam tmpnam
567
568 #define wxFgetc fgetc
569 #define wxFgetchar fgetchar
570 #define wxFgets fgets
571 #define wxFputc fputc
572 #define wxFputs fputs
573 #define wxFputchar fputchar
574 #define wxFprintf fprintf
575 #define wxFscanf fscanf
576 #define wxGetc getc
577 #define wxGetchar getchar
578 #define wxGets gets
579 #define wxPrintf printf
580 #define wxPutc putc
581 #define wxPutchar putchar
582 #define wxPuts puts
583 #define wxScanf scanf
584 #define wxSprintf sprintf
585 #define wxSscanf sscanf
586 #define wxUngetc ungetc
587 #define wxVfprintf vfprintf
588 #define wxVprintf vprintf
589 #define wxVsscanf vsscanf
590 #define wxVsprintf vsprintf
591
592 /* stdlib.h functions */
593 #define wxAtof atof
594 #define wxAtoi atoi
595 #define wxAtol atol
596 #define wxGetenv getenv
597 #define wxSystem system
598
599 /* time.h functions */
600 #define wxAsctime asctime
601 #define wxCtime ctime
602 #define wxStrftime strftime
603 #endif /* Unicode/ASCII */
604 #endif /* TCHAR-aware compilers/the others */
605
606 /*
607 various special cases
608 */
609
610 /* define wxStricmp and wxStrnicmp for various compilers */
611
612 /* note that in Unicode mode we definitely are going to need our own version */
613 #if !defined(wxStricmp) && !wxUSE_UNICODE
614 #if defined(__BORLANDC__) || defined(__WATCOMC__) || \
615 defined(__SALFORDC__) || defined(__VISAGECPP__) || \
616 defined(__EMX__) || defined(__DJGPP__)
617 #define wxStricmp stricmp
618 #define wxStrnicmp strnicmp
619 #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
620 (defined(__MWERKS__) && defined(__INTEL__))
621 #define wxStricmp _stricmp
622 #define wxStrnicmp _strnicmp
623 #elif defined(__UNIX__) || defined(__GNUWIN32__)
624 #define wxStricmp strcasecmp
625 #define wxStrnicmp strncasecmp
626 /* #else -- use wxWindows implementation */
627 #endif
628 #endif /* !defined(wxStricmp) */
629
630 /* define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as */
631 /* it's used in wx/buffer.h -- and also might be used just below by wxStrlen() */
632 /* when wxStrlen_() is #define'd as wxWcslen so do it before defining wxStrlen) */
633 #if wxUSE_WCHAR_T
634 #ifdef HAVE_WCSLEN
635 #define wxWcslen wcslen
636 #else
637 inline size_t wxWcslen(const wchar_t *s)
638 {
639 size_t n = 0;
640 while ( *s++ )
641 n++;
642
643 return n;
644 }
645 #endif
646 #endif /* wxUSE_WCHAR_T */
647
648 #ifdef __cplusplus
649 /* checks whether the passed in pointer is NULL and if the string is empty */
650 inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }
651
652 /* safe version of strlen() (returns 0 if passed NULL pointer) */
653 inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; }
654 #endif
655
656 /*
657 each of strdup() and wcsdup() may or may not be available but we need both
658 of them anyhow for wx/buffer.h so we define the missing one(s) in
659 wxchar.cpp and so we should always have both wxStrdupA and wxStrdupW
660 defined -- if this is somehow not the case in some situations, please
661 correct that and not the lines here
662 */
663 #if wxUSE_UNICODE
664 #define wxStrdup wxStrdupW
665 #else
666 #define wxStrdup wxStrdupA
667 #endif
668
669 #ifdef __cplusplus
670 WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
671 #endif
672
673 /* printf() family saga */
674
675 /*
676 For some systems vsnprintf() exists in the system libraries but not in the
677 headers, so we need to declare it ourselves to be able to use it.
678 */
679 #if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL)
680 extern "C"
681 int vsnprintf(char *str, size_t size, const char *format, va_list ap);
682 #endif /* !HAVE_VSNPRINTF_DECL */
683
684 /*
685 First of all, we always want to define safe snprintf() function to be used
686 instead of sprintf(). Some compilers already have it (or rather vsnprintf()
687 which we really need...), otherwise we implement it using our own printf()
688 code.
689
690 We define function with a trailing underscore here because the real one is a
691 wrapper around it as explained below
692 */
693 #ifndef wxVsnprintf_
694 #if wxUSE_UNICODE
695 #if defined(__MWERKS__)
696 #define HAVE_WCSRTOMBS 1
697 #define HAVE_VSWPRINTF 1
698 #endif
699 #if defined(__WATCOMC__)
700 #define wxVsnprintf_ _vsnwprintf
701 #define wxSnprintf_ _snwprintf
702 #endif
703 #if defined(HAVE__VSNWPRINTF)
704 #define wxVsnprintf_ _vsnwprintf
705 /* MinGW?MSVCRT has the wrong vswprintf */
706 #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__)
707 #define wxVsnprintf_ vswprintf
708 #endif
709 #else /* ASCII */
710 /* all versions of CodeWarrior supported by wxWindows apparently have */
711 /* vsnprintf() */
712 #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__)
713 /* assume we have snprintf() too if we have vsnprintf() */
714 #define wxVsnprintf_ vsnprintf
715 #define wxSnprintf_ snprintf
716 #endif
717 #endif
718 #endif /* wxVsnprintf_ not defined yet */
719
720 #ifndef wxSnprintf_
721 /* no [v]snprintf(), cook our own */
722 WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
723 ...) ATTRIBUTE_PRINTF_3;
724 #endif
725 #ifndef wxVsnprintf_
726 WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
727 va_list argptr);
728 #endif
729
730 /*
731 In Unicode mode we need to have all standard functions such as wprintf() and
732 so on but not all systems have them so use our own implementations in this
733 case.
734 */
735 #if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF)
736 #define wxNEED_WPRINTF
737 #endif
738
739 /*
740 More Unicode complications: although both ANSI C and C++ define a number of
741 wide character functions such as wprintf(), not all environments have them.
742 Worse, those which do have different behaviours: under Windows, %s format
743 specifier changes its meaning in Unicode build and expects a Unicode string
744 while under Unix/POSIX it still means an ASCII string even for wprintf() and
745 %ls has to be used for wide strings.
746
747 We choose to always emulate Windows behaviour as more useful for us so even
748 if we have wprintf() we still must wrap it in a non trivial wxPrintf().
749
750 However, if we don't have any vswprintf() at all we don't need to redefine
751 anything as our own wxVsnprintf_() already behaves as needed.
752 */
753 #ifndef wxVsnprintf_
754 #undef wxNEED_PRINTF_CONVERSION
755 #endif
756
757 #if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF)
758 /*
759 we need to implement all wide character printf and scanf functions
760 either because we don't have them at all or because they don't have the
761 semantics we need
762 */
763
764 #include <stdio.h> /* for FILE */
765
766 int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
767 int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
768 int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
769 int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap );
770 int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
771 int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
772 int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
773 int wxVfprintf( FILE *stream, const wxChar *format, va_list ap );
774 int wxVprintf( const wxChar *format, va_list ap );
775 int wxVsprintf( wxChar *str, const wxChar *format, va_list ap );
776 #endif /* wxNEED_PRINTF_CONVERSION */
777
778 /* these 2 can be simply mapped to the versions with underscore at the end */
779 /* if we don't have to do the conversion */
780 #ifdef wxNEED_PRINTF_CONVERSION
781 int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3;
782 int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap );
783 #else
784 #define wxSnprintf wxSnprintf_
785 #define wxVsnprintf wxVsnprintf_
786 #endif
787
788 /*
789 various functions which might not be available in libc and for which we
790 provide our own replacements in wxchar.cpp
791 */
792
793 /* ctype.h functions */
794
795 /* VZ: note that this is never defined currently */
796 #ifdef wxNEED_WX_CTYPE_H
797 WXDLLIMPEXP_BASE int wxIsalnum(wxChar ch);
798 WXDLLIMPEXP_BASE int wxIsalpha(wxChar ch);
799 WXDLLIMPEXP_BASE int wxIscntrl(wxChar ch);
800 WXDLLIMPEXP_BASE int wxIsdigit(wxChar ch);
801 WXDLLIMPEXP_BASE int wxIsgraph(wxChar ch);
802 WXDLLIMPEXP_BASE int wxIslower(wxChar ch);
803 WXDLLIMPEXP_BASE int wxIsprint(wxChar ch);
804 WXDLLIMPEXP_BASE int wxIspunct(wxChar ch);
805 WXDLLIMPEXP_BASE int wxIsspace(wxChar ch);
806 WXDLLIMPEXP_BASE int wxIsupper(wxChar ch);
807 WXDLLIMPEXP_BASE int wxIsxdigit(wxChar ch);
808 WXDLLIMPEXP_BASE int wxTolower(wxChar ch);
809 WXDLLIMPEXP_BASE int wxToupper(wxChar ch);
810 #endif /* wxNEED_WX_CTYPE_H */
811
812 /* under VC++ 6.0 isspace() returns 1 for 8 bit chars which completely breaks */
813 /* the file parsing -- this may be true for 5.0 as well, update #ifdef then */
814 #if defined(__VISUALC__) && (__VISUALC__ >= 1200) && !wxUSE_UNICODE
815 #undef wxIsspace
816 #define wxIsspace(c) ((((unsigned)c) < 128) && isspace(c))
817 #endif /* VC++ */
818
819 /*
820 we had goofed and defined wxIctrl() instead of (correct) wxIscntrl() in the
821 initial versions of this header -- now it is too late to remove it so
822 although we fixed the function/macro name above, still provide the
823 backwards-compatible synonym.
824 */
825 #define wxIsctrl wxIscntrl
826
827 /* string.h functions */
828
829 /* VZ: this is never defined neither currently */
830 #ifdef wxNEED_WX_STRING_H
831 WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src);
832 WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c);
833 WXDLLIMPEXP_BASE wxChar * wxStrchr(wxChar *s, wxChar c)
834 { return (wxChar *)wxStrchr((const wxChar *)s, c); }
835 WXDLLIMPEXP_BASE int wxStrcmp(const wxChar *s1, const wxChar *s2);
836 WXDLLIMPEXP_BASE int wxStrcoll(const wxChar *s1, const wxChar *s2);
837 WXDLLIMPEXP_BASE wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
838 WXDLLIMPEXP_BASE size_t wxStrcspn(const wxChar *s, const wxChar *reject);
839 WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar *s);
840 WXDLLIMPEXP_BASE wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
841 WXDLLIMPEXP_BASE int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
842 WXDLLIMPEXP_BASE wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
843 WXDLLIMPEXP_BASE const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
844 WXDLLIMPEXP_BASE wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
845 { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); }
846 WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c);
847 WXDLLIMPEXP_BASE wxChar * wxStrrchr(wxChar *s, wxChar c)
848 { return (wxChar *)wxStrrchr((const wxChar *)s, c); }
849 WXDLLIMPEXP_BASE size_t wxStrspn(const wxChar *s, const wxChar *accept);
850 WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
851 WXDLLIMPEXP_BASE wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
852 { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); }
853 WXDLLIMPEXP_BASE double wxStrtod(const wxChar *nptr, wxChar **endptr);
854 WXDLLIMPEXP_BASE long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base);
855 WXDLLIMPEXP_BASE unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base);
856 WXDLLIMPEXP_BASE size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
857 #endif /* wxNEED_WX_STRING_H */
858
859 #ifndef wxStrdupA
860 WXDLLIMPEXP_BASE char *wxStrdupA(const char *psz);
861 #endif
862
863 #ifndef wxStrdupW
864 WXDLLIMPEXP_BASE wchar_t *wxStrdupW(const wchar_t *pwz);
865 #endif
866
867 #ifndef wxStricmp
868 WXDLLIMPEXP_BASE int wxStricmp(const wxChar *psz1, const wxChar *psz2);
869 #endif
870
871 #ifndef wxStrnicmp
872 WXDLLIMPEXP_BASE int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len);
873 #endif
874
875 #ifndef wxStrtok
876 WXDLLIMPEXP_BASE wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr);
877 #endif
878
879 #ifdef __cplusplus
880 #ifndef wxSetlocale
881 class WXDLLIMPEXP_BASE wxWCharBuffer;
882 WXDLLIMPEXP_BASE wxWCharBuffer wxSetlocale(int category, const wxChar *locale);
883 #endif
884 #endif
885
886 /* stdio.h functions */
887 #ifdef wxNEED_WX_STDIO_H
888 #include <stdio.h>
889 WXDLLIMPEXP_BASE FILE * wxFopen(const wxChar *path, const wxChar *mode);
890 WXDLLIMPEXP_BASE FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream);
891 WXDLLIMPEXP_BASE int wxRemove(const wxChar *path);
892 WXDLLIMPEXP_BASE int wxRename(const wxChar *oldpath, const wxChar *newpath);
893
894 /* *printf() family is handled separately */
895 #endif /* wxNEED_WX_STDIO_H */
896
897
898 /* stdlib.h functions */
899 #ifndef wxAtof
900 WXDLLIMPEXP_BASE double wxAtof(const wxChar *psz);
901 #endif
902
903 #ifdef wxNEED_WX_STDLIB_H
904 WXDLLIMPEXP_BASE int wxAtoi(const wxChar *psz);
905 WXDLLIMPEXP_BASE long wxAtol(const wxChar *psz);
906 WXDLLIMPEXP_BASE wxChar * wxGetenv(const wxChar *name);
907 WXDLLIMPEXP_BASE int wxSystem(const wxChar *psz);
908 #endif
909
910
911 /* time.h functions */
912 #ifdef wxNEED_WX_TIME_H
913 #if defined(__MWERKS__) && defined(macintosh)
914 #include <time.h>
915 #endif
916 WXDLLIMPEXP_BASE size_t wxStrftime(wxChar *s, size_t max,
917 const wxChar *fmt, const struct tm *tm);
918 #endif /* wxNEED_WX_TIME_H */
919
920 /* missing functions in some WinCE versions */
921 #ifdef _WIN32_WCE
922 #if (_WIN32_WCE < 300)
923 WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
924 #endif
925 WXDLLIMPEXP_BASE char* strdup(const char* s);
926
927 #if _WIN32_WCE <= 211
928 WXDLLIMPEXP_BASE int isspace(int c);
929 WXDLLIMPEXP_BASE int isascii( int c );
930 #endif
931 #endif
932
933 /* multibyte to wide char conversion functions and macros */
934
935 #if wxUSE_WCHAR_T
936 /* multibyte<->widechar conversion */
937 WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n);
938 WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n);
939
940 #if wxUSE_UNICODE
941 #define wxMB2WX wxMB2WC
942 #define wxWX2MB wxWC2MB
943 #define wxWC2WX wxStrncpy
944 #define wxWX2WC wxStrncpy
945 #else
946 #define wxMB2WX wxStrncpy
947 #define wxWX2MB wxStrncpy
948 #define wxWC2WX wxWC2MB
949 #define wxWX2WC wxMB2WC
950 #endif
951 #else /* !wxUSE_UNICODE */
952 /* No wxUSE_WCHAR_T: we have to do something (JACS) */
953 #define wxMB2WC wxStrncpy
954 #define wxWC2MB wxStrncpy
955 #define wxMB2WX wxStrncpy
956 #define wxWX2MB wxStrncpy
957 #define wxWC2WX wxWC2MB
958 #define wxWX2WC wxMB2WC
959 #endif
960
961 #endif /* _WX_WXCHAR_H_ */
962