Annotation of embedaddon/expat/xmlwf/win32filemap.c, revision 1.1.1.1

1.1       misho       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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>