File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / expat / xmlwf / win32filemap.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:00:54 2012 UTC (12 years, 4 months ago) by misho
Branches: expat, MAIN
CVS tags: v2_1_0, v2_0_1p0, v2_0_1, HEAD
expat

    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>