Imported Upstream version 0.6.3
[fdkaac.git] / src / compat_win32.c
index d640baf0f3095fd7722d9baf12b29837e665de57..8acbda2de858f838d22727534d79865db4618864 100644 (file)
 #include <assert.h>
 #include <io.h>
 #include <fcntl.h>
+#include <share.h>
 #include <sys/timeb.h>
 #include "compat.h"
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-
-typedef struct
-{
-    int newmode;
-} _startupinfo;
-
-extern
-int __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, _startupinfo *);
+#include <shellapi.h>
 
 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;
 }
 
+int aacenc_seekable(FILE *fp)
+{
+    return GetFileType((HANDLE)_get_osfhandle(_fileno(fp))) == FILE_TYPE_DISK;
+}
+
 static
 int codepage_decode_wchar(int codepage, const char *from, wchar_t **to)
 {
@@ -66,9 +70,12 @@ 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);
     }
@@ -82,20 +89,20 @@ void aacenc_free_mainargs(void)
 {
     char **p = __aacenc_argv__;
     for (; *p; ++p)
-       free(*p);
+        free(*p);
     free(__aacenc_argv__);
 }
 
 void aacenc_getmainargs(int *argc, char ***argv)
 {
     int i;
-    wchar_t **wargv, **envp;
-    _startupinfo si = { 0 };
+    wchar_t **wargv;
 
-    __wgetmainargs(argc, &wargv, &envp, 1, &si);
+    wargv = CommandLineToArgvW(GetCommandLineW(), argc);
     *argv = malloc((*argc + 1) * sizeof(char*));
     for (i = 0; i < *argc; ++i)
         codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]);
+        LocalFree(wargv);
     (*argv)[*argc] = 0;
     __aacenc_argv__ = *argv;
     atexit(aacenc_free_mainargs);
@@ -148,7 +155,7 @@ int aacenc_fprintf(FILE *fp, const char *fmt, ...)
         codepage_decode_wchar(CP_UTF8, s, &ws);
         free(s);
         fflush(fp);
-        WriteConsoleW(fh, ws, cnt, &nw, 0);
+        WriteConsoleW(fh, ws, wcslen(ws), &nw, 0);
         free(ws);
     }
     return cnt;
This page took 0.01117 seconds and 4 git commands to generate.