From f164a228f51c17ffc3ed69516a7dc6abdf2d2c8e Mon Sep 17 00:00:00 2001 From: "scottmg@chromium.org" Date: Wed, 2 May 2012 16:59:26 +0000 Subject: Merge https://github.com/yasm/yasm/commit/ab19547382660d81e0b4a0232dccb38f44c52a36 Review URL: https://chromiumcodereview.appspot.com/10324002 git-svn-id: http://src.chromium.org/svn/trunk/deps/third_party/yasm/patched-yasm@134927 4ff67af0-8c30-449e-8e8b-ad334ec8d88c --- tools/re2c/code.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tools/re2c/code.c b/tools/re2c/code.c index 8a78eaa..bd54baa 100644 --- a/tools/re2c/code.c +++ b/tools/re2c/code.c @@ -1,3 +1,7 @@ +#ifdef _WIN32 +#include +#include +#endif #include #include #include @@ -6,6 +10,57 @@ #include "tools/re2c/dfa.h" #include "tools/re2c/parse.h" +#ifdef _WIN32 +/* tmpfile() replacment for Windows. + * + * On Windows tmpfile() creates the file in the root directory. This + * may fail due to unsufficient privileges. + */ +static FILE * +win32_tmpfile (void) +{ + DWORD path_len; + WCHAR path_name[MAX_PATH + 1]; + WCHAR file_name[MAX_PATH + 1]; + HANDLE handle; + int fd; + FILE *fp; + + path_len = GetTempPathW (MAX_PATH, path_name); + if (path_len <= 0 || path_len >= MAX_PATH) + return NULL; + + if (GetTempFileNameW (path_name, L"ps_", 0, file_name) == 0) + return NULL; + + handle = CreateFileW (file_name, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + DeleteFileW (file_name); + return NULL; + } + + fd = _open_osfhandle((intptr_t) handle, 0); + if (fd < 0) { + CloseHandle (handle); + return NULL; + } + + fp = fdopen(fd, "w+b"); + if (fp == NULL) { + _close(fd); + return NULL; + } + + return fp; +} +#endif + static void useLabel(size_t value) { while (value >= vUsedLabelAlloc) { vUsedLabels = realloc(vUsedLabels, vUsedLabelAlloc * 2); @@ -844,7 +899,11 @@ void DFA_emit(DFA *d, FILE *o){ nOrgOline = oline; maxFillIndexes = vFillIndexes; orgVFillIndexes = vFillIndexes; +#ifdef _WIN32 + tmpo = win32_tmpfile(); +#else tmpo = tmpfile(); +#endif for(s = d->head; s; s = s->next){ int readCh = 0; State_emit(s, tmpo, &readCh); -- cgit v1.2.3