|
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 } |