diff --git a/expat/xmlwf/win32filemap.c b/expat/xmlwf/win32filemap.c new file mode 100755 index 00000000..62b210cb --- /dev/null +++ b/expat/xmlwf/win32filemap.c @@ -0,0 +1,50 @@ +#define STRICT 1 +#include +#include +#include "filemap.h" + +int filemap(const char *name, + void (*processor)(const void *, size_t, const char *, void *arg), + void *arg) +{ + HANDLE f; + HANDLE m; + DWORD size; + DWORD sizeHi; + void *p; + + f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (f == INVALID_HANDLE_VALUE) { + fprintf(stderr, "%s: CreateFile failed\n", name); + return 0; + } + size = GetFileSize(f, &sizeHi); + if (sizeHi) { + fprintf(stderr, "%s: too big (limit 2Gb)\n", name); + return 0; + } + /* CreateFileMapping barfs on zero length files */ + if (size == 0) { + fprintf(stderr, "%s: zero-length file\n", name); + return 0; + } + m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); + if (m == NULL) { + fprintf(stderr, "%s: CreateFileMapping failed\n", name); + CloseHandle(f); + return 0; + } + p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); + if (p == NULL) { + CloseHandle(m); + CloseHandle(f); + fprintf(stderr, "%s: MapViewOfFile failed\n", name); + return 0; + } + processor(p, size, name, arg); + UnmapViewOfFile(p); + CloseHandle(m); + CloseHandle(f); + return 1; +}