85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
#ifndef BLUELIB_IO_FILE_H_
|
|
#define BLUELIB_IO_FILE_H_
|
|
|
|
#include <blue/core/error.h>
|
|
#include <blue/core/misc.h>
|
|
#include <blue/core/stream.h>
|
|
#include <blue/object/object.h>
|
|
|
|
#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 const struct b_path *b_file_path(const b_file *file);
|
|
|
|
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_OBJECT(file)));
|
|
}
|
|
static inline void b_file_release(b_file *file)
|
|
{
|
|
b_release(B_OBJECT(file));
|
|
}
|
|
|
|
#endif
|