win32filemap.c 2.1 KB

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