| @@ -1,4 +1,3 @@ | |||
| #include <stdio.h> | |||
| #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; | |||
| } | |||
| @@ -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<Vector2<real32>> 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) { | |||
| @@ -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++ | |||