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
8 * Copyright: (c) 1998-2002 wxWindows dev team
9 * Licence: wxWindows licence
12 /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
17 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
18 #pragma interface "wxchar.h"
21 #include "wx/defs.h" /* for wxUSE_UNICODE */
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
32 #define wxUSE_WCHAR_T 0
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
41 /* add additional compiler checks if this fails */
42 #define wxUSE_WCHAR_T 1
44 #endif /* !defined(wxUSE_WCHAR_T) */
46 /* Unicode support requires wchar_t */
47 #if wxUSE_UNICODE && !wxUSE_WCHAR_T
48 #error "wchar_t must be available in Unicode build"
52 Standard headers we need here.
54 NB: don't include any wxWindows headers here because almost of them include
58 /* Required for wxPrintf() etc */
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
69 non Unix compilers which do have wchar.h (but not tchar.h which is included
70 below and which includes wchar.h anyhow).
72 Actually MinGW has tchar.h, but it does not include wchar.h
74 #if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
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 */
87 #include <sys/types.h>
94 #elif defined(HAVE_WCSTR_H)
95 /* old compilers have relevant declarations here */
97 #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
98 /* include stdlib.h for wchar_t */
100 #endif /* HAVE_WCHAR_H */
101 #endif /* wxUSE_WCHAR_T */
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 /* ---------------------------------------------------------------------------- */
109 /* VC++ and BC++ starting with 5.2 have TCHAR support */
111 #define wxHAVE_TCHAR_SUPPORT
112 #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520)
113 #define wxHAVE_TCHAR_SUPPORT
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
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 */
131 /* VisualAge 4.0+ supports TCHAR */
132 #define wxHAVE_TCHAR_SUPPORT
133 #endif /* compilers with (good) TCHAR support */
139 #ifdef wxHAVE_TCHAR_SUPPORT
140 /* get TCHAR definition if we've got it */
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) */
148 /* and we also do have wcslen() */
152 #endif /* wxHAVE_TCHAR_SUPPORT */
154 /* ---------------------------------------------------------------------------- */
155 /* define wxChar type */
156 /* ---------------------------------------------------------------------------- */
158 /* TODO: define wxCharInt to be equal to either int or wint_t? */
162 typedef signed char wxSChar
;
163 typedef unsigned char wxUChar
;
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 */
170 /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */
172 #if !defined(__WCHAR_TYPE__) || \
173 (!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96))
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 */
192 /* ---------------------------------------------------------------------------- */
193 /* define _T() and related macros */
194 /* ---------------------------------------------------------------------------- */
196 /* BSD systems define _T() to be something different in ctype.h, override it */
197 #if defined(__FreeBSD__) || defined(__DARWIN__)
202 /* could already be defined by tchar.h (it's quasi standard) */
208 #endif /* ASCII/Unicode */
209 #endif /* !defined(_T) */
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 */
216 /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
218 #define __XFILE__(x) wxT(x)
219 #define __TFILE__ __XFILE__(__FILE__)
223 #define __XDATE__(x) wxT(x)
224 #define __TDATE__ __XDATE__(__DATE__)
228 #define __XTIME__(x) wxT(x)
229 #define __TTIME__ __XTIME__(__TIME__)
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
240 #ifdef wxHAVE_TCHAR_SUPPORT
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
258 /* locale.h functons */
259 #define wxSetlocale _tsetlocale
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
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
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) */
309 #define wxSprintf wsprintfW
311 #define wxSprintf wsprintfA
314 #define wxSprintf _stprintf
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
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
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
338 #define wxRemove DeleteFile
340 #define wxRemove _tremove
341 #define wxRename _trename
345 /* stdlib.h functions */
348 /* #define wxAtof _tttof -- notice that there is no such thing (why?) */
349 #define wxGetenv _tgetenv
350 #define wxSystem _tsystem
352 /* time.h functions */
353 #define wxAsctime _tasctime
354 #define wxCtime _tctime
355 #else /* !TCHAR-aware compilers */
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
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 */
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
405 #define wxFgetc fgetwc
406 #define wxFgetchar fgetwchar
407 #define wxFgets fgetws
408 #define wxFputc fputwc
409 #define wxFputchar fputwchar
411 #define wxGetchar getwchar
413 #define wxUngetc ungetwc
417 #define wxPutchar wputchar
419 #define wxFputs fputws
421 #define wxNEED_FPUTWC
425 int wxFputs(const wxChar
*ch
, FILE *stream
);
426 int wxPutc(wxChar ch
, FILE *stream
);
428 #define wxPuts(ws) wxFputs(ws, stdout)
429 #define wxPutchar(wch) wxPutc(wch, stdout)
432 /* we need %s to %ls conversion for printf and scanf etc */
433 #define wxNEED_PRINTF_CONVERSION
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
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
476 #define wxFgetc fgetwc
477 #define wxFgetchar fgetwchar
478 #define wxFgets fgetws
479 #define wxFputc fputwc
480 #define wxFputchar fputwchar
482 #define wxGetchar getwchar
484 #define wxUngetc ungetwc
486 #define wxNEED_PRINTF_CONVERSION
489 #define wxPutchar putwchar
490 #define wxFputs fputws
492 /* stdio.h functions */
494 #define wxNEED_WX_STDIO_H
496 /* stdlib.h functions */
500 #define wxGetenv(a) ((wxChar*)NULL)
501 #define wxSystem(a) ((int)NULL)
503 /* time.h functions */
504 #define wxAsctime wasciitime
505 #define wxCtime wctime
506 /* #define wxStrftime wcsftime */
509 #define wxNEED_FPUTWC
513 int wxFputs(const wxChar *ch, FILE *stream);
514 int wxPutc(wxChar ch, FILE *stream);
516 #define wxPuts(ws) wxFputs(ws, stdout)
517 #define wxPutchar(wch) wxPutc(wch, stdout)
519 #define wxNEED_PRINTF_CONVERSION
520 #define wxNEED_WX_STDIO_H
521 #define wxNEED_WX_STDLIB_H
523 #define wxNEED_WX_TIME_H
524 #else /* !metrowerks for apple */
525 #error "Please define wide character functions for your environment"
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
546 /* locale.h functons */
547 #define wxSetlocale setlocale
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
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
568 #define wxStrtok(str, sep, last) strtok_r(str, sep, last)
570 #define wxStrtol strtol
571 #define wxStrtoul strtoul
572 #define wxStrxfrm strxfrm
574 /* stdio.h functions */
575 #define wxFopen fopen
576 #define wxFreopen freopen
577 #define wxRemove remove
578 #define wxRename rename
580 #define wxPerror perror
581 #define wxTmpnam tmpnam
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
592 #define wxGetchar getchar
594 #define wxPrintf printf
596 #define wxPutchar putchar
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
607 /* stdlib.h functions */
611 #define wxGetenv getenv
612 #define wxSystem system
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 */
622 various special cases
625 /* define wxStricmp and wxStrnicmp for various compilers */
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 */
643 #endif /* !defined(wxStricmp) */
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) */
650 #define wxWcslen wcslen
652 inline size_t wxWcslen(const wchar_t *s
)
661 #endif /* wxUSE_WCHAR_T */
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
; }
667 /* safe version of strlen() (returns 0 if passed NULL pointer) */
668 inline size_t wxStrlen(const wxChar
*psz
) { return psz
? wxStrlen_(psz
) : 0; }
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
679 #define wxStrdup wxStrdupW
681 #define wxStrdup wxStrdupA
685 WXDLLIMPEXP_BASE
bool wxOKlibc(); /* for internal use */
688 /* printf() family saga */
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.
694 #if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL)
696 int vsnprintf(char *str
, size_t size
, const char *format
, va_list ap
);
697 #endif /* !HAVE_VSNPRINTF_DECL */
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()
705 We define function with a trailing underscore here because the real one is a
706 wrapper around it as explained below
710 #if defined(__MWERKS__)
711 #define HAVE_WCSRTOMBS 1
712 #define HAVE_VSWPRINTF 1
714 #if defined(__WATCOMC__)
715 #define wxVsnprintf_ _vsnwprintf
716 #define wxSnprintf_ _snwprintf
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
725 /* all versions of CodeWarrior supported by wxWindows apparently have */
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
733 #endif /* wxVsnprintf_ not defined yet */
736 /* no [v]snprintf(), cook our own */
737 WXDLLIMPEXP_BASE
int wxSnprintf_(wxChar
*buf
, size_t len
, const wxChar
*format
,
738 ...) ATTRIBUTE_PRINTF_3
;
741 WXDLLIMPEXP_BASE
int wxVsnprintf_(wxChar
*buf
, size_t len
, const wxChar
*format
,
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
750 #if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF)
751 #define wxNEED_WPRINTF
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.
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().
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.
769 #undef wxNEED_PRINTF_CONVERSION
772 #if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF)
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
779 #include <stdio.h> /* for FILE */
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 */
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
);
799 #define wxSnprintf wxSnprintf_
800 #define wxVsnprintf wxVsnprintf_
804 various functions which might not be available in libc and for which we
805 provide our own replacements in wxchar.cpp
808 /* ctype.h functions */
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 */
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
831 #define wxIsspace(c) ((((unsigned)c) < 128) && isspace(c))
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.
840 #define wxIsctrl wxIscntrl
842 /* string.h functions */
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 */
875 WXDLLIMPEXP_BASE
char *wxStrdupA(const char *psz
);
879 WXDLLIMPEXP_BASE
wchar_t *wxStrdupW(const wchar_t *pwz
);
883 WXDLLIMPEXP_BASE
int wxStricmp(const wxChar
*psz1
, const wxChar
*psz2
);
887 WXDLLIMPEXP_BASE
int wxStrnicmp(const wxChar
*psz1
, const wxChar
*psz2
, size_t len
);
891 WXDLLIMPEXP_BASE wxChar
* wxStrtok(wxChar
*psz
, const wxChar
*delim
, wxChar
**save_ptr
);
896 class WXDLLIMPEXP_BASE wxWCharBuffer
;
897 WXDLLIMPEXP_BASE wxWCharBuffer
wxSetlocale(int category
, const wxChar
*locale
);
901 /* stdio.h functions */
902 #ifdef wxNEED_WX_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
);
909 /* *printf() family is handled separately */
910 #endif /* wxNEED_WX_STDIO_H */
913 /* stdlib.h functions */
915 WXDLLIMPEXP_BASE
double wxAtof(const wxChar
*psz
);
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
);
926 /* time.h functions */
927 #ifdef wxNEED_WX_TIME_H
928 #if defined(__MWERKS__) && defined(macintosh)
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 */
935 /* missing functions in some WinCE versions */
937 #if (_WIN32_WCE < 300)
938 WXDLLIMPEXP_BASE
void *calloc( size_t num
, size_t size
);
940 WXDLLIMPEXP_BASE
char* strdup(const char* s
);
942 #if _WIN32_WCE <= 211
943 WXDLLIMPEXP_BASE
int isspace(int c
);
944 WXDLLIMPEXP_BASE
int isascii( int c
);
948 /* multibyte to wide char conversion functions and macros */
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
);
956 #define wxMB2WX wxMB2WC
957 #define wxWX2MB wxWC2MB
958 #define wxWC2WX wxStrncpy
959 #define wxWX2WC wxStrncpy
961 #define wxMB2WX wxStrncpy
962 #define wxWX2MB wxStrncpy
963 #define wxWC2WX wxWC2MB
964 #define wxWX2WC wxMB2WC
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
976 #endif /* _WX_WXCHAR_H_ */