From 5ba64e45a8fb0d8628cdfc57bde68f58315cf279 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 5 May 2020 18:34:58 -0500 Subject: [PATCH] Lots of progress on file API --- bh.h | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- onyx | Bin 22800 -> 31664 bytes onyx.c | 85 ++++++++------------- 3 files changed, 261 insertions(+), 59 deletions(-) diff --git a/bh.h b/bh.h index 6e4f2d05..16221650 100644 --- a/bh.h +++ b/bh.h @@ -20,6 +20,7 @@ typedef signed short i16; typedef signed int i32; typedef signed long i64; typedef signed long long i128; +typedef unsigned long isize; //------------------------------------------------------------------------------------- // Better strings @@ -75,7 +76,8 @@ void bh_string_print(bh_string* str); //------------------------------------------------------------------------------------- typedef enum bh_file_error { - BH_FILE_ERROR_NONE + BH_FILE_ERROR_NONE, + BH_FILE_ERROR_INVALID } bh_file_error; typedef enum bh_file_mode { @@ -88,9 +90,9 @@ typedef enum bh_file_mode { } bh_file_mode; typedef enum bh_file_whence { - bh_file_whence_begin = 0, - bh_file_whence_current = 1, - bh_file_whence_end = 2, + BH_FILE_WHENCE_BEGIN = SEEK_SET, + BH_FILE_WHENCE_CURRENT = SEEK_CUR, + BH_FILE_WHENCE_END = SEEK_END, } bh_file_whence; typedef int bh_file_descriptor; @@ -106,17 +108,57 @@ typedef enum bh_file_standard { BH_FILE_STANDARD_ERROR } bh_file_standard; +typedef struct bh_file_contents { + // This will hold the allocator as well + isize length; + void* data; +} bh_file_contents; + bh_file_error bh_file_get_standard(bh_file* file, bh_file_standard stand); bh_file_error bh_file_create(bh_file* file, char const* filename); bh_file_error bh_file_open(bh_file* file, char const* filename); -bh_file_error bh_file_open_mode(bh_file* file, bh_file_mode mode, char const* filename); -bh_file_error bh_file_new(bh_file* file, bh_file_descriptor fd, char const* filename); +bh_file_error bh_file_open_mode(bh_file* file, bh_file_mode mode, const char* filename); +bh_file_error bh_file_new(bh_file* file, bh_file_descriptor fd, const char* filename); +i32 bh_file_read_at(bh_file* file, i64 offset, void* buffer, isize buff_size, isize* bytes_read); +i32 bh_file_write_at(bh_file* file, i64 offset, void const* buffer, isize buff_size, isize* bytes_wrote); +static i32 bh__file_seek_wrapper(i32 fd, i64 offset, bh_file_whence whence, i64* new_offset); +i32 bh_file_seek(bh_file* file, i64 offset); +i64 bh_file_seek_to_end(bh_file* file); +i64 bh_file_skip(bh_file* file, i64 bytes); +i64 bh_file_tell(bh_file* file); +bh_file_error bh_file_close(bh_file* file); +i32 bh_file_read(bh_file* file, void* buffer, isize buff_size); +i32 bh_file_write(bh_file* file, void* buffer, isize buff_size); +i64 bh_file_size(bh_file* file); + +#define bh_file_read_contents(x) _Generic((x), \ + bh_file*: bh_file_read_contents_bh_file, \ + const char*: bh_file_read_contents_direct, \ + char*: bh_file_read_contents_direct)(x) + +bh_file_contents bh_file_read_contents_bh_file(bh_file* file); +bh_file_contents bh_file_read_contents_direct(const char* filename); +i32 bh_file_contents_delete(bh_file_contents* contents); + + + + + + + + + + + //------------------------------------------------------------------------------------- // IMPLEMENTATIONS //------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------- +// STRING IMPLEMENTATION +//------------------------------------------------------------------------------------- bh_string bh_string_new_cap(unsigned long cap) { bh_string str; str.data = (u8*) malloc(sizeof(u8) * cap); @@ -247,3 +289,184 @@ void bh_string_print(bh_string* str) { write(STDOUT_FILENO, str->data, str->length); } + + +//------------------------------------------------------------------------------------- +// FILE IMPLEMENTATION +//------------------------------------------------------------------------------------- +bh_file_error bh_file_get_standard(bh_file* file, bh_file_standard stand) { + i32 sd_fd = -1; + const char* filename = NULL; + + switch (stand) { + case BH_FILE_STANDARD_INPUT: + sd_fd = STDIN_FILENO; + filename = "stdin"; // These are constants in the data section so everything should be okay + break; + case BH_FILE_STANDARD_OUTPUT: + sd_fd = STDOUT_FILENO; + filename = "stdout"; + break; + case BH_FILE_STANDARD_ERROR: + sd_fd = STDERR_FILENO; + filename = "stderr"; + break; + } + + file->fd = sd_fd; + file->filename = filename; + + return BH_FILE_ERROR_NONE; +} + +bh_file_error bh_file_create(bh_file* file, const char* filename) { + // Need to do this to avoid compiler complaining about types + bh_file_mode write_rw = (bh_file_mode) (BH_FILE_MODE_WRITE | BH_FILE_MODE_RW); + return bh_file_open_mode(file, write_rw, filename); +} + +bh_file_error bh_file_open(bh_file* file, const char* filename) { + return bh_file_open_mode(file, BH_FILE_MODE_READ, filename); +} + +bh_file_error bh_file_open_mode(bh_file* file, bh_file_mode mode, const char* filename) { + + i32 os_mode = 0; + + switch (mode & BH_FILE_MODE_MODES) { + case BH_FILE_MODE_READ: os_mode = O_RDONLY; break; + case BH_FILE_MODE_WRITE: os_mode = O_WRONLY | O_CREAT | O_TRUNC; break; + case BH_FILE_MODE_APPEND: os_mode = O_RDONLY | O_APPEND | O_CREAT; break; + case BH_FILE_MODE_READ | BH_FILE_MODE_RW: os_mode = O_RDWR; break; + case BH_FILE_MODE_WRITE | BH_FILE_MODE_RW: os_mode = O_RDWR | O_CREAT | O_TRUNC; break; + case BH_FILE_MODE_APPEND | BH_FILE_MODE_RW: os_mode = O_RDWR | O_APPEND | O_CREAT; break; + //default: // TODO Handle errors + } + + file->fd = open(filename, os_mode, + S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP //+rw-rw-rw- + ); + if (file->fd < 0) { + return BH_FILE_ERROR_INVALID; + } + + // TODO: Set this using some allocator + file->filename = filename; + + return BH_FILE_ERROR_NONE; +} + +bh_file_error bh_file_new(bh_file* file, bh_file_descriptor fd, const char* filename) { + file->filename = filename; // This may be unsafe + file->fd = fd; + return BH_FILE_ERROR_NONE; +} + +i32 bh_file_read_at(bh_file* file, i64 offset, void* buffer, isize buff_size, isize* bytes_read) { + isize res = pread(file->fd, buffer, buff_size, offset); + if (res < 0) return 0; + if (bytes_read) *bytes_read = res; + return 1; +} + +i32 bh_file_write_at(bh_file* file, i64 offset, void const* buffer, isize buff_size, isize* bytes_wrote) { + isize res; + i64 current_offset = 0; + bh__file_seek_wrapper(file->fd, offset, BH_FILE_WHENCE_CURRENT, ¤t_offset); + if (current_offset == offset) { + // Standard in and out do like pwrite() + res = write(file->fd, buffer, buff_size); + } else { + res = pwrite(file->fd, buffer, buff_size, offset); + } + if (res < 0) return 0; + if (bytes_wrote) *bytes_wrote = res; + + return 1; +} + +static i32 bh__file_seek_wrapper(i32 fd, i64 offset, bh_file_whence whence, i64* new_offset) { + i64 res = lseek(fd, offset, whence); + if (res < 0) return 0; + if (new_offset) *new_offset = res; + return 1; +} + +// Returns new offset +i64 bh_file_seek_to(bh_file* file, i64 offset) { + i64 new_offset = -1; + bh__file_seek_wrapper(file->fd, offset, BH_FILE_WHENCE_BEGIN, &new_offset); + return new_offset; +} + +i64 bh_file_seek_to_end(bh_file* file) { + i64 new_offset = -1; + bh__file_seek_wrapper(file->fd, 0, BH_FILE_WHENCE_END, &new_offset); + return new_offset; +} + +i64 bh_file_skip(bh_file* file, i64 bytes) { + i64 new_offset = 0; + bh__file_seek_wrapper(file->fd, bytes, BH_FILE_WHENCE_CURRENT, &new_offset); + return new_offset; +} + +i64 bh_file_tell(bh_file* file) { + i64 new_offset = 0; + bh__file_seek_wrapper(file->fd, 0, BH_FILE_WHENCE_CURRENT, &new_offset); + return new_offset; +} + +bh_file_error bh_file_close(bh_file* file) { + bh_file_error err = BH_FILE_ERROR_NONE; + i32 res = close(file->fd); + if (res < 0) + err = BH_FILE_ERROR_INVALID; + + return err; +} + +i32 bh_file_read(bh_file* file, void* buffer, isize buff_size) { + return bh_file_read_at(file, bh_file_tell(file), buffer, buff_size, NULL); +} + +i32 bh_file_write(bh_file* file, void* buffer, isize buff_size) { + return bh_file_write_at(file, bh_file_tell(file), buffer, buff_size, NULL); +} + +i64 bh_file_size(bh_file* file) { + i64 size = 0; + i64 prev = bh_file_tell(file); + bh_file_seek_to_end(file); + size = bh_file_tell(file); + bh_file_seek_to(file, prev); + return size; +} + +bh_file_contents bh_file_read_contents_bh_file(bh_file* file) { + bh_file_contents fc = { .length = 0, .data = NULL }; + + isize size = bh_file_size(file); + if (size <= 0) return fc; + + fc.data = malloc(size + 1); + fc.length = size; + bh_file_read_at(file, 0, fc.data, fc.length, NULL); + ((u8*) fc.data)[fc.length] = '\0'; + + return fc; +} + +bh_file_contents bh_file_read_contents_direct(const char* filename) { + bh_file file; + bh_file_open(&file, filename); + bh_file_contents fc = bh_file_read_contents(&file); + bh_file_close(&file); + return fc; +} + +i32 bh_file_contents_delete(bh_file_contents* contents) { + free(contents->data); + contents->length = 0; + return 1; +} diff --git a/onyx b/onyx index 7702a58d16b89279edab5528bb390035dcc44b2a..272ceb6aab5bb2c5260ac4a5b1ecf709eec5ac1a 100755 GIT binary patch literal 31664 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 literal 22800 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 diff --git a/onyx.c b/onyx.c index 2391e03b..60d8ea96 100644 --- a/onyx.c +++ b/onyx.c @@ -1,63 +1,42 @@ #include // TODO: Replace with custom lib #include // TODO: Replace with custom lib #include "bh.h" -// -// int main(int argc, char *argv[]) { -// if (argc < 2) { -// fprintf(stderr, "Expected file to compile\n"); -// return -1; -// } -// -// File file; -// -// if (file_open(&file, argv[1], O_RDONLY)) { -// fprintf(stderr, "Failed to open file: %s\n", argv[1]); -// return -1; -// } -// -// file_close(&file); -// -// return 0; -// } -// int main(int argc, char *argv[]) { - bh_string test_str = bh_string_new(256); - bh_string world_str = bh_string_new("World FOO Bar test\n"); - - bh_string_append(&test_str, "Hello Frank!\n"); - bh_string_replace_at(&test_str, &world_str, 6); - bh_string_replace_at(&test_str, "Hola ", 0); - bh_string_insert_at(&test_str, "World", 3); - bh_string_print(&test_str); - - bh_string trim_str = bh_string_new("abcdeTesting words herezzzz\n \t"); - bh_string_print(&trim_str); - bh_string_trim_begin(&trim_str, "abcde"); - bh_string_print(&trim_str); - bh_string_trim_end_space(&trim_str); - bh_string_print(&trim_str); - - bh_string_delete(&test_str); - bh_string_delete(&world_str); - bh_string_delete(&trim_str); + bh_file demofile; + bh_file_error err = bh_file_open(&demofile, argv[1]); + if (err != BH_FILE_ERROR_NONE) { + fprintf(stderr, "Failed to open file %s\n", argv[1]); + return EXIT_FAILURE; + } + + bh_file_contents fc = bh_file_read_contents(&demofile); + printf("%ld: %s\n", fc.length, fc.data); + + bh_file_contents_delete(&fc); + bh_file_close(&demofile); + + // bh_string test_str = bh_string_new(256); + // bh_string world_str = bh_string_new("World FOO Bar test\n"); + + // bh_string_append(&test_str, "Hello Frank!\n"); + // bh_string_replace_at(&test_str, &world_str, 6); + // bh_string_replace_at(&test_str, "Hola ", 0); + // bh_string_insert_at(&test_str, "World", 3); + // bh_string_print(&test_str); + + // bh_string trim_str = bh_string_new("abcdeTesting words herezzzz\n \t"); + // bh_string_print(&trim_str); + // bh_string_trim_begin(&trim_str, "abcde"); + // bh_string_print(&trim_str); + // bh_string_trim_end_space(&trim_str); + // bh_string_print(&trim_str); + + // bh_string_delete(&test_str); + // bh_string_delete(&world_str); + // bh_string_delete(&trim_str); // bh_string file_contents = bh_file_read_contents("path"); return 0; } - -// int main(int argc, char const *argv[]) { -// FILE* file = fopen(argv[1], "r"); -// long start = ftell(file); -// fseek(file, 0, SEEK_END); -// long end = ftell(file); -// fseek(file, 0, SEEK_SET); -// -// -// char* data = (char *) malloc(sizeof(u8) * (end - start + 1)); -// read(file->, data, end - start); -// fclose(file); -// printf("%ld - %ld = %ld\n", end, start, end - start); -// printf("%s", data); -// } -- 2.25.1