src/util/vfs.h (view raw)
1/* Copyright (c) 2013-2014 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef VFS_H
7#define VFS_H
8
9#include "util/common.h"
10
11#ifdef _WIN32
12#include <io.h>
13#include <windows.h>
14#define PATH_SEP "/" // Windows can handle slashes, and backslashes confuse some libraries
15#else
16#define PATH_SEP "/"
17#endif
18
19#ifndef PATH_MAX
20#ifdef MAX_PATH
21#define PATH_MAX MAX_PATH
22#else
23#define PATH_MAX 128
24#endif
25#endif
26
27enum {
28 MAP_READ = 1,
29 MAP_WRITE = 2
30};
31
32enum VFSType {
33 VFS_UNKNOWN = 0,
34 VFS_FILE,
35 VFS_DIRECTORY
36};
37
38struct VFile {
39 bool (*close)(struct VFile* vf);
40 off_t (*seek)(struct VFile* vf, off_t offset, int whence);
41 ssize_t (*read)(struct VFile* vf, void* buffer, size_t size);
42 ssize_t (*readline)(struct VFile* vf, char* buffer, size_t size);
43 ssize_t (*write)(struct VFile* vf, const void* buffer, size_t size);
44 void* (*map)(struct VFile* vf, size_t size, int flags);
45 void (*unmap)(struct VFile* vf, void* memory, size_t size);
46 void (*truncate)(struct VFile* vf, size_t size);
47 ssize_t (*size)(struct VFile* vf);
48 bool (*sync)(struct VFile* vf, const void* buffer, size_t size);
49};
50
51struct VDirEntry {
52 const char* (*name)(struct VDirEntry* vde);
53 enum VFSType (*type)(struct VDirEntry* vde);
54};
55
56struct VDir {
57 bool (*close)(struct VDir* vd);
58 void (*rewind)(struct VDir* vd);
59 struct VDirEntry* (*listNext)(struct VDir* vd);
60 struct VFile* (*openFile)(struct VDir* vd, const char* name, int mode);
61 struct VDir* (*openDir)(struct VDir* vd, const char* name);
62 bool (*deleteFile)(struct VDir* vd, const char* name);
63};
64
65struct VFile* VFileOpen(const char* path, int flags);
66
67struct VFile* VFileOpenFD(const char* path, int flags);
68struct VFile* VFileFromFD(int fd);
69
70struct VFile* VFileFromMemory(void* mem, size_t size);
71struct VFile* VFileFromConstMemory(const void* mem, size_t size);
72struct VFile* VFileMemChunk(const void* mem, size_t size);
73
74struct VDir* VDirOpen(const char* path);
75struct VDir* VDirOpenArchive(const char* path);
76
77#if defined(USE_LIBZIP) || defined(USE_ZLIB)
78struct VDir* VDirOpenZip(const char* path, int flags);
79#endif
80
81#ifdef USE_LZMA
82struct VDir* VDirOpen7z(const char* path, int flags);
83#endif
84
85#if defined(WII) || defined(_3DS)
86struct VFile* VFileFOpen(const char* path, const char* mode);
87struct VFile* VFileFromFILE(FILE* file);
88struct VDir* VDeviceList(void);
89#endif
90
91void separatePath(const char* path, char* dirname, char* basename, char* extension);
92
93struct VFile* VDirFindFirst(struct VDir* dir, bool (*filter)(struct VFile*));
94struct VFile* VDirFindNextAvailable(struct VDir*, const char* basename, const char* infix, const char* suffix, int mode);
95
96ssize_t VFileReadline(struct VFile* vf, char* buffer, size_t size);
97
98ssize_t VFileWrite32LE(struct VFile* vf, int32_t word);
99ssize_t VFileWrite16LE(struct VFile* vf, int16_t hword);
100ssize_t VFileRead32LE(struct VFile* vf, void* word);
101ssize_t VFileRead16LE(struct VFile* vf, void* hword);
102
103#endif