1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/*
* This file is subject to the terms of the GFX License. If a copy of
* the license was not distributed with this file, you can obtain one at:
*
* http://ugfx.org/license.html
*/
/**
* This file is included by src/gfile/gfile.c
*/
/********************************************************
* The ROM file-system VMT
********************************************************/
#include <string.h>
// What directory file formats do we understand
#define ROMFS_DIR_VER_MAX 0x0000
// Compression Formats
#define ROMFS_CMP_UNCOMPRESSED 0
typedef struct ROMFS_DIRENTRY {
uint16_t ver; // Directory Entry Version
uint16_t cmp; // Compression format
const struct ROMFS_DIRENTRY * next; // The next entry
const char * name; // The file name
long int size; // The file size
const char * file; // The file data
} ROMFS_DIRENTRY;
#define ROMFS_DIRENTRY_HEAD 0
#include "romfs_files.h"
static const ROMFS_DIRENTRY const *FsROMHead = ROMFS_DIRENTRY_HEAD;
static bool_t ROMExists(const char *fname);
static long int ROMFilesize(const char *fname);
static bool_t ROMOpen(GFILE *f, const char *fname);
static void ROMClose(GFILE *f);
static int ROMRead(GFILE *f, void *buf, int size);
static bool_t ROMSetpos(GFILE *f, long int pos);
static long int ROMGetsize(GFILE *f);
static bool_t ROMEof(GFILE *f);
static const GFILEVMT FsROMVMT = {
GFILE_CHAINHEAD, // next
GFSFLG_CASESENSITIVE|GFSFLG_SEEKABLE|GFSFLG_FAST, // flags
'S', // prefix
0, ROMExists, ROMFilesize, 0,
ROMOpen, ROMClose, ROMRead, 0,
ROMSetpos, ROMGetsize, ROMEof,
};
#undef GFILE_CHAINHEAD
#define GFILE_CHAINHEAD &FsROMVMT
static const ROMFS_DIRENTRY *ROMFindFile(const char *fname) {
const ROMFS_DIRENTRY *p;
for(p = FsROMHead; p; p = p->next) {
if (p->ver <= ROMFS_DIR_VER_MAX && p->cmp == ROMFS_CMP_UNCOMPRESSED && !strcmp(p->name, fname))
break;
}
return p;
}
static bool_t ROMExists(const char *fname) { return ROMFindFile(fname) != 0; }
static long int ROMFilesize(const char *fname) {
const ROMFS_DIRENTRY *p;
if (!(p = ROMFindFile(fname))) return -1;
return p->size;
}
static bool_t ROMOpen(GFILE *f, const char *fname) {
const ROMFS_DIRENTRY *p;
if (!(p = ROMFindFile(fname))) return FALSE;
f->obj = (void *)p;
return TRUE;
}
static void ROMClose(GFILE *f) { (void)f; }
static int ROMRead(GFILE *f, void *buf, int size) {
const ROMFS_DIRENTRY *p;
p = (const ROMFS_DIRENTRY *)f->obj;
if (p->size - f->pos < size)
size = p->size - f->pos;
if (size <= 0) return 0;
memcpy(buf, p->file+f->pos, size);
return size;
}
static bool_t ROMSetpos(GFILE *f, long int pos) { return pos <= ((const ROMFS_DIRENTRY *)f->obj)->size; }
static long int ROMGetsize(GFILE *f) { return ((const ROMFS_DIRENTRY *)f->obj)->size; }
static bool_t ROMEof(GFILE *f) { return f->pos >= ((const ROMFS_DIRENTRY *)f->obj)->size; }
|