Browse Source

Data is basically String_Builder

rexim 2 years ago
parent
commit
151c5dfa40
5 changed files with 57 additions and 74 deletions
  1. 30 22
      src/common.c
  2. 2 1
      src/common.h
  3. 7 39
      src/editor.c
  4. 1 7
      src/editor.h
  5. 17 5
      src/simple_renderer.c

+ 30 - 22
src/common.c

@@ -72,33 +72,41 @@ defer:
     return result;
 }
 
-char *read_entire_file(const char *file_path)
+static Errno file_size(FILE *file, size_t *size)
 {
-#define SLURP_FILE_PANIC \
-    do { \
-        fprintf(stderr, "Could not read file `%s`: %s\n", file_path, strerror(errno)); \
-        exit(1); \
-    } while (0)
-
-    FILE *f = fopen(file_path, "r");
-    if (f == NULL) SLURP_FILE_PANIC;
-    if (fseek(f, 0, SEEK_END) < 0) SLURP_FILE_PANIC;
-
-    long size = ftell(f);
-    if (size < 0) SLURP_FILE_PANIC;
+    long saved = ftell(file);
+    if (saved < 0) return errno;
+    if (fseek(file, 0, SEEK_END) < 0) return errno;
+    long result = ftell(file);
+    if (result < 0) return errno;
+    if (fseek(file, saved, SEEK_SET) < 0) return errno;
+    *size = (size_t) result;
+    return 0;
+}
 
-    char *buffer = malloc(size + 1);
-    if (buffer == NULL) SLURP_FILE_PANIC;
+Errno read_entire_file(const char *file_path, String_Builder *sb)
+{
+    Errno result = 0;
+    FILE *f = NULL;
 
-    if (fseek(f, 0, SEEK_SET) < 0) SLURP_FILE_PANIC;
+    f = fopen(file_path, "r");
+    if (f == NULL) return_defer(errno);
 
-    fread(buffer, 1, size, f);
-    if (ferror(f) < 0) SLURP_FILE_PANIC;
+    size_t size;
+    Errno err = file_size(f, &size);
+    if (err != 0) return_defer(err);
 
-    buffer[size] = '\0';
+    if (sb->capacity < size) {
+        sb->capacity = size;
+        sb->items = realloc(sb->items, sb->capacity*sizeof(*sb->items));
+        assert(sb->items != NULL && "Buy more RAM lol");
+    }
 
-    if (fclose(f) < 0) SLURP_FILE_PANIC;
+    fread(sb->items, size, 1, f);
+    if (ferror(f)) return_defer(errno);
+    sb->count = size;
 
-    return buffer;
-#undef SLURP_FILE_PANIC
+defer:
+    if (f) fclose(f);
+    return result;
 }

+ 2 - 1
src/common.h

@@ -2,6 +2,7 @@
 #define COMMON_H_
 
 #include <stdlib.h>
+#include <stdio.h>
 
 typedef int Errno;
 
@@ -66,7 +67,7 @@ typedef struct {
     size_t capacity;
 } Files;
 
-char *read_entire_file(const char *file_path);
+Errno read_entire_file(const char *file_path, String_Builder *sb);
 Errno write_entire_file(const char *file_path, const char *buf, size_t buf_size);
 Errno read_entire_dir(const char *dir_path, Files *files);
 

+ 7 - 39
src/editor.c

@@ -52,52 +52,20 @@ Errno editor_save(const Editor *editor)
     return write_entire_file(editor->file_path.items, editor->data.items, editor->data.count);
 }
 
-static Errno file_size(FILE *file, size_t *size)
-{
-    long saved = ftell(file);
-    if (saved < 0) return errno;
-    if (fseek(file, 0, SEEK_END) < 0) return errno;
-    long result = ftell(file);
-    if (result < 0) return errno;
-    if (fseek(file, saved, SEEK_SET) < 0) return errno;
-    *size = (size_t) result;
-    return 0;
-}
 
 Errno editor_load_from_file(Editor *e, const char *file_path)
 {
-    Errno result = 0;
-    FILE *file = NULL;
-
     e->data.count = 0;
-
-    file = fopen(file_path, "rb");
-    if (file == NULL) return_defer(errno);
-
-    size_t data_size;
-    Errno err = file_size(file, &data_size);
-    if (err != 0) return_defer(err);
-
-    if (e->data.capacity < data_size) {
-        e->data.capacity = data_size;
-        e->data.items = realloc(e->data.items, e->data.capacity*sizeof(*e->data.items));
-        assert(e->data.items != NULL && "Buy more RAM lol");
-    }
-
-    fread(e->data.items, data_size, 1, file);
-    if (ferror(file)) return_defer(errno);
-    e->data.count = data_size;
+    Errno err = read_entire_file(file_path, &e->data);
+    if (err != 0) return err;
 
     editor_recompute_lines(e);
 
-defer:
-    if (result == 0) {
-        e->file_path.count = 0;
-        sb_append_cstr(&e->file_path, file_path);
-        sb_append_null(&e->file_path);
-    }
-    if (file) fclose(file);
-    return result;
+    e->file_path.count = 0;
+    sb_append_cstr(&e->file_path, file_path);
+    sb_append_null(&e->file_path);
+
+    return 0;
 }
 
 size_t editor_cursor_row(const Editor *e)

+ 1 - 7
src/editor.h

@@ -9,12 +9,6 @@ typedef struct {
     size_t end;
 } Line;
 
-typedef struct {
-    char *items;
-    size_t count;
-    size_t capacity;
-} Data;
-
 typedef struct {
     Line *items;
     size_t count;
@@ -22,7 +16,7 @@ typedef struct {
 } Lines;
 
 typedef struct {
-    Data data;
+    String_Builder data;
     Lines lines;
     String_Builder file_path;
     size_t cursor;

+ 17 - 5
src/simple_renderer.c

@@ -42,13 +42,23 @@ static bool compile_shader_source(const GLchar *source, GLenum shader_type, GLui
 
 static bool compile_shader_file(const char *file_path, GLenum shader_type, GLuint *shader)
 {
-    char *source = read_entire_file(file_path);
-    bool ok = compile_shader_source(source, shader_type, shader);
-    if (!ok) {
+    bool result = true;
+
+    String_Builder source = {0};
+    Errno err = read_entire_file(file_path, &source);
+    if (err != 0) {
+        fprintf(stderr, "ERROR: failed to load `%s` shader file: %s\n", file_path, strerror(errno));
+        return_defer(false);
+    }
+    sb_append_null(&source);
+
+    if (!compile_shader_source(source.items, shader_type, shader)) {
         fprintf(stderr, "ERROR: failed to compile `%s` shader file\n", file_path);
+        return_defer(false);
     }
-    free(source);
-    return ok;
+defer:
+    free(source.items);
+    return result;
 }
 
 static void attach_shaders_to_program(GLuint *shaders, size_t shaders_count, GLuint program)
@@ -157,6 +167,8 @@ void simple_renderer_init(Simple_Renderer *sr,
 
     GLuint shaders[2] = {0};
 
+    // TODO: dynamic shader reloading
+
     if (!compile_shader_file(vert_file_path, GL_VERTEX_SHADER, &shaders[0])) {
         exit(1);
     }