Chromium Code Reviews| Index: tools/re2c/code.c |
| =================================================================== |
| --- tools/re2c/code.c (revision 134825) |
| +++ tools/re2c/code.c (working copy) |
| @@ -1,3 +1,7 @@ |
| +#ifdef _WIN32 |
| +#include <windows.h> |
| +#include <io.h> |
| +#endif |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| @@ -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; |
|
Nico
2012/05/02 16:52:05
This indent looks different from the upstream patc
scottmg
2012/05/02 16:58:23
The pretty diff page on github isn't replacing tab
|
| + |
| + 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 @@ |
| 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); |