#ifndef CGE_FILE_H #define CGE_FILE_H #include #include enum CgeFileMode { CGE_FILE_READ = (1 << 0), CGE_FILE_WRITE = (1 << 1), CGE_FILE_READWRITE = (1 << 0) | (1 << 1), CGE_FILE_APPEND = (1 << 4), CGE_FILE_TRUNCATE = (1 << 5), CGE_FILE_CREATE = (1 << 6), CGE_FILE_EXIST = (1 << 7), }; enum CgeFileSeek { CGE_FILE_SET, CGE_FILE_CUR, CGE_FILE_END, }; enum CgeFileFlags { CGE_FILE_OK = (1 << 0), CGE_FILE_ERROR = (1 << 1), CGE_FILE_EOF = (1 << 2), }; enum CgeFileCode { CGE_FILE_EOK, /* Success */ CGE_FILE_EUNKNOWN, /* Unknown or unexpected error */ CGE_FILE_EOOM, /* Out of memory */ CGE_FILE_ENOSPC, /* No space left on device */ CGE_FILE_EINVAL, /* Invalid mode/flag combination */ CGE_FILE_ENOENT, /* No such file or directory */ CGE_FILE_EACCES, /* Permission denied */ CGE_FILE_EROFS, /* Read-only file system */ CGE_FILE_EEXIST, /* File already exists */ CGE_FILE_EISDIR, /* Is a directory */ CGE_FILE_EMFILE, /* Too many open files */ CGE_FILE_ENAMETOOLONG /* File name too long */ }; typedef struct CgeFile CgeFile; CgeFile *CgeFileNew(const char *path, int mode, int *result); void CgeFileFree(CgeFile *file); int CgeFileRead(CgeFile *file, char *buffer, size_t size, size_t *actual); int CgeFileWrite(CgeFile *file, const char *buffer, size_t size, size_t *actual); int CgeFilePeek(CgeFile *file, char *buffer, size_t size, size_t *actual); int CgeFileTell(CgeFile *file, int64_t *offset); int CgeFileSeek(CgeFile *file, int64_t offset, int whence); int CgeFileFlush(CgeFile *file); int CgeFileSize(CgeFile *file, int64_t *size); int CgeFileFlags(CgeFile *file, int *flags); int CgeFileError(CgeFile *file); int CgeFileEndOfFile(CgeFile *file); int CgeFileClear(CgeFile *file); int CgeFileErrorCode(CgeFile *file); #endif /* CGE_FILE_H */