Annotation of embedaddon/expat/xmlwf/win32filemap.c, revision 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>