#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)
{
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);
}
{
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);
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;