X-Git-Url: http://git.ieval.ro/?p=fdkaac.git;a=blobdiff_plain;f=src%2Fcompat_win32.c;h=4e3776c06841beff6d54eae4a49d13769a5ec3d1;hp=a68fa3f3341d1c7565ae10f8ec98aaa86e30d1d0;hb=ffc230a83edf094dfa39a11afe2febdee498e48e;hpb=48e2f01c5653c8f643b2a763e1cfa2efc1eccd60 diff --git a/src/compat_win32.c b/src/compat_win32.c index a68fa3f..4e3776c 100644 --- a/src/compat_win32.c +++ b/src/compat_win32.c @@ -12,8 +12,10 @@ #include #include #include +#include #include #include +#include #include #include "compat.h" #define WIN32_LEAN_AND_MEAN @@ -29,8 +31,13 @@ int __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, _startupinfo *); int64_t aacenc_timer(void) { +#if HAVE_STRUCT___TIMEB64 struct __timeb64 tv; _ftime64(&tv); +#else + struct timeb tv; + ftime(&tv); +#endif return (int64_t)tv.time * 1000 + tv.millitm; } @@ -65,15 +72,29 @@ FILE *aacenc_fopen(const char *name, const char *mode) fp = (mode[0] == 'r') ? stdin : stdout; _setmode(_fileno(fp), _O_BINARY); } else { + int share = _SH_DENYRW; + if (strchr(mode, 'r') && !strchr(mode, '+')) + share = _SH_DENYWR; codepage_decode_wchar(CP_UTF8, name, &wname); codepage_decode_wchar(CP_UTF8, mode, &wmode); - fp = _wfopen(wname, wmode); + fp = _wfsopen(wname, wmode, share); free(wname); free(wmode); } return fp; } +static char **__aacenc_argv__; + +static +void aacenc_free_mainargs(void) +{ + char **p = __aacenc_argv__; + for (; *p; ++p) + free(*p); + free(__aacenc_argv__); +} + void aacenc_getmainargs(int *argc, char ***argv) { int i; @@ -85,6 +106,8 @@ void aacenc_getmainargs(int *argc, char ***argv) for (i = 0; i < *argc; ++i) codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]); (*argv)[*argc] = 0; + __aacenc_argv__ = *argv; + atexit(aacenc_free_mainargs); } char *aacenc_to_utf8(const char *s) @@ -92,6 +115,20 @@ char *aacenc_to_utf8(const char *s) return _strdup(s); } +#if defined(__MINGW32__) && !defined(HAVE__VSCPRINTF) +int _vscprintf(const char *fmt, va_list ap) +{ + static int (*fp_vscprintf)(const char *, va_list) = 0; + if (!fp_vscprintf) { + HANDLE h = GetModuleHandleA("msvcrt.dll"); + FARPROC fp = GetProcAddress(h, "_vscprintf"); + InterlockedCompareExchangePointer(&fp_vscprintf, fp, 0); + } + assert(fp_vscprintf); + return fp_vscprintf(fmt, ap); +} +#endif + int aacenc_fprintf(FILE *fp, const char *fmt, ...) { va_list ap; @@ -126,3 +163,15 @@ int aacenc_fprintf(FILE *fp, const char *fmt, ...) return cnt; } +const char *aacenc_basename(const char *path) +{ +/* + * Since path is encoded with UTF-8, naive usage of strrchr() shoule be safe. + */ + const char *p = strrchr(path, '/'); + const char *q = strrchr(path, '\\'); + const char *r = strrchr(path, ':'); + if (q > p) p = q; + if (r > p) p = r; + return p ? p + 1 : path; +}