Home | History | Annotate | Download | only in xmlwf
      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 }
     97