| /* |
| __ __ _ |
| ___\ \/ /_ __ __ _| |_ |
| / _ \\ /| '_ \ / _` | __| |
| | __// \| |_) | (_| | |_ |
| \___/_/\_\ .__/ \__,_|\__| |
| |_| XML parser |
| |
| Copyright (c) 1997-2000 Thai Open Source Software Center Ltd |
| Copyright (c) 2000 Clark Cooper <coopercc@users.sourceforge.net> |
| Copyright (c) 2002 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> |
| Copyright (c) 2016-2017 Sebastian Pipping <sebastian@pipping.org> |
| Licensed under the MIT license: |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to permit |
| persons to whom the Software is furnished to do so, subject to the |
| following conditions: |
| |
| The above copyright notice and this permission notice shall be included |
| in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #define STRICT 1 |
| #define WIN32_LEAN_AND_MEAN 1 |
| |
| #ifdef XML_UNICODE_WCHAR_T |
| # ifndef XML_UNICODE |
| # define XML_UNICODE |
| # endif |
| #endif |
| |
| #ifdef XML_UNICODE |
| # define UNICODE |
| # define _UNICODE |
| #endif /* XML_UNICODE */ |
| #include <windows.h> |
| #include <stdio.h> |
| #include <tchar.h> |
| #include "filemap.h" |
| |
| static void win32perror(const TCHAR *); |
| |
| int |
| filemap(const TCHAR *name, |
| void (*processor)(const void *, size_t, const TCHAR *, 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) { |
| win32perror(name); |
| return 0; |
| } |
| size = GetFileSize(f, &sizeHi); |
| if (size == (DWORD)-1) { |
| win32perror(name); |
| CloseHandle(f); |
| return 0; |
| } |
| if (sizeHi || (size > XML_MAX_CHUNK_LEN)) { |
| CloseHandle(f); |
| return 2; /* Cannot be passed to XML_Parse in one go */ |
| } |
| /* CreateFileMapping barfs on zero length files */ |
| if (size == 0) { |
| static const char c = '\0'; |
| processor(&c, 0, name, arg); |
| CloseHandle(f); |
| return 1; |
| } |
| m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); |
| if (m == NULL) { |
| win32perror(name); |
| CloseHandle(f); |
| return 0; |
| } |
| p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); |
| if (p == NULL) { |
| win32perror(name); |
| CloseHandle(m); |
| CloseHandle(f); |
| return 0; |
| } |
| processor(p, size, name, arg); |
| UnmapViewOfFile(p); |
| CloseHandle(m); |
| CloseHandle(f); |
| return 1; |
| } |
| |
| static void |
| win32perror(const TCHAR *s) { |
| LPVOID buf; |
| if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, |
| NULL, GetLastError(), |
| MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, |
| NULL)) { |
| _ftprintf(stderr, _T("%s: %s"), s, buf); |
| fflush(stderr); |
| LocalFree(buf); |
| } else |
| _ftprintf(stderr, _T("%s: unknown Windows error\n"), s); |
| } |