aboutsummaryrefslogtreecommitdiffstats
path: root/src/gfile/gfile_fs.h
blob: 4675352d1dd2e67dd2f994c8f9b0edaacbd7df40 (plain)
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
/*
 * 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.io/license.html
 */

/**
 * @file    src/gfile/gfile_fs.h
 * @brief   GFILE file system header.
 *
 */

#ifndef _GFILE_FS_H
#define _GFILE_FS_H

struct GFILE {
	const struct GFILEVMT *	vmt;
	gU16				flags;
		#define	GFILEFLG_OPEN			0x0001		// File is open
		#define	GFILEFLG_READ			0x0002		// Read the file
		#define	GFILEFLG_WRITE			0x0004		// Write the file
		#define	GFILEFLG_APPEND			0x0008		// Append on each write
		#define GFILEFLG_BINARY			0x0010		// Treat as a binary file
		#define	GFILEFLG_DELONCLOSE		0x0020		// Delete on close
		#define	GFILEFLG_CANSEEK		0x0040		// Seek operations are valid
		#define GFILEFLG_FAILONBLOCK	0x0080		// Fail on a blocking call
		#define GFILEFLG_MUSTEXIST		0x0100		// On open file must exist
		#define GFILEFLG_MUSTNOTEXIST	0x0200		// On open file must not exist
		#define GFILEFLG_TRUNC			0x0400		// On open truncate the file
	void *					obj;
	gFileSize				pos;
};

struct gfileList {
	const struct GFILEVMT *	vmt;
	gBool					dirs;
};

typedef struct GFILEVMT {
	gU8					flags;
		#define GFSFLG_WRITEABLE		0x0001
		#define GFSFLG_CASESENSITIVE	0x0002
		#define GFSFLG_SEEKABLE			0x0004
		#define GFSFLG_FAST				0x0010
		#define GFSFLG_SMALL			0x0020
		#define GFSFLG_TEXTMODES		0x0040
	char					prefix;
	gBool		(*del)		(const char *fname);
	gBool		(*exists)	(const char *fname);
	gFileSize	(*filesize)	(const char *fname);
	gBool		(*ren)		(const char *oldname, const char *newname);
	gBool		(*open)		(GFILE *f, const char *fname);
	void		(*close)	(GFILE *f);
	int			(*read)		(GFILE *f, void *buf, int size);
	int			(*write)	(GFILE *f, const void *buf, int size);
	gBool		(*setpos)	(GFILE *f, gFileSize pos);
	gFileSize	(*getsize)	(GFILE *f);
	gBool		(*eof)		(GFILE *f);
	gBool		(*mount)	(const char *drive);
	gBool		(*unmount)	(const char *drive);
	gBool		(*sync)		(GFILE *f);
	#if GFILE_NEED_FILELISTS
		gfileList *	(*flopen)	(const char *path, gBool dirs);
		const char *(*flread)	(gfileList *pfl);
		void		(*flclose)	(gfileList *pfl);
	#endif
} GFILEVMT;

GFILE *_gfileFindSlot(const char *mode);

#endif //_GFILE_FS_H