X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.h;h=14d620c328c2bea1b07cb2f9b1786335b61452c2;hp=77c4b352a1d549320245b4a0be112ec859b7f737;hb=276f9f9f9658f4a8bafd6216db46760abe8c848d;hpb=8d2bd90a2c9a151edc1619bf35be46b2fdda3e36 diff --git a/src/util.h b/src/util.h index 77c4b352..14d620c3 100644 --- a/src/util.h +++ b/src/util.h @@ -16,8 +16,9 @@ # endif # define ALWAYS_INLINE inline __attribute__((always_inline)) # define PACKED __attribute__((packed)) -# define FORMAT(type, format_str, args_start) \ - __attribute__((format(type, format_str, args_start))) +//# define FORMAT(type, format_str, args_start) \ + //__attribute__((format(type, format_str, args_start))) +# define FORMAT(type, format_str, args_start) # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define COLD __attribute__((cold)) # else @@ -49,25 +50,102 @@ typedef uint32_t u32; typedef uint64_t u64; #endif -/* A pointer to 'mbchar' indicates a string of "multibyte characters" provided - * in the default encoding of the user's locale, which may be "UTF-8", - * "ISO-8859-1", "C", or any other ASCII-compatible encoding. - * "ASCII-compatible" here means any encoding where all ASCII-representable - * characters have the same representation as in ASCII itself, and any non-ASCII - * character is represented as a sequence of one or more bytes not already used - * by any ASCII character. */ -typedef char mbchar; - -/* A pointer to 'utf8char' indicates a UTF-8 encoded string */ -typedef char utf8char; - -/* Note: in some places in the code, strings of plain old 'char' are still used. - * This means that the string is being operated on in an ASCII-compatible way, - * and may be either a multibyte or UTF-8 string. */ /* A pointer to 'utf16lechar' indicates a UTF-16LE encoded string */ typedef u16 utf16lechar; +typedef u8 utf8char; + +#ifdef __WIN32__ +/* 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. */ +typedef wchar_t tchar; +# define TCHAR_IS_UTF16LE 1 +# define T(text) L##text /* Make a string literal into a wide string */ +# define TS "ls" /* Format a string of "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 tmemchr wmemchr +# define tmemcpy wmemcpy +# define tstrcpy wcscpy +# define tprintf wprintf +# define tsprintf swprintf +# define tfprintf fwprintf +# define tvfprintf vfwprintf +# define istalpha iswalpha +# define tstrcmp wcscmp +# define tstrchr wcschr +# define tstrrchr wcsrchr +# define tstrlen wcslen +# define tmemcmp wmemcmp +# define tstrftime wcsftime +# define tputchar putwchar +# define tputc putwc +# define tputs _putws +# define tfputs fputws +# define tfopen _wfopen +# define tstat _wstati64 +# define tstrtol wcstol +# define tunlink _wunlink +/* 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 WSTRDUP +# define tmkdir(path, mode) _wmkdir(path) +# define tstrerror_r(errnum, buf, bufsize) _wcserror_s(buf, bufsize, errnum) +# define trename win32_rename_replacement +# define ttruncate win32_truncate_replacement +#else +/* 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. */ +typedef char tchar; +# define TCHAR_IS_UTF16LE 0 +# define T(text) text /* In this case, strings of "tchar" are simply strings of + char */ +# define TS "s" /* Similarly, a string of "tchar" is printed just as a + normal string. */ +# 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 tstrcpy strcpy +# define tprintf printf +# define tsprintf sprintf +# define tfprintf fprintf +# define tvfprintf vfprintf +# define istalpha isalpha +# define tstrcmp strcmp +# define tstrchr strchr +# define tstrrchr strrchr +# define tstrlen strlen +# define tmemcmp memcmp +# define tstrftime strftime +# define tputchar putchar +# define tputc putc +# define tputs puts +# define tfputs fputs +# define tfopen fopen +# define tstat stat +# define tunlink unlink +# define tstrtol strtol +# define tmkdir mkdir +# define TSTRDUP STRDUP +# define tstrerror_r strerror_r +# define trename rename +# define ttruncate truncate +#endif + +#define TMALLOC(n) MALLOC((n) * sizeof(tchar)) + extern size_t utf16le_strlen(const utf16lechar *s); @@ -93,17 +171,15 @@ varname1##_to_##varname2(const chartype1 *in, size_t in_nbytes, \ chartype2 **out_ret, \ size_t *out_nbytes_ret); \ -/* multi-byte string to UTF16-LE string */ -DECLARE_CHAR_CONVERSION_FUNCTIONS(mbs, utf16le, mbchar, utf16lechar); - -/* UTF16-LE string to multi-byte string */ -DECLARE_CHAR_CONVERSION_FUNCTIONS(utf16le, mbs, utf16lechar, mbchar); +#if !TCHAR_IS_UTF16LE +DECLARE_CHAR_CONVERSION_FUNCTIONS(utf16le, tstr, utf16lechar, tchar); +#endif -/* UTF-8 string to multi-byte string */ -DECLARE_CHAR_CONVERSION_FUNCTIONS(utf8, mbs, utf8char, mbchar); +extern int +utf8_to_tstr_simple(const utf8char *utf8str, tchar **out); -extern bool -utf8_str_contains_nonascii_chars(const utf8char *utf8_str); +extern int +tstr_to_utf8_simple(const tchar *tstr, utf8char **out); #ifndef min #define min(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); \ @@ -152,20 +228,20 @@ dummy_printf(const char *format, ...) #ifdef ENABLE_ERROR_MESSAGES extern void -wimlib_error(const char *format, ...) FORMAT(printf, 1, 2) COLD; +wimlib_error(const tchar *format, ...) FORMAT(printf, 1, 2) COLD; extern void -wimlib_error_with_errno(const char *format, ...) FORMAT(printf, 1, 2) COLD; +wimlib_error_with_errno(const tchar *format, ...) FORMAT(printf, 1, 2) COLD; extern void -wimlib_warning(const char *format, ...) FORMAT(printf, 1, 2) COLD; +wimlib_warning(const tchar *format, ...) FORMAT(printf, 1, 2) COLD; extern void -wimlib_warning_with_errno(const char *format, ...) FORMAT(printf, 1, 2) COLD; -# define ERROR wimlib_error -# define ERROR_WITH_ERRNO wimlib_error_with_errno -# define WARNING wimlib_warning -# define WARNING_WITH_ERRNO wimlib_warning +wimlib_warning_with_errno(const tchar *format, ...) FORMAT(printf, 1, 2) COLD; +# define ERROR(format, ...) wimlib_error(T(format), ## __VA_ARGS__) +# define ERROR_WITH_ERRNO(format, ...) wimlib_error_with_errno(T(format), ## __VA_ARGS__) +# define WARNING(format, ...) wimlib_warning(T(format), ## __VA_ARGS__) +# define WARNING_WITH_ERRNO(format, ...) wimlib_warning(T(format), ## __VA_ARGS__) #else /* ENABLE_ERROR_MESSAGES */ # define ERROR(format, ...) dummy_printf(format, ## __VA_ARGS__) # define ERROR_WITH_ERRNO(format, ...) dummy_printf(format, ## __VA_ARGS__) @@ -183,10 +259,10 @@ wimlib_warning_with_errno(const char *format, ...) FORMAT(printf, 1, 2) COLD; #ifdef ENABLE_DEBUG extern void -wimlib_debug(const char *file, int line, const char *func, - const char *format, ...); +wimlib_debug(const tchar *file, int line, const char *func, + const tchar *format, ...); # define DEBUG(format, ...) \ - wimlib_debug(__FILE__, __LINE__, __func__, format, ## __VA_ARGS__); + wimlib_debug(T(__FILE__), __LINE__, __func__, T(format), ## __VA_ARGS__); #else # define DEBUG(format, ...) dummy_printf(format, ## __VA_ARGS__) @@ -218,12 +294,16 @@ extern void *(*wimlib_malloc_func)(size_t); extern void (*wimlib_free_func)(void *); extern void *(*wimlib_realloc_func)(void *, size_t); extern void *wimlib_calloc(size_t nmemb, size_t size); +#ifdef __WIN32__ +extern wchar_t *wimlib_wcsdup(const wchar_t *str); +#endif extern char *wimlib_strdup(const char *str); # define MALLOC wimlib_malloc_func # define FREE wimlib_free_func # define REALLOC wimlib_realloc_func # define CALLOC wimlib_calloc # define STRDUP wimlib_strdup +# define WSTRDUP wimlib_wcsdup #else /* ENABLE_CUSTOM_MEMORY_ALLOCATOR */ # include # include @@ -232,6 +312,7 @@ extern char *wimlib_strdup(const char *str); # define REALLOC realloc # define CALLOC calloc # define STRDUP strdup +# define WSTRDUP wcsdup #endif /* !ENABLE_CUSTOM_MEMORY_ALLOCATOR */ @@ -240,19 +321,19 @@ extern void randomize_byte_array(u8 *p, size_t n); extern void -randomize_char_array_with_alnum(char p[], size_t n); +randomize_char_array_with_alnum(tchar p[], size_t n); -extern const char * -path_next_part(const char *path, size_t *first_part_len_ret); +extern const tchar * +path_next_part(const tchar *path, size_t *first_part_len_ret); -extern const char * -path_basename(const char *path); +const tchar * +path_basename(const tchar *path); -extern const char * -path_stream_name(const char *path); +extern const tchar * +path_stream_name(const tchar *path); extern void -to_parent_name(char buf[], size_t len); +to_parent_name(tchar *buf, size_t len); extern void print_string(const void *string, size_t len); @@ -264,7 +345,7 @@ static inline void print_byte_field(const u8 field[], size_t len) { while (len--) - printf("%02hhx", *field++); + tprintf(T("%02hhx"), *field++); } static inline u32 @@ -284,12 +365,12 @@ bsr32(u32 n) } extern int -wimlib_fprintf(FILE *fp, const char *format, ...) +wimlib_fprintf(FILE *fp, const tchar *format, ...) //FORMAT(printf, 2, 3) ; extern int -wimlib_printf(const char *format, ...) +wimlib_printf(const tchar *format, ...) //FORMAT(printf, 1, 2) ;