diff --git a/compile b/compile index 7641533..7c7a7fe 100644 --- a/compile +++ b/compile @@ -5,6 +5,10 @@ CFLAGS="-g -Wall -Werror -pedantic -Iinclude" SRC="src/main.c" OUT=main +# DSTRING +CFLAGS+=" -Iinclude/dstring" +SRC+=" src/dstring/*.c" + # LEXER CFLAGS+=" -Iinclude/lexer" SRC+=" src/lexer/*.c" diff --git a/compile_commands.json b/compile_commands.json index 3b0f741..2b87a57 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -8,6 +8,7 @@ "-Werror", "-pedantic", "-Iinclude", + "-Iinclude/dstring", "-Iinclude/lexer", "-o", "main", @@ -26,13 +27,33 @@ "-Werror", "-pedantic", "-Iinclude", + "-Iinclude/dstring", "-Iinclude/lexer", "-o", "main", - "src/lexer/lexer_states.c" + "src/dstring/dstring.c" ], "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", - "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/dstring/dstring.c", + "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-g", + "-Wall", + "-Werror", + "-pedantic", + "-Iinclude", + "-Iinclude/dstring", + "-Iinclude/lexer", + "-o", + "main", + "src/lexer/lexer.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer.c", "output": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/main" }, { @@ -71,6 +92,8 @@ "-I", "include", "-I", + "include/dstring", + "-I", "include/lexer", "-internal-isystem", "/usr/lib64/clang/16/include", @@ -95,12 +118,12 @@ "-x", "c", "-o", - "/tmp/main-dc9945.o", + "/tmp/main-c4d09c.o", "src/main.c" ], "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c", - "output": "/tmp/main-dc9945.o" + "output": "/tmp/main-c4d09c.o" }, { "arguments": [ @@ -138,6 +161,8 @@ "-I", "include", "-I", + "include/dstring", + "-I", "include/lexer", "-internal-isystem", "/usr/lib64/clang/16/include", @@ -162,11 +187,80 @@ "-x", "c", "-o", - "/tmp/lexer_states-e000bc.o", - "src/lexer/lexer_states.c" + "/tmp/dstring-9f956a.o", + "src/dstring/dstring.c" ], "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", - "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", - "output": "/tmp/lexer_states-e000bc.o" + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/dstring/dstring.c", + "output": "/tmp/dstring-9f956a.o" + }, + { + "arguments": [ + "/usr/bin/clang-16", + "-cc1", + "-triple", + "x86_64-redhat-linux-gnu", + "-emit-obj", + "-mrelax-all", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-resource-dir", + "/usr/lib64/clang/16", + "-I", + "include", + "-I", + "include/dstring", + "-I", + "include/lexer", + "-internal-isystem", + "/usr/lib64/clang/16/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-Werror", + "-pedantic", + "-fdebug-compilation-dir=/home/abdelrahman/dev_work/say_it_in_json", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/lexer-7622c3.o", + "src/lexer/lexer.c" + ], + "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", + "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer.c", + "output": "/tmp/lexer-7622c3.o" } ] diff --git a/include/dstring/dstring.h b/include/dstring/dstring.h new file mode 100644 index 0000000..4b45a9b --- /dev/null +++ b/include/dstring/dstring.h @@ -0,0 +1,19 @@ +#ifndef DSTRING_H +#define DSTRING_H + +#include "aliases.h" + +typedef struct dstr dstr_t; + +dstr_t *dstr_with_capacity(u64 capacity); +dstr_t *dstr_from_string(const char *str); +void update_dstr(dstr_t **dst, const char *src); +void delete_dstr(dstr_t **str); +void concat_dstr(dstr_t **dst, const char *src); +void append_to_dstr(dstr_t **dst, char c); +void empty_dstr(dstr_t *str); +void print_dstr(const dstr_t *str); +u64 dstr_length(const dstr_t *str); +u64 dstr_capacity(const dstr_t *str); + +#endif // !DSTRING_H diff --git a/src/dstring/dstring.c b/src/dstring/dstring.c new file mode 100644 index 0000000..718edb0 --- /dev/null +++ b/src/dstring/dstring.c @@ -0,0 +1,158 @@ +#include "dstring.h" +#include "aliases.h" +#include +#include +#include + +// Use this scalar to allocate extra memory in order to avoid having to +// constantly reallocate +#define CAPACITY_SCALAR 8 + +struct dstr { + u64 capacity; + u64 size; + char buf[]; +}; + +dstr_t *dstr_with_capacity(u64 capacity) { + dstr_t *out = (dstr_t *)malloc(sizeof(dstr_t) + capacity + 1); + + if (!out) { + return NULL; + } + + out->capacity = capacity; + out->size = 0; + memset(out->buf, 0, capacity + 1); + + return out; +} + +dstr_t *dstr_from_string(const char *str) { + u64 length = strlen(str); + + u64 capacity = length * CAPACITY_SCALAR; + + dstr_t *out = dstr_with_capacity(capacity); + + if (!out) { + return NULL; + } + + out->size = length; + strncpy(out->buf, str, length); + + return out; +} + +void update_dstr(dstr_t **dst, const char *src) { + if (!(*dst)) { + return; + } + + u64 length = strlen(src); + + dstr_t *str = *dst; + + if (length <= str->capacity) { + memset(str->buf, 0, str->capacity); + + str->size = length; + + strncpy(str->buf, src, length); + } else { + u64 capacity = length * CAPACITY_SCALAR; + + dstr_t *tmp = (dstr_t *)realloc(*dst, sizeof(dstr_t) + capacity + 1); + + if (!tmp) { + return; + } + + tmp->capacity = capacity; + tmp->size = length; + strncpy(tmp->buf, src, length); + + *dst = tmp; + } +} + +void delete_dstr(dstr_t **str) { + if (!(*str)) { + return; + } + + free(*str); + *str = NULL; +} + +void concat_dstr(dstr_t **dst, const char *src) { + if (!(*dst)) { + return; + } + + u64 src_length = strlen(src); + + if (src_length == 0) { + return; + } + + u64 new_length = (*dst)->size + src_length; + + char str[new_length + 1]; + memset(str, 0, new_length + 1); + + strncpy(str, (*dst)->buf, (*dst)->size); + strncat(str, src, src_length); + + update_dstr(dst, str); +} + +void append_to_dstr(dstr_t **dst, char c) { + if (!(*dst)) { + return; + } + + u64 new_length = (*dst)->size + 1; + + char str[new_length + 1]; + memset(str, 0, new_length + 1); + + strncpy(str, (*dst)->buf, (*dst)->size); + str[(*dst)->size] = c; + + update_dstr(dst, str); +} + +void empty_dstr(dstr_t *str) { + if (!str || str->size == 0) { + return; + } + + memset(str->buf, 0, str->capacity); + str->size = 0; +} + +void print_dstr(const dstr_t *str) { + if (!str) { + return; + } + + printf("%s\n", str->buf); +} + +u64 dstr_length(const dstr_t *str) { + if (!str) { + return 0; + } + + return str->size; +} + +u64 dstr_capacity(const dstr_t *str) { + if (!str) { + return 0; + } + + return str->capacity; +} diff --git a/src/main.c b/src/main.c index 220c656..e07b667 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ #include "aliases.h" -#include "lexer_states.h" +#include "lexer.h" #include #include #include