]> git.saurik.com Git - wxWidgets.git/blob - include/wx/wxchar.h
wxURL implementation using WinInet functions under Win32 (patch 839305)
[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__)
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 /*
509 #define wxNEED_FPUTWC
510
511 #include <stdio.h>
512
513 int wxFputs(const wxChar *ch, FILE *stream);
514 int wxPutc(wxChar ch, FILE *stream);
515
516 #define wxPuts(ws) wxFputs(ws, stdout)
517 #define wxPutchar(wch) wxPutc(wch, stdout)
518
519 #define wxNEED_PRINTF_CONVERSION
520 #define wxNEED_WX_STDIO_H
521 #define wxNEED_WX_STDLIB_H
522 */
523 #define wxNEED_WX_TIME_H
524 #else /* !metrowerks for apple */
525 #error "Please define wide character functions for your environment"
526 #endif
527 #else /* ASCII */
528 #include <ctype.h>
529 #include <string.h>
530
531 /* ctype.h functions */
532 #define wxIsalnum isalnum
533 #define wxIsalpha isalpha
534 #define wxIscntrl iscntrl
535 #define wxIsdigit isdigit
536 #define wxIsgraph isgraph
537 #define wxIslower islower
538 #define wxIsprint isprint
539 #define wxIspunct ispunct
540 #define wxIsspace isspace
541 #define wxIsupper isupper
542 #define wxIsxdigit isxdigit
543 #define wxTolower tolower
544 #define wxToupper toupper
545
546 /* locale.h functons */
547 #define wxSetlocale setlocale
548
549 /* string.h functions */
550 #define wxStrcat strcat
551 #define wxStrchr strchr
552 #define wxStrcmp strcmp
553 #define wxStrcoll strcoll
554 #define wxStrcpy strcpy
555 #define wxStrcspn strcspn
556
557 /* wxStricmp and wxStrnicmp are defined below */
558 #define wxStrlen_ strlen /* used in wxStrlen inline function */
559 #define wxStrncat strncat
560 #define wxStrncmp strncmp
561 #define wxStrncpy strncpy
562 #define wxStrpbrk strpbrk
563 #define wxStrrchr strrchr
564 #define wxStrspn strspn
565 #define wxStrstr strstr
566 #define wxStrtod strtod
567 #ifdef HAVE_STRTOK_R
568 #define wxStrtok(str, sep, last) strtok_r(str, sep, last)
569 #endif
570 #define wxStrtol strtol
571 #define wxStrtoul strtoul
572 #define wxStrxfrm strxfrm
573
574 /* stdio.h functions */
575 #define wxFopen fopen
576 #define wxFreopen freopen
577 #define wxRemove remove
578 #define wxRename rename
579
580 #define wxPerror perror
581 #define wxTmpnam tmpnam
582
583 #define wxFgetc fgetc
584 #define wxFgetchar fgetchar
585 #define wxFgets fgets
586 #define wxFputc fputc
587 #define wxFputs fputs
588 #define wxFputchar fputchar
589 #define wxFprintf fprintf
590 #define wxFscanf fscanf
591 #define wxGetc getc
592 #define wxGetchar getchar
593 #define wxGets gets
594 #define wxPrintf printf
595 #define wxPutc putc
596 #define wxPutchar putchar
597 #define wxPuts puts
598 #define wxScanf scanf
599 #define wxSprintf sprintf
600 #define wxSscanf sscanf
601 #define wxUngetc ungetc
602 #define wxVfprintf vfprintf
603 #define wxVprintf vprintf
604 #define wxVsscanf vsscanf
605 #define wxVsprintf vsprintf
606
607 /* stdlib.h functions */
608 #define wxAtof atof
609 #define wxAtoi atoi
610 #define wxAtol atol
611 #define wxGetenv getenv
612 #define wxSystem system
613
614 /* time.h functions */
615 #define wxAsctime asctime
616 #define wxCtime ctime
617 #define wxStrftime strftime
618 #endif /* Unicode/ASCII */
619 #endif /* TCHAR-aware compilers/the others */
620
621 /*
622 various special cases
623 */
624
625 /* define wxStricmp and wxStrnicmp for various compilers */
626
627 /* note that in Unicode mode we definitely are going to need our own version */
628 #if !defined(wxStricmp) && !wxUSE_UNICODE
629 #if defined(__BORLANDC__) || defined(__WATCOMC__) || \
630 defined(__SALFORDC__) || defined(__VISAGECPP__) || \
631 defined(__EMX__) || defined(__DJGPP__)
632 #define wxStricmp stricmp
633 #define wxStrnicmp strnicmp
634 #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \
635 (defined(__MWERKS__) && defined(__INTEL__))
636 #define wxStricmp _stricmp
637 #define wxStrnicmp _strnicmp
638 #elif defined(__UNIX__) || defined(__GNUWIN32__)
639 #define wxStricmp strcasecmp
640 #define wxStrnicmp strncasecmp
641 /* #else -- use wxWindows implementation */
642 #endif
643 #endif /* !defined(wxStricmp) */
644
645 /* define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as */
646 /* it's used in wx/buffer.h -- and also might be used just below by wxStrlen() */
647 /* when wxStrlen_() is #define'd as wxWcslen so do it before defining wxStrlen) */
648 #if wxUSE_WCHAR_T
649 #ifdef HAVE_WCSLEN
650 #define wxWcslen wcslen
651 #else
652 inline size_t wxWcslen(const wchar_t *s)
653 {
654 size_t n = 0;
655 while ( *s++ )
656 n++;
657
658 return n;
659 }
660 #endif
661 #endif /* wxUSE_WCHAR_T */
662
663 #ifdef __cplusplus
664 /* checks whether the passed in pointer is NULL and if the string is empty */
665 inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; }
666
667 /* safe version of strlen() (returns 0 if passed NULL pointer) */
668 inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; }
669 #endif
670
671 /*
672 each of strdup() and wcsdup() may or may not be available but we need both
673 of them anyhow for wx/buffer.h so we define the missing one(s) in
674 wxchar.cpp and so we should always have both wxStrdupA and wxStrdupW
675 defined -- if this is somehow not the case in some situations, please
676 correct that and not the lines here
677 */
678 #if wxUSE_UNICODE
679 #define wxStrdup wxStrdupW
680 #else
681 #define wxStrdup wxStrdupA
682 #endif
683
684 #ifdef __cplusplus
685 WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */
686 #endif
687
688 /* printf() family saga */
689
690 /*
691 For some systems vsnprintf() exists in the system libraries but not in the
692 headers, so we need to declare it ourselves to be able to use it.
693 */
694 #if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL)
695 extern "C"
696 int vsnprintf(char *str, size_t size, const char *format, va_list ap);
697 #endif /* !HAVE_VSNPRINTF_DECL */
698
699 /*
700 First of all, we always want to define safe snprintf() function to be used
701 instead of sprintf(). Some compilers already have it (or rather vsnprintf()
702 which we really need...), otherwise we implement it using our own printf()
703 code.
704
705 We define function with a trailing underscore here because the real one is a
706 wrapper around it as explained below
707 */
708 #ifndef wxVsnprintf_
709 #if wxUSE_UNICODE
710 #if defined(__MWERKS__)
711 #define HAVE_WCSRTOMBS 1
712 #define HAVE_VSWPRINTF 1
713 #endif
714 #if defined(__WATCOMC__)
715 #define wxVsnprintf_ _vsnwprintf
716 #define wxSnprintf_ _snwprintf
717 #endif
718 #if defined(HAVE__VSNWPRINTF)
719 #define wxVsnprintf_ _vsnwprintf
720 /* MinGW?MSVCRT has the wrong vswprintf */
721 #elif defined(HAVE_VSWPRINTF) && !defined(__MINGW32__)
722 #define wxVsnprintf_ vswprintf
723 #endif
724 #else /* ASCII */
725 /* all versions of CodeWarrior supported by wxWindows apparently have */
726 /* vsnprintf() */
727 #if defined(HAVE_VSNPRINTF) || defined(__MWERKS__) || defined(__WATCOMC__)
728 /* assume we have snprintf() too if we have vsnprintf() */
729 #define wxVsnprintf_ vsnprintf
730 #define wxSnprintf_ snprintf
731 #endif
732 #endif
733 #endif /* wxVsnprintf_ not defined yet */
734
735 #ifndef wxSnprintf_
736 /* no [v]snprintf(), cook our own */
737 WXDLLIMPEXP_BASE int wxSnprintf_(wxChar *buf, size_t len, const wxChar *format,
738 ...) ATTRIBUTE_PRINTF_3;
739 #endif
740 #ifndef wxVsnprintf_
741 WXDLLIMPEXP_BASE int wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format,
742 va_list argptr);
743 #endif
744
745 /*
746 In Unicode mode we need to have all standard functions such as wprintf() and
747 so on but not all systems have them so use our own implementations in this
748 case.
749 */
750 #if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF)
751 #define wxNEED_WPRINTF
752 #endif
753
754 /*
755 More Unicode complications: although both ANSI C and C++ define a number of
756 wide character functions such as wprintf(), not all environments have them.
757 Worse, those which do have different behaviours: under Windows, %s format
758 specifier changes its meaning in Unicode build and expects a Unicode string
759 while under Unix/POSIX it still means an ASCII string even for wprintf() and
760 %ls has to be used for wide strings.
761
762 We choose to always emulate Windows behaviour as more useful for us so even
763 if we have wprintf() we still must wrap it in a non trivial wxPrintf().
764
765 However, if we don't have any vswprintf() at all we don't need to redefine
766 anything as our own wxVsnprintf_() already behaves as needed.
767 */
768 #ifndef wxVsnprintf_
769 #undef wxNEED_PRINTF_CONVERSION
770 #endif
771
772 #if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF)
773 /*
774 we need to implement all wide character printf and scanf functions
775 either because we don't have them at all or because they don't have the
776 semantics we need
777 */
778
779 #include <stdio.h> /* for FILE */
780
781 int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
782 int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
783 int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
784 int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap );
785 int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1;
786 int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
787 int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2;
788 int wxVfprintf( FILE *stream, const wxChar *format, va_list ap );
789 int wxVprintf( const wxChar *format, va_list ap );
790 int wxVsprintf( wxChar *str, const wxChar *format, va_list ap );
791 #endif /* wxNEED_PRINTF_CONVERSION */
792
793 /* these 2 can be simply mapped to the versions with underscore at the end */
794 /* if we don't have to do the conversion */
795 #ifdef wxNEED_PRINTF_CONVERSION
796 int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3;
797 int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap );
798 #else
799 #define wxSnprintf wxSnprintf_
800 #define wxVsnprintf wxVsnprintf_
801 #endif
802
803 /*
804 various functions which might not be available in libc and for which we
805 provide our own replacements in wxchar.cpp
806 */
807
808 /* ctype.h functions */
809
810 /* VZ: note that this is never defined currently */
811 #ifdef wxNEED_WX_CTYPE_H
812 WXDLLIMPEXP_BASE int wxIsalnum(wxChar ch);
813 WXDLLIMPEXP_BASE int wxIsalpha(wxChar ch);
814 WXDLLIMPEXP_BASE int wxIscntrl(wxChar ch);
815 WXDLLIMPEXP_BASE int wxIsdigit(wxChar ch);
816 WXDLLIMPEXP_BASE int wxIsgraph(wxChar ch);
817 WXDLLIMPEXP_BASE int wxIslower(wxChar ch);
818 WXDLLIMPEXP_BASE int wxIsprint(wxChar ch);
819 WXDLLIMPEXP_BASE int wxIspunct(wxChar ch);
820 WXDLLIMPEXP_BASE int wxIsspace(wxChar ch);
821 WXDLLIMPEXP_BASE int wxIsupper(wxChar ch);
822 WXDLLIMPEXP_BASE int wxIsxdigit(wxChar ch);
823 WXDLLIMPEXP_BASE int wxTolower(wxChar ch);
824 WXDLLIMPEXP_BASE int wxToupper(wxChar ch);
825 #endif /* wxNEED_WX_CTYPE_H */
826
827 /* under VC++ 6.0 isspace() returns 1 for 8 bit chars which completely breaks */
828 /* the file parsing -- this may be true for 5.0 as well, update #ifdef then */
829 #if defined(__VISUALC__) && (__VISUALC__ >= 1200) && !wxUSE_UNICODE
830 #undef wxIsspace
831 #define wxIsspace(c) ((((unsigned)c) < 128) && isspace(c))
832 #endif /* VC++ */
833
834 /*
835 we had goofed and defined wxIctrl() instead of (correct) wxIscntrl() in the
836 initial versions of this header -- now it is too late to remove it so
837 although we fixed the function/macro name above, still provide the
838 backwards-compatible synonym.
839 */
840 #define wxIsctrl wxIscntrl
841
842 /* string.h functions */
843
844 /* VZ: this is never defined neither currently */
845 #ifdef wxNEED_WX_STRING_H
846 WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src);
847 WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c);
848 WXDLLIMPEXP_BASE wxChar * wxStrchr(wxChar *s, wxChar c)
849 { return (wxChar *)wxStrchr((const wxChar *)s, c); }
850 WXDLLIMPEXP_BASE int wxStrcmp(const wxChar *s1, const wxChar *s2);
851 WXDLLIMPEXP_BASE int wxStrcoll(const wxChar *s1, const wxChar *s2);
852 WXDLLIMPEXP_BASE wxChar * wxStrcpy(wxChar *dest, const wxChar *src);
853 WXDLLIMPEXP_BASE size_t wxStrcspn(const wxChar *s, const wxChar *reject);
854 WXDLLIMPEXP_BASE size_t wxStrlen(const wxChar *s);
855 WXDLLIMPEXP_BASE wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n);
856 WXDLLIMPEXP_BASE int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n);
857 WXDLLIMPEXP_BASE wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n);
858 WXDLLIMPEXP_BASE const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept);
859 WXDLLIMPEXP_BASE wxChar * wxStrpbrk(wxChar *s, const wxChar *accept)
860 { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); }
861 WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c);
862 WXDLLIMPEXP_BASE wxChar * wxStrrchr(wxChar *s, wxChar c)
863 { return (wxChar *)wxStrrchr((const wxChar *)s, c); }
864 WXDLLIMPEXP_BASE size_t wxStrspn(const wxChar *s, const wxChar *accept);
865 WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle);
866 WXDLLIMPEXP_BASE wxChar *wxStrstr(wxChar *haystack, const wxChar *needle)
867 { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); }
868 WXDLLIMPEXP_BASE double wxStrtod(const wxChar *nptr, wxChar **endptr);
869 WXDLLIMPEXP_BASE long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base);
870 WXDLLIMPEXP_BASE unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base);
871 WXDLLIMPEXP_BASE size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n);
872 #endif /* wxNEED_WX_STRING_H */
873
874 #ifndef wxStrdupA
875 WXDLLIMPEXP_BASE char *wxStrdupA(const char *psz);
876 #endif
877
878 #ifndef wxStrdupW
879 WXDLLIMPEXP_BASE wchar_t *wxStrdupW(const wchar_t *pwz);
880 #endif
881
882 #ifndef wxStricmp
883 WXDLLIMPEXP_BASE int wxStricmp(const wxChar *psz1, const wxChar *psz2);
884 #endif
885
886 #ifndef wxStrnicmp
887 WXDLLIMPEXP_BASE int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len);
888 #endif
889
890 #ifndef wxStrtok
891 WXDLLIMPEXP_BASE wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr);
892 #endif
893
894 #ifdef __cplusplus
895 #ifndef wxSetlocale
896 class WXDLLIMPEXP_BASE wxWCharBuffer;
897 WXDLLIMPEXP_BASE wxWCharBuffer wxSetlocale(int category, const wxChar *locale);
898 #endif
899 #endif
900
901 /* stdio.h functions */
902 #ifdef wxNEED_WX_STDIO_H
903 #include <stdio.h>
904 WXDLLIMPEXP_BASE FILE * wxFopen(const wxChar *path, const wxChar *mode);
905 WXDLLIMPEXP_BASE FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream);
906 WXDLLIMPEXP_BASE int wxRemove(const wxChar *path);
907 WXDLLIMPEXP_BASE int wxRename(const wxChar *oldpath, const wxChar *newpath);
908
909 /* *printf() family is handled separately */
910 #endif /* wxNEED_WX_STDIO_H */
911
912
913 /* stdlib.h functions */
914 #ifndef wxAtof
915 WXDLLIMPEXP_BASE double wxAtof(const wxChar *psz);
916 #endif
917
918 #ifdef wxNEED_WX_STDLIB_H
919 WXDLLIMPEXP_BASE int wxAtoi(const wxChar *psz);
920 WXDLLIMPEXP_BASE long wxAtol(const wxChar *psz);
921 WXDLLIMPEXP_BASE wxChar * wxGetenv(const wxChar *name);
922 WXDLLIMPEXP_BASE int wxSystem(const wxChar *psz);
923 #endif
924
925
926 /* time.h functions */
927 #ifdef wxNEED_WX_TIME_H
928 #if defined(__MWERKS__) && defined(macintosh)
929 #include <time.h>
930 #endif
931 WXDLLIMPEXP_BASE size_t wxStrftime(wxChar *s, size_t max,
932 const wxChar *fmt, const struct tm *tm);
933 #endif /* wxNEED_WX_TIME_H */
934
935 /* missing functions in some WinCE versions */
936 #ifdef _WIN32_WCE
937 #if (_WIN32_WCE < 300)
938 WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size );
939 #endif
940 WXDLLIMPEXP_BASE char* strdup(const char* s);
941
942 #if _WIN32_WCE <= 211
943 WXDLLIMPEXP_BASE int isspace(int c);
944 WXDLLIMPEXP_BASE int isascii( int c );
945 #endif
946 #endif
947
948 /* multibyte to wide char conversion functions and macros */
949
950 #if wxUSE_WCHAR_T
951 /* multibyte<->widechar conversion */
952 WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n);
953 WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n);
954
955 #if wxUSE_UNICODE
956 #define wxMB2WX wxMB2WC
957 #define wxWX2MB wxWC2MB
958 #define wxWC2WX wxStrncpy
959 #define wxWX2WC wxStrncpy
960 #else
961 #define wxMB2WX wxStrncpy
962 #define wxWX2MB wxStrncpy
963 #define wxWC2WX wxWC2MB
964 #define wxWX2WC wxMB2WC
965 #endif
966 #else /* !wxUSE_UNICODE */
967 /* No wxUSE_WCHAR_T: we have to do something (JACS) */
968 #define wxMB2WC wxStrncpy
969 #define wxWC2MB wxStrncpy
970 #define wxMB2WX wxStrncpy
971 #define wxWX2MB wxStrncpy
972 #define wxWC2WX wxWC2MB
973 #define wxWX2WC wxMB2WC
974 #endif
975
976 #endif /* _WX_WXCHAR_H_ */
977