commit 151c5dfa40bdf4acec50a511bb6e2b7379acd2a3
parent 286bac5aba16907edc4f0ef346f8b4623a05e2f6
Author: rexim <reximkut@gmail.com>
Date: Tue, 10 Jan 2023 22:40:13 +0700
Data is basically String_Builder
Diffstat:
5 files changed, 57 insertions(+), 74 deletions(-)
diff --git a/src/common.c b/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;
}
diff --git a/src/common.h b/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);
diff --git a/src/editor.c b/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)
diff --git a/src/editor.h b/src/editor.h
@@ -10,19 +10,13 @@ typedef struct {
} Line;
typedef struct {
- char *items;
- size_t count;
- size_t capacity;
-} Data;
-
-typedef struct {
Line *items;
size_t count;
size_t capacity;
} Lines;
typedef struct {
- Data data;
+ String_Builder data;
Lines lines;
String_Builder file_path;
size_t cursor;
diff --git a/src/simple_renderer.c b/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);
}