14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#ifndef _MMAP_INCLUDED_
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#define _MMAP_INCLUDED_
94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Encapsulate memory mapped files
124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass TMMap {
154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.compublic:
164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    TMMap(const char* fileName) :
174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fSize(-1), // -1 is the error value returned by GetFileSize()
184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fp(NULL),
194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fBuff(0)   // 0 is the error value returned by MapViewOfFile()
204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    {
214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if ((fp = fopen(fileName, "r")) == NULL)
224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            return;
234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        char c = getc(fp);
244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fSize = 0;
254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        while (c != EOF) {
264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            fSize++;
274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            c = getc(fp);
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (c == EOF)
304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            fSize++;
314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        rewind(fp);
324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fBuff = (char*)malloc(sizeof(char) * fSize);
334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        int count = 0;
344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        c = getc(fp);
354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        while (c != EOF) {
364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            fBuff[count++] = c;
374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            c = getc(fp);
384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        }
394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        fBuff[count++] = c;
404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    char* getData() { return fBuff; }
434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    int   getSize() { return fSize; }
444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    ~TMMap() {
464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com        if (fp != NULL)
474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com            fclose(fp);
484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    }
494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comprivate:
514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    int             fSize;      // size of file to map in
524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    FILE *fp;
534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    char*           fBuff;      // the actual data;
544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#endif // _MMAP_INCLUDED_
57