/* Functions to act on "tchar" strings, which have a platform-dependent encoding
* and character size. */
-#ifdef __WIN32__
+#ifdef _WIN32
#include <wchar.h>
-/* For Windows builds, the "tchar" type will be 2 bytes and will be equivalent
- * to "wchar_t" and "utf16lechar". All indicate one code unit of a UTF16-LE
- * string. */
+/*
+ * For Windows builds, the "tchar" type will be 2 bytes and will be equivalent
+ * to "wchar_t" and "utf16lechar". All indicate one coding unit of a string
+ * encoded in UTF-16LE with the additional possibility of unpaired surrogates.
+ */
typedef wchar_t tchar;
# define TCHAR_IS_UTF16LE 1
# define _T(text) L##text
# define T(text) _T(text) /* Make a string literal into a wide string */
# define TS "ls" /* Format a string of "tchar" */
# define TC "lc" /* Format a "tchar" */
-# define WS "ls" /* Format a UTF-16LE string (same as above) */
/* For Windows builds, the following definitions replace the "tchar" functions
* with the "wide-character" functions. */
# define tmemcpy wmemcpy
# define tmemmove wmemmove
# define tmempcpy wmempcpy
+# define tstrcat wcscat
# define tstrcpy wcscpy
# define tprintf wprintf
# define tsprintf swprintf
# define tfprintf fwprintf
# define tvfprintf vfwprintf
-# define istalpha iswalpha
-# define istspace iswspace
+# define tscanf swscanf
+# define istalpha(c) iswalpha((wchar_t)(c))
+# define istspace(c) iswspace((wchar_t)(c))
+# define totlower(c) towlower((wchar_t)(c))
# define tstrcmp wcscmp
# define tstrncmp wcsncmp
# define tstrchr wcschr
# define tstrpbrk wcspbrk
# define tstrrchr wcsrchr
+# define tstrstr wcsstr
# define tstrlen wcslen
# define tmemcmp wmemcmp
# define tstrcasecmp _wcsicmp
# define tstrtol wcstol
# define tstrtod wcstod
# define tstrtoul wcstoul
+# define tstrtoull wcstoull
# define tunlink _wunlink
# define tstrerror _wcserror
# define taccess _waccess
# define tstrdup wcsdup
-# define ttempnam _wtempnam
# define tgetenv _wgetenv
-# define totlower(c) towlower((wchar_t)(c))
/* The following "tchar" functions do not have exact wide-character equivalents
* on Windows so require parameter rearrangement or redirection to a replacement
* function defined ourselves. */
# define TSTRDUP WCSDUP
# define tmkdir(path, mode) _wmkdir(path)
-# define tstrerror_r win32_strerror_r_replacement
+# define tstrerror_r(errnum, buf, bufsize) \
+ _wcserror_s((buf), (bufsize), (errnum))
# define trename win32_rename_replacement
-# define ttruncate win32_truncate_replacement
# define tglob win32_wglob
-#else /* __WIN32__ */
-/* For non-Windows builds, the "tchar" type will be one byte and will specify a
- * string in the locale-dependent multibyte encoding. However, only UTF-8 is
- * well supported in this library. */
+#else /* _WIN32 */
+/*
+ * For non-Windows builds, the "tchar" type will be one byte and will specify a
+ * string encoded in UTF-8 with the additional possibility of surrogate
+ * codepoints.
+ */
typedef char tchar;
# define TCHAR_IS_UTF16LE 0
# define T(text) text /* In this case, strings of "tchar" are simply strings of
# define TS "s" /* Similarly, a string of "tchar" is printed just as a
normal string. */
# define TC "c" /* Print a single character */
-# define WS "W" /* UTF-16LE strings must be printed using a special
- extension implemented by wimlib itself. Note that
- "ls" will not work here because a string of wide
- characters on non-Windows systems is typically not
- UTF-16LE. */
/* For non-Windows builds, replace the "tchar" functions with the regular old
* string functions. */
# define tmemchr memchr
# define tmemcpy memcpy
# define tmemmove memmove
# define tmempcpy mempcpy
+# define tstrcat strcat
# define tstrcpy strcpy
# define tprintf printf
# define tsprintf sprintf
# define tfprintf fprintf
# define tvfprintf vfprintf
-# define istalpha isalpha
-# define istspace isspace
+# define tscanf sscanf
+# define istalpha(c) isalpha((unsigned char)(c))
+# define istspace(c) isspace((unsigned char)(c))
+# define totlower(c) tolower((unsigned char)(c))
# define tstrcmp strcmp
# define tstrncmp strncmp
# define tstrchr strchr
# define tstrpbrk strpbrk
# define tstrrchr strrchr
+# define tstrstr strstr
# define tstrlen strlen
# define tmemcmp memcmp
# define tstrcasecmp strcasecmp
# define tstrtol strtol
# define tstrtod strtod
# define tstrtoul strtoul
+# define tstrtoull strtoull
# define tmkdir mkdir
# define tstrdup strdup
-# define ttempnam tempnam
# define tgetenv getenv
-# define totlower(c) tolower((unsigned char)(c))
# define TSTRDUP STRDUP
# define tstrerror_r strerror_r
# define trename rename
-# define ttruncate truncate
# define taccess access
# define tglob glob
-#endif /* !__WIN32__ */
+#endif /* !_WIN32 */
#endif /* _WIMLIB_TCHAR_H */