#ifndef BLUELIB_IO_FILE_H_ #define BLUELIB_IO_FILE_H_ #include #include #include #include #define B_FILE(p) ((b_file *)(p)) #define B_OFFSET_CURRENT ((size_t) - 1) struct b_directory; struct b_path; typedef enum b_seek_basis { B_SEEK_BEGINNING, B_SEEK_CURRENT, B_SEEK_END } b_seek_basis; typedef enum b_file_attribute { B_FILE_ATTRIB_NORMAL = 0x01u, B_FILE_ATTRIB_DIRECTORY = 0x02u, B_FILE_ATTRIB_BLOCK_DEVICE = 0x04u, B_FILE_ATTRIB_CHAR_DEVICE = 0x08u, B_FILE_ATTRIB_SYMLINK = 0x80u, } b_file_attribute; typedef enum b_file_mode { B_FILE_READ_ONLY = 0x01u, B_FILE_WRITE_ONLY = 0x02u, B_FILE_READ_WRITE = B_FILE_READ_ONLY | B_FILE_WRITE_ONLY, B_FILE_TRUNCATE = 0x04u, B_FILE_CREATE = 0x08u, B_FILE_CREATE_ONLY = 0x10u | B_FILE_CREATE, B_FILE_APPEND = 0x20u, B_FILE_BINARY = 0x40u, B_FILE_DELETE_ON_CLOSE = 0x80u, B_FILE_SHADOW = 0x100u, } b_file_mode; typedef struct b_file_info { b_file_attribute attrib; b_file_mode mode; size_t length; } b_file_info; typedef struct b_file b_file; BLUE_API b_result b_file_open( struct b_directory *root, const struct b_path *path, b_file_mode mode, b_file **out); BLUE_API b_result b_file_open_temp(b_file_mode mode, b_file **out); BLUE_API b_result b_file_open_shadow( b_file *original, b_file_mode mode, b_file **out); BLUE_API b_status b_file_open_stream(b_file *file, b_stream **out); BLUE_API b_status b_file_stat(b_file *file, b_file_info *out); BLUE_API b_status b_file_size(b_file *file, size_t *out_len); BLUE_API b_status b_file_cursor(b_file *file, size_t *out_pos); BLUE_API b_status b_file_resize(b_file *file, size_t len); BLUE_API b_status b_file_seek(b_file *file, long long offset, b_seek_basis basis); BLUE_API b_status b_file_swap_shadow(b_file *main_file, b_file *shadow_file); BLUE_API b_status b_file_read( b_file *file, size_t offset, size_t len, void *buf, size_t *nr_read); BLUE_API b_status b_file_write( b_file *file, size_t offset, size_t len, const void *buf, size_t *nr_written); static inline b_file *b_file_retain(b_file *file) { return B_FILE(b_retain(B_DSREF(file))); } static inline void b_file_release(b_file *file) { b_release(B_DSREF(file)); } #endif