]> git.saurik.com Git - wxWidgets.git/blob - src/expat/xmlwf/win32filemap.c
Ryan's display extension
[wxWidgets.git] / src / expat / xmlwf / win32filemap.c
1 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2 See the file COPYING for copying permission.
3 */
4
5 #define STRICT 1
6 #define WIN32_LEAN_AND_MEAN 1
7
8 #ifdef XML_UNICODE_WCHAR_T
9 #ifndef XML_UNICODE
10 #define XML_UNICODE
11 #endif
12 #endif
13
14 #ifdef XML_UNICODE
15 #define UNICODE
16 #define _UNICODE
17 #endif /* XML_UNICODE */
18 #include <windows.h>
19 #include <stdio.h>
20 #include <tchar.h>
21 #include "filemap.h"
22
23 static void win32perror(const TCHAR *);
24
25 int
26 filemap(const TCHAR *name,
27 void (*processor)(const void *, size_t, const TCHAR *, void *arg),
28 void *arg)
29 {
30 HANDLE f;
31 HANDLE m;
32 DWORD size;
33 DWORD sizeHi;
34 void *p;
35
36 f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
37 FILE_FLAG_SEQUENTIAL_SCAN, NULL);
38 if (f == INVALID_HANDLE_VALUE) {
39 win32perror(name);
40 return 0;
41 }
42 size = GetFileSize(f, &sizeHi);
43 if (size == (DWORD)-1) {
44 win32perror(name);
45 return 0;
46 }
47 if (sizeHi) {
48 _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name);
49 return 0;
50 }
51 /* CreateFileMapping barfs on zero length files */
52 if (size == 0) {
53 static const char c = '\0';
54 processor(&c, 0, name, arg);
55 CloseHandle(f);
56 return 1;
57 }
58 m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL);
59 if (m == NULL) {
60 win32perror(name);
61 CloseHandle(f);
62 return 0;
63 }
64 p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0);
65 if (p == NULL) {
66 win32perror(name);
67 CloseHandle(m);
68 CloseHandle(f);
69 return 0;
70 }
71 processor(p, size, name, arg);
72 UnmapViewOfFile(p);
73 CloseHandle(m);
74 CloseHandle(f);
75 return 1;
76 }
77
78 static void
79 win32perror(const TCHAR *s)
80 {
81 LPVOID buf;
82 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
83 | FORMAT_MESSAGE_FROM_SYSTEM,
84 NULL,
85 GetLastError(),
86 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
87 (LPTSTR) &buf,
88 0,
89 NULL)) {
90 _ftprintf(stderr, _T("%s: %s"), s, buf);
91 fflush(stderr);
92 LocalFree(buf);
93 }
94 else
95 _ftprintf(stderr, _T("%s: unknown Windows error\n"), s);
96 }