diff --git a/app.cpp b/app.cpp index 6087bdf..654a0bd 100644 --- a/app.cpp +++ b/app.cpp @@ -1,4 +1,3 @@ -#include #include "core.c" int main(int argc, char **argv) { @@ -6,7 +5,8 @@ int main(int argc, char **argv) { Arena *arena = arenaAlloc(Megabytes(64)); StringList args = getArgs(arena, argc, argv); - print("%S", strSplit(arena, s("-"), s("hallo-world"))); + printStrList(args); + printStrList(strSplit(arena, s("-"), s("the-quick-brown-fox-jumps-over-the-lazy-dog"))); return 0; } diff --git a/core.c b/core.c index 16c1665..5074967 100644 --- a/core.c +++ b/core.c @@ -210,7 +210,8 @@ StringList strSplit(Arena *arena, string splitStr, string inputStr) { size_t start = 0; void *beginning = (char *)arena->memory + arena->head; while (c < inputStr.length - splitStr.length) { - if (strEql(strSlice(inputStr, c, c + splitStr.length), splitStr)) { + string mystr = strSlice(inputStr, c, c + splitStr.length); + if (strEql(mystr, splitStr)) { string *splitString = PushStruct(arena, string); splitString->str = inputStr.str + start; splitString->length = c - start; @@ -224,9 +225,10 @@ StringList strSplit(Arena *arena, string splitStr, string inputStr) { splitString->str = inputStr.str + start; splitString->length = inputStr.length - start; splitCount++; - result.data = (string *)beginning, - result.head = splitCount, + + result.data = (string *)beginning; result.length = splitCount; + result.head = splitCount; } return result; } @@ -293,7 +295,7 @@ ParsePositiveReal32Result parsePositiveReal32(string str, size_t *lengthPointer) StringList getArgs(Arena *arena, int argc, char **argv) { StringList args = PushList(arena, StringList, (size_t)argc - 1); for (int i = 1; i < argc; i++) { - AppendList(string, &args, strFromCString(arena, argv[i])); + AppendList(&args, strFromCString(arena, argv[i])); } return args; } @@ -354,12 +356,8 @@ function void printStdout(const char *fmt, ...) { va_end(argList); } -void print(const char *fmt, ...) { - va_list argList; - va_start(argList, fmt); - os_print(StdStream_stdout, fmt, argList); - va_end(argList); -} +void (*print)(const char *fmt, ...) = &printStdout; +#define SetStdErr() DeferLoop(print = &printStderr, print = &printStdout) // TODO(dledda): mat print functions /* @@ -400,27 +398,26 @@ void print(list> l, StdStream target) { } */ -void (*__djstdlib_logFn)(const char *fmt, ...) = &printStdout; void printIntList(IntList l) { - __djstdlib_logFn("{ "); + print("{ "); for (size_t i = 0; i < l.length; i++) { if (i != 0) { - __djstdlib_logFn(", "); + print(", "); } - __djstdlib_logFn("%i", l.data[i]); + print("%i", l.data[i]); } - __djstdlib_logFn(" } length: %zu, head: %zu\n", l.length, l.head); + print(" } length: %zu, head: %zu\n", l.length, l.head); } -void printStringList(StringList l) { - __djstdlib_logFn("{ "); +void printStrList(StringList l) { + print("{ "); for (size_t i = 0; i < l.length; i++) { if (i != 0) { - __djstdlib_logFn(", "); - } - __djstdlib_logFn("\"%S\"", l.data[i]); + print(", "); + } + print("\"%S\"", l.data[i]); } - __djstdlib_logFn(" } length: %zu, head: %zu\n", l.length, l.head); + print(" } length: %zu, head: %zu\n", l.length, l.head); } int intCompare(const void *a, const void *b) { diff --git a/core.h b/core.h index b806ffd..54b8fb8 100644 --- a/core.h +++ b/core.h @@ -45,8 +45,10 @@ typedef struct string string; #define Billion(n) ((n)*1000000000LL) #define ArrayCount(arr) (sizeof(arr) / sizeof((arr)[0])) -#define MemberSize(type, memberName) (sizeof(((type*)0)->data)) -#define MemberSizeUnderlying(type, memberName) (sizeof(*((type*)0)->data)) +#define MemberSize(type, memberName) sizeof(((type *)0)->memberName) +#define MemberType(type, memberName) typeof(((type *)0)->memberName) +#define MemberSizeUnderlying(type, memberName) sizeof(*((type *)0)->memberName) +#define MemberTypeUnderlying(type, memberName) typeof(*((type *)0)->memberName) // ### Arenas ### typedef struct { @@ -142,14 +144,14 @@ inline function Vec4 vec4(real32 x, real32 y, real32 z, real32 w) { DefineList(string, String); -#define PushList(arena, type, size) ((type){ pushSize(arena, MemberSizeUnderlying(type, data)), size, 0 }) -#define EmptyList(type) ((type){ NULL, 0, 0 }) -#define PushListZero(arena, type, size) ((type){ pushSizeFill(arena, MemberSizeUnderlying(type, data), 0), size, 0 }) -#define PushFullList(arena, type, size) ((type){ pushSize(arena, MemberSizeUnderlying(type, data)), size, size }) -#define PushFullListZero(arena, type, size) ((type){ pushSizeFill(arena, MemberSizeUnderlying(type, data), 0), size, size }) -#define ArrayAsList(type, array) ((type){ array, ArrayCount(array), ArrayCount(array) }) +#define PushList(arena, type, size) (type){ (MemberTypeUnderlying(type, data) *)pushSize(arena, MemberSizeUnderlying(type, data)*size), size, 0 } +#define EmptyList(type) (type){ NULL, 0, 0 } +#define PushListZero(arena, type, size) (type){ (MemberTypeUnderlying(type, data) *)pushSizeFill(arena, MemberSizeUnderlying(type, data)*size, 0), size, 0 } +#define PushFullList(arena, type, size) (type){ (MemberTypeUnderlying(type, data) *)pushSize(arena, MemberSizeUnderlying(type, data))*size, size, size } +#define PushFullListZero(arena, type, size) (type){ (MemberTypeUnderlying(type, data) *)pushSizeFill(arena, MemberSizeUnderlying(type, data)*size, 0), size, size } +#define ArrayAsList(type, array) (type){ array, ArrayCount(array), ArrayCount(array) } -#define AppendList(type, list, element) \ +#define AppendList(list, element) \ if ((list)->head < (list)->length) { \ (list)->data[(list)->head++] = (element); \ } @@ -264,12 +266,10 @@ typedef enum { #define COLOR_TEXT_FG_BG(text, foregroundcolor, backgroundcolor) ANSI_INSTRUCTION_FROM_ENUM(foregroundcolor) ANSI_INSTRUCTION_FROM_ENUM(backgroundcolor) text ANSI_RESET #define COLOR_TEXT_RGB(text, red, green, blue) ANSI_INSTRUCTION_STR("38;2;" #red ";" #green ";" #blue) text ANSI_RESET -#define SetStdErr() DeferLoop DefineList(int, Int); -void printIntListErr(IntList l); -void printStrListErr(StringList l); -void print(const char *fmt, ...); -void printErr(const char *fmt, ...); +void printIntList(IntList l); +void printStrList(StringList l); +extern void (*print)(const char *fmt, ...); // ### Loops ### #define EachIn(list, it) size_t it = 0; it < (list).head; it++