X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;h=b688ac216f4be3e490480d220984bea5833af0b8;hp=bd377204a837bd6357ac0970383b307034e0b6bd;hb=c6a1140e085f633273fcf47a6462bd9382ce118a;hpb=276f9f9f9658f4a8bafd6216db46760abe8c848d diff --git a/src/util.c b/src/util.c index bd377204..b688ac21 100644 --- a/src/util.c +++ b/src/util.c @@ -23,8 +23,6 @@ #include "config.h" -#define MINGW_HAS_SECURE_API - #undef _GNU_SOURCE /* Make sure the POSIX-compatible strerror_r() is declared, rather than the GNU * version, which has a different return type. */ @@ -43,7 +41,11 @@ #include /* for getpid() */ -size_t +#ifdef __WIN32__ +#include "win32.h" +#endif + +static size_t utf16le_strlen(const utf16lechar *s) { const utf16lechar *p = s; @@ -52,48 +54,41 @@ utf16le_strlen(const utf16lechar *s) return (p - s) * sizeof(utf16lechar); } -/* Handle %W for UTF16-LE printing and %U for UTF-8 printing. +#ifdef __WIN32__ +# define wimlib_vfprintf vfwprintf +#else +/* Handle %W for UTF16-LE printing. * * TODO: this is not yet done properly--- it's assumed that if the format string - * contains %W and/or %U, then it contains no other format specifiers. + * contains %W, then it contains no other format specifiers. */ static int wimlib_vfprintf(FILE *fp, const tchar *format, va_list va) { const tchar *p; + int n; for (p = format; *p; p++) - if (*p == '%' && (*(p + 1) == T('W') || *(p + 1) == T('U'))) + if (*p == T('%') && *(p + 1) == T('W')) goto special; return tvfprintf(fp, format, va); special: - /* XXX */ - wimlib_assert(0); -#if 0 - ; - int n = 0; + n = 0; for (p = format; *p; p++) { - if (*p == T('%') && (*(p + 1) == T('W') || *(p + 1) == T('U'))) { + if (*p == T('%') && (*(p + 1) == T('W'))) { int ret; - tchar *mbs; - size_t mbs_nbytes; - - if (*(p + 1) == T('W')) { - utf16lechar *ucs = va_arg(va, utf16lechar*); - size_t ucs_nbytes = utf16le_strlen(ucs); - ret = utf16le_to_mbs(ucs, ucs_nbytes, - &mbs, &mbs_nbytes); - } else { - utf8char *ucs = va_arg(va, utf8char*); - size_t ucs_nbytes = strlen(ucs); - ret = utf8_to_mbs(ucs, ucs_nbytes, - &mbs, &mbs_nbytes); - } + tchar *tstr; + size_t tstr_nbytes; + utf16lechar *ucs = va_arg(va, utf16lechar*); + size_t ucs_nbytes = utf16le_strlen(ucs); + + ret = utf16le_to_tstr(ucs, ucs_nbytes, + &tstr, &tstr_nbytes); if (ret) { ret = tfprintf(fp, T("??????")); } else { - ret = tfprintf(fp, T("%s"), mbs); - FREE(mbs); + ret = tfprintf(fp, T("%"TS), tstr); + FREE(tstr); } if (ret < 0) return -1; @@ -101,13 +96,12 @@ special: n += ret; p++; } else { - if (putc(*p, fp) == EOF) + if (tputc(*p, fp) == EOF) return -1; n++; } } return n; -#endif } int @@ -133,6 +127,7 @@ wimlib_fprintf(FILE *fp, const tchar *format, ...) va_end(va); return ret; } +#endif #if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG) static void @@ -486,30 +481,10 @@ randomize_byte_array(u8 *p, size_t n) *p++ = rand(); } -/* Takes in a path of length @len in @buf, and transforms it into a string for - * the path of its parent directory. */ -void -to_parent_name(tchar *buf, size_t len) -{ - ssize_t i = (ssize_t)len - 1; - while (i >= 0 && buf[i] == T('/')) - i--; - while (i >= 0 && buf[i] != T('/')) - i--; - while (i >= 0 && buf[i] == T('/')) - i--; - buf[i + 1] = T('\0'); -} - -/* Like the basename() function, but does not modify @path; it just returns a - * pointer to it. */ const tchar * -path_basename(const tchar *path) +path_basename_with_len(const tchar *path, size_t len) { - const tchar *p = path; - while (*p) - p++; - p--; + const tchar *p = &path[len] - 1; /* Trailing slashes. */ while (1) { @@ -526,6 +501,14 @@ path_basename(const tchar *path) return p + 1; } +/* Like the basename() function, but does not modify @path; it just returns a + * pointer to it. */ +const tchar * +path_basename(const tchar *path) +{ + return path_basename_with_len(path, tstrlen(path)); +} + /* * Returns a pointer to the part of @path following the first colon in the last * path component, or NULL if the last path component does not contain a colon. @@ -541,69 +524,6 @@ path_stream_name(const tchar *path) return stream_name + 1; } -/* - * Splits a file path into the part before the first '/', or the entire name if - * there is no '/', and the part after the first sequence of '/' characters. - * - * @path: The file path to split. - * @first_part_len_ret: A pointer to a `size_t' into which the length of the - * first part of the path will be returned. - * @return: A pointer to the next part of the path, after the first - * sequence of '/', or a pointer to the terminating - * null byte in the case of a path without any '/'. - */ -const tchar * -path_next_part(const tchar *path, size_t *first_part_len_ret) -{ - size_t i; - const tchar *next_part; - - i = 0; - while (path[i] != T('/') && path[i] != T('\0')) - i++; - if (first_part_len_ret) - *first_part_len_ret = i; - next_part = &path[i]; - while (*next_part == T('/')) - next_part++; - return next_part; -} - -/* Returns the number of components of @path. */ -int -get_num_path_components(const char *path) -{ - int num_components = 0; - while (*path) { - while (*path == '/') - path++; - if (*path) - num_components++; - while (*path && *path != '/') - path++; - } - return num_components; -} - - -/* - * Prints a string. Printable characters are printed as-is, while unprintable - * characters are printed as their octal escape codes. - */ -void -print_string(const void *string, size_t len) -{ - const u8 *p = string; - - while (len--) { - if (isprint(*p)) - putchar(*p); - else - printf("\\%03hho", *p); - p++; - } -} - u64 get_wim_timestamp() { @@ -620,3 +540,15 @@ wim_timestamp_to_str(u64 timestamp, tchar *buf, size_t len) gmtime_r(&t, &tm); tstrftime(buf, len, T("%a %b %d %H:%M:%S %Y UTC"), &tm); } + +void +zap_backslashes(tchar *s) +{ + if (s) { + while (*s != T('\0')) { + if (*s == T('\\')) + *s = T('/'); + s++; + } + } +}