1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef _MMAP_INCLUDED_
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define _MMAP_INCLUDED_
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Encapsulate memory mapped files
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockclass TMMap {
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockpublic:
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TMMap(const char* fileName) :
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fSize(-1), // -1 is the error value returned by GetFileSize()
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fp(NULL),
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fBuff(0)   // 0 is the error value returned by MapViewOfFile()
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if ((fp = fopen(fileName, "r")) == NULL)
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        char c = getc(fp);
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fSize = 0;
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        while (c != EOF) {
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            fSize++;
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            c = getc(fp);
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (c == EOF)
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            fSize++;
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        rewind(fp);
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fBuff = (char*)malloc(sizeof(char) * fSize);
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        int count = 0;
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        c = getc(fp);
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        while (c != EOF) {
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            fBuff[count++] = c;
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            c = getc(fp);
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        fBuff[count++] = c;
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    char* getData() { return fBuff; }
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int   getSize() { return fSize; }
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    ~TMMap() {
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (fp != NULL)
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            fclose(fp);
48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockprivate:
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int             fSize;      // size of file to map in
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    FILE *fp;
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    char*           fBuff;      // the actual data;
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block};
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif // _MMAP_INCLUDED_
57