hollyhock
Loading...
Searching...
No Matches
file.h
Go to the documentation of this file.
1
59#pragma once
60
61#include <cstdint>
62#ifdef __cplusplus
63extern "C" {
64#else
65#define constexpr
66#endif
67
68#include <stdint.h>
69#include <stddef.h>
70
71#ifndef __clang__
72#define cstr(x) __attribute__((null_terminated_string_arg(x)))
73#define ro(...) __attribute__((access(read_only, __VA_ARGS__)))
74#define rw(...) __attribute__((access(read_write, __VA_ARGS__)))
75#define wo(...) __attribute__((access(write_only, __VA_ARGS__)))
76#else
77#define cstr(x)
78#define ro(...)
79#define rw(...)
80#define wo(...)
81#endif
82
83#define wu __attribute__((warn_unused_result))
84
85// You don't want to work with these
86// but this is the only way to get
87// them relieably right
88typedef uint16_t char_const16_t;
89
94 FILE_OK = 0,
95 FILE_ENOMEM = -1,
96 FILE_EINVAL = -2,
97 FILE_EDEVFAIL = -3,
98 FILE_EMOUNTED = -4,
99 FILE_EACCES = -5,
100 FILE_EBADFSID = -6,
101 FILE_ENOVOLUME = -7,
102 FILE_ENOPATH = -8,
103 FILE_EEXIST = -9,
104 FILE_ENAMETOOLONG = -10,
105 FILE_EOUTOFBOUND = -11,
106 FILE_EUNFORMAT = -12,
107 FILE_ENOSPC = -13,
108 FILE_ENOENT = -14,
109 FILE_EISDIRECTORY = -15,
110 FILE_ESHARE = -16,
111 FILE_EMFILE = -17,
112 FILE_EBADF = -18,
113 FILE_EEOF = -19,
114 FILE_ENOTEMPTY = -20,
115 FILE_ECLUSTERSIZEMISMATCH = -40,
116 FILE_ESYSTEM = -99
117};
118
130
145
152static inline __attribute__((pure)) uint16_t constexpr File_StatDateYear(uint16_t date) {
153 return ((date >> 9) & 0x7F) + 1980;
154}
155
162static inline __attribute__((pure)) uint16_t constexpr File_StatDateMonth(uint16_t date) {
163 return (date >> 5) & 0xF;
164}
165
172static inline __attribute__((pure)) uint16_t constexpr File_StatDateDay(uint16_t date) {
173 return date & 0x1F;
174}
175
182static inline __attribute__((pure)) uint16_t constexpr File_StatTimeHour(uint16_t time) {
183 return (time >> 11) & 0x1F;
184}
185
192static inline __attribute__((pure)) uint16_t constexpr File_StatTimeMinute(uint16_t time) {
193 return (time >> 5) & 0x3F;
194}
195
204static inline __attribute__((pure)) uint16_t constexpr File_StatTimeSecond(uint16_t time) {
205 return (time & 0x1F) * 2;
206}
207
274struct File_Stat {
275 uint32_t unknown1;
276
280 uint32_t fileSize;
281
286 uint16_t creationDate;
287
292 uint16_t creationTime;
293
299
305
306 uint16_t unknown2;
307
313};
314
319struct __attribute__((packed)) File_FindInfo {
320 uint8_t unknown0[4];
321
323 enum {
324 EntryTypeFile = 0x1,
325 EntryTypeDirectory = 0x5
326 } type : 16;
327
328 uint8_t unknown1[2];
329
334 uint32_t size;
335
336 uint8_t unknown2[8];
337};
338
345extern enum File_Error (*File_Close)(int fd);
346
355extern enum File_Error (*File_FindClose)(int findHandle);
356
376extern enum File_Error (*File_FindFirst)(const char_const16_t *path, int *findHandle, char_const16_t *name, struct File_FindInfo *findInfoBuf) wu cstr(1) ro(1) wo(2) wo(3) wo(4);
377
387extern enum File_Error (*File_FindNext)(int findHandle, char_const16_t *name, struct File_FindInfo *findInfoBuf) wu wo(2) wo(3);
388
396extern enum File_Error (*File_Fstat)(int fd, struct File_Stat *buf) wu wo(2);
397
409extern enum File_Error (*File_GetAddr)(int fd, int offset, const void **addr) wu wo(3);
410
420extern int (*File_Lseek)(int fd, int offset, enum File_Whence whence) wu;
421
428extern enum File_Error (*File_Mkdir)(const char *path) wu cstr(1) ro(1);
429
440extern int (*File_Open)(const char *path, int flags) wu cstr(1) ro(1);
441
454extern int (*File_Read)(int fd, void *buf, int count) wu wo(2, 3);
455
462extern enum File_Error (*File_Remove)(const char *path) cstr(1) ro(1);
463
471extern enum File_Error (*File_Rename)(const char *oldPath, const char *newPath) wu cstr(1) cstr(2) ro(1) ro(2);
472
480extern enum File_Error (*File_Stat)(const char *path, struct File_Stat *buf) wu cstr(1) ro(1) wo(2);
481
491extern int (*File_Write)(int fd, const void *buf, int count) wu ro(2, 3);
492
493#undef cstr
494#undef ro
495#undef rw
496#undef wo
497#undef wu
498
499#ifdef __cplusplus
500}
501#else
502#undef constexpr
503#endif
enum File_Error(* File_Rename)(const char *oldPath, const char *newPath) wu cstr(1) cstr(2) ro(1) ro(2)
File_Whence
Definition file.h:122
@ FILE_SEEK_CUR
Set the file offset to the current position, plus offset bytes.
Definition file.h:126
@ FILE_SEEK_SET
Set the file offset to offset.
Definition file.h:124
@ FILE_SEEK_END
Set the file offset to the end of the file, plus offset bytes.
Definition file.h:128
File_Error
Definition file.h:93
enum File_Error(* File_FindNext)(int findHandle, char_const16_t *name, struct File_FindInfo *findInfoBuf) wu wo(2) wo(3)
File_Open
Definition file.h:135
@ FILE_OPEN_READ
Open the file as readable.
Definition file.h:137
@ FILE_OPEN_CREATE
Create the file, if it does not already exist.
Definition file.h:141
@ FILE_OPEN_WRITE
Open the file as writable.
Definition file.h:139
@ FILE_OPEN_APPEND
Opens the file with the file offset set to the end of the file.
Definition file.h:143
enum File_Error(* File_Mkdir)(const char *path) wu cstr(1) ro(1)
enum File_Error(* File_FindClose)(int findHandle)
enum File_Error(* File_FindFirst)(const char_const16_t *path, int *findHandle, char_const16_t *name, struct File_FindInfo *findInfoBuf) wu cstr(1) ro(1) wo(2) wo(3) wo(4)
int(* File_Lseek)(int fd, int offset, enum File_Whence whence) wu
enum File_Error(* File_Close)(int fd)
enum File_Error(* File_Fstat)(int fd, struct File_Stat *buf) wu wo(2)
int(*) enum File_Error(* File_Remove)(const char *path) cstr(1) ro(1)
enum File_Error(* File_GetAddr)(int fd, int offset, const void **addr) wu wo(3)
int(* File_Read)(int fd, void *buf, int count) wu wo(2
int(* File_Write)(int fd, const void *buf, int count) wu ro(2
Definition file.h:274
uint16_t lastModifiedTime
Definition file.h:304
uint16_t lastModifiedDate
Definition file.h:298
uint16_t lastAccessedDate
Definition file.h:312
uint32_t fileSize
Definition file.h:280
uint16_t creationTime
Definition file.h:292
uint16_t creationDate
Definition file.h:286