]> www.git.momoyon.org Git - commonlib.git/commitdiff
Prefix everything*
authormomoyonwork <ahmedsamyhwork@gmail.com>
Sat, 25 Jan 2025 07:04:11 +0000 (12:04 +0500)
committermomoyonwork <ahmedsamyhwork@gmail.com>
Sat, 25 Jan 2025 07:04:11 +0000 (12:04 +0500)
commonlib.h

index 424c98737458db024b1f594eeb6b608daf01eaad..d2db74e8b3a7895fbd7e106ad9e4ddbad3032e37 100644 (file)
@@ -7,15 +7,13 @@
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <ctype.h>\r
-#include <locale.h>\r
-\r
 \r
 // typedefs\r
 typedef unsigned int uint;\r
-typedef uint8_t  uint8;\r
-typedef uint16_t uint16;\r
-typedef uint32_t uint32;\r
-typedef uint64_t uint64;\r
+typedef uint8_t      uint8;\r
+typedef uint16_t     uint16;\r
+typedef uint32_t     uint32;\r
+typedef uint64_t     uint64;\r
 \r
 typedef int8_t  int8;\r
 typedef int16_t int16;\r
@@ -30,123 +28,118 @@ typedef wchar_t wchar;
 typedef const char*  cstr;\r
 typedef const wchar* wstr;\r
 \r
-#define ASSERT(condition, msg) do {\\r
-        if (!(condition)) {\\r
-            fprintf(stderr, "%s:%d:0 [ASSERTION FAILED] %s: %s", __FILE__, __LINE__, #condition, msg);\\r
-            exit(1);\\r
-        }\\r
-    } while (0)\r
-\r
-#define ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0]))\r
+#define c_ASSERT(condition, msg) do {\\r
+                if (!(condition)) {\\r
+                        fprintf(stderr, "%s:%d:0 [ASSERTION FAILED] %s: %s", __FILE__, __LINE__, #condition, msg);\\r
+                        exit(1);\\r
+                }\\r
+        } while (0)\r
 \r
-#define STRUCT(name) typedef struct name name\r
-#define ENUM(name)   typedef enum name name\r
+#define c_ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0]))\r
 \r
 // Struct pre-decls\r
 \r
-STRUCT(Arena);\r
+typedef struct c_Arena c_Arena;\r
 \r
 //\r
 // OS\r
 //\r
 \r
-void os_get_timedate(Arena* a);\r
-bool os_file_exists(cstr filename);\r
+void c_os_get_timedate(c_Arena* a);\r
+bool c_os_file_exists(cstr filename);\r
 \r
 //\r
 // Logging\r
 //\r
 \r
-// FLUSH_ON_LOG - define this macro to fflush() on every call to log() not defined by default.\r
-\r
-#define log_info(fmt, ...)     printf("%s "fmt"\n", "[INFO]", ##__VA_ARGS__)\r
-#define log_warning(fmt, ...)  fprintf(stderr, "%s "fmt"\n", "[WARNING]", ##__VA_ARGS__)\r
-#define log_error(fmt, ...)    fprintf(stderr, "%s "fmt"\n", "[ERROR]", ##__VA_ARGS__)\r
+#define c_log_error(fmt, ...) do {\\r
+               fprintf(stderr, "%s"fmt"\n", "[ERROR] ", ##__VA_ARGS__);\\r
+       } while (0)\r
+#define c_log_info(fmt, ...) do {\\r
+               fprintf(stdout, "%s"fmt"\n", "[INFO] ", ##__VA_ARGS__);\\r
+       } while (0)\r
+#define c_log_warning(fmt, ...) do {\\r
+               fprintf(stdout, "%s"fmt"\n", "[WARNING] ", ##__VA_ARGS__);\\r
+       } while (0)\r
 \r
 //\r
 // File\r
 //\r
 \r
 // reads entire file and gives back the string holding the contents. (caller must be responsible for freeing the string!)\r
-const char* slurp_file(const char* filename, bool* success);\r
-// void touch_file_if_doesnt_exist(cstr file);\r
+const char* c_slurp_file(const char* filename, bool* success);\r
+void c_touch_file_if_doesnt_exist(cstr file);\r
 \r
 //\r
 // ### Allocators ###\r
 //\r
 \r
 //\r
-// Arena\r
+// c_Arena\r
 //\r
 \r
 #define ARENA_BUFF_INITIAL_SIZE (1024*4)\r
 \r
-struct Arena {\r
-  void* buff;\r
-  uint64 buff_size;\r
-  void* ptr;\r
+struct c_Arena {\r
+    void* buff;\r
+    uint64 buff_size;\r
+    void* ptr;\r
 };\r
 \r
 // pass size 0 to get ARENA_BUFF_INITIAL_SIZE\r
-Arena Arena_make(size_t size);\r
-void* Arena_alloc(Arena* a, size_t size);\r
-void Arena_reset(Arena* a);\r
-void Arena_free(Arena* a);\r
-\r
-#define Arena_alloc_str(a, fmt, ...)  Arena_alloc(&(a), sizeof(char)*stbsp_snprintf((a).ptr, (int)((a).buff_size - ((uint8*)(a).ptr - (uint8*)(a).buff)), (fmt), __VA_ARGS__)+1)\r
-#define Arena_alloc_wstr(a, fmt, ...) Arena_alloc(&a, sizeof(char)*wprintf(a.ptr, a.buff_size - ((uint8*)a.ptr - (uint8*)a.buff), (fmt), __VA_ARGS__)+1)\r
-\r
-//\r
-// String\r
-//\r
+c_Arena c_Arena_make(size_t size);\r
+void* c_Arena_alloc(c_Arena* a, size_t size);\r
+void c_Arena_reset(c_Arena* a);\r
+void c_Arena_free(c_Arena* a);\r
 \r
-bool cstr_to_wstr(Arena* warena, cstr str);\r
+#define c_Arena_alloc_str(a, fmt, ...)    c_Arena_alloc(&(a), sizeof(char)*stbsp_snprintf((a).ptr, (int)((a).buff_size - ((uint8*)(a).ptr - (uint8*)(a).buff)), (fmt), __VA_ARGS__)+1)\r
+#define c_Arena_alloc_wstr(a, fmt, ...) c_Arena_alloc(&a, sizeof(char)*wprintf(a.ptr, a.buff_size - ((uint8*)a.ptr - (uint8*)a.buff), (fmt), __VA_ARGS__)+1)\r
 \r
 //\r
 // String view\r
 //\r
 \r
 typedef struct {\r
-  cstr data;\r
-  size_t count;\r
-} String_view;\r
-\r
-#define SV_FMT "%.*s"\r
-#define SV_ARG(sv) (int)sv.count, sv.data\r
-\r
-#define SV(cstr) (String_view){.data = cstr, strlen(cstr)}\r
-\r
-void sv_print_dumb(String_view sv);\r
-String_view sv_from_cstr(const char* cstr); // Actually just use SV(cstr) macro...\r
-String_view sv_lpop(String_view* sv, uint32 n);\r
-String_view sv_lpop_until_predicate(String_view* sv, int(*predicate)(int));\r
-String_view sv_rpop_until_predicate(String_view* sv, int(*predicate)(int));\r
-String_view sv_lpop_until_char(String_view* sv, char ch);\r
-String_view sv_rpop_until_char(String_view* sv, char ch);\r
-void sv_lremove(String_view* sv, size_t n);\r
-void sv_rremove(String_view* sv, size_t n);\r
-void sv_lremove_until_char(String_view* sv, char ch);\r
-void sv_rremove_until_char(String_view* sv, char ch);\r
-void sv_lremove_until_char_after(String_view* sv, char ch);\r
-void sv_rremove_until_char_after(String_view* sv, char ch);\r
-void sv_ltrim(String_view* sv);\r
-void sv_rtrim(String_view* sv);\r
-void sv_trim(String_view* sv);\r
-char* sv_to_cstr(String_view sv);\r
-int32  sv_to_int(String_view sv);\r
-uint64 sv_to_uint64(String_view sv);\r
-uint8 sv_to_uint8_hex(String_view sv);\r
-void*  sv_to_ptr(String_view sv);\r
-float32 sv_to_float(String_view sv);\r
-bool sv_contains_char(String_view sv, char ch);\r
-bool sv_is_hex_numbers(String_view sv);\r
-bool sv_equals(String_view sv1, String_view sv2);\r
+    char *data;\r
+    size_t count;\r
+} c_String_view;\r
+\r
+#define c_SV_FMT "%.*s"\r
+#define c_SV_ARG(sv) (int)sv.count, sv.data\r
+\r
+#define c_SV(cstr) (c_String_view){.data = cstr, strlen(cstr)}\r
+\r
+void c_sv_print_dumb(c_String_view sv);\r
+c_String_view c_sv_from_cstr(const char* cstr); // Actually just use SV(cstr) macro...\r
+c_String_view c_sv_lpop(c_String_view* sv, uint32 n);\r
+c_String_view c_sv_lpop_until_predicate(c_String_view* sv, int(*predicate)(int));\r
+c_String_view c_sv_rpop_until_predicate(c_String_view* sv, int(*predicate)(int));\r
+c_String_view c_sv_lpop_until_char(c_String_view* sv, char ch);\r
+c_String_view c_sv_rpop_until_char(c_String_view* sv, char ch);\r
+void c_sv_lremove(c_String_view* sv, size_t n);\r
+void c_sv_rremove(c_String_view* sv, size_t n);\r
+void c_sv_lremove_until_char(c_String_view* sv, char ch);\r
+void c_sv_rremove_until_char(c_String_view* sv, char ch);\r
+void c_sv_lremove_until_char_after(c_String_view* sv, char ch);\r
+void c_sv_rremove_until_char_after(c_String_view* sv, char ch);\r
+void c_sv_ltrim(c_String_view* sv);\r
+void c_sv_rtrim(c_String_view* sv);\r
+void c_sv_trim(c_String_view* sv);\r
+char* c_sv_to_cstr(c_String_view sv);\r
+int32 c_sv_to_int(c_String_view sv);\r
+uint64 c_sv_to_uint64(c_String_view sv);\r
+uint8 c_sv_to_uint8_hex(c_String_view sv);\r
+void* c_sv_to_ptr(c_String_view sv);\r
+float32 c_sv_to_float(c_String_view sv);\r
+bool c_sv_contains_char(c_String_view sv, char ch);\r
+bool c_sv_is_hex_numbers(c_String_view sv);\r
+bool c_sv_equals(c_String_view sv1, c_String_view sv2);\r
 \r
 //\r
 // Args\r
 //\r
 \r
-cstr shift_args(int* argc, char*** argv);\r
+cstr c_shift_args(int* argc, char*** argv);\r
 \r
 #endif /* _COMMONLIB_H_ */\r
 \r
@@ -163,376 +156,351 @@ cstr shift_args(int* argc, char*** argv);
 //\r
 \r
 #if defined(_WIN32) || defined(__CYGWIN__)\r
-void os_get_timedate(Arena* a) {\r
-    (void)a;\r
-    ASSERT(false, "Unimplemented!");\r
+void c_os_get_timedate(c_Arena* a) {\r
+        (void)a;\r
+        c_ASSERT(false, "Unimplemented!");\r
 }\r
 \r
-bool os_file_exists(cstr filename) {\r
-    (void) filename;\r
-    ASSERT(false, "Unimplemented!");\r
-    return false;\r
+bool c_os_file_exists(cstr filename) {\r
+        (void) filename;\r
+        c_ASSERT(false, "Unimplemented!");\r
+        return false;\r
 }\r
 \r
 #elif defined(__linux__)\r
-void os_get_timedate(Arena* a) {\r
-    (void)a;\r
-    ASSERT(false, "Unimplemented!");\r
+void c_os_get_timedate(c_Arena* a) {\r
+        (void)a;\r
+        c_ASSERT(false, "Unimplemented!");\r
 }\r
 \r
-bool os_file_exists(cstr filename) {\r
-    struct stat buf;\r
-    ASSERT(false, "Unimplemented!");\r
-    return stat(filename, &buf) == 0;\r
+bool c_os_file_exists(cstr filename) {\r
+        struct stat buf;\r
+        c_ASSERT(false, "Unimplemented!");\r
+        return stat(filename, &buf) == 0;\r
 }\r
 #endif\r
 \r
 // simple and dirty way to have defering in C (not recommended to use!)\r
 #define defer(ret_val) \\r
-  result = ret_val;\\r
-  goto defer\r
+    result = ret_val;\\r
+    goto defer\r
 \r
-const char* slurp_file(const char* filename, bool* success) {\r
-  FILE* f = fopen(filename, "rb");\r
-  char* result = NULL;\r
+// TODO: Refactor error messages\r
+const char *c_slurp_file(const char* filename, bool* success) {\r
+    FILE* f = fopen(filename, "rb");\r
+    char* result = NULL;\r
 \r
-  if (f == NULL){\r
-    log_error("slurp_file::fopen(\"%s\", \"rb\") -> %s\n", filename, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (f == NULL){\r
+        c_log_error("slurp_file::fopen(\"%s\", \"rb\") -> %s\n", filename, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  if (fseek(f, 0, SEEK_END) < 0) {\r
-    log_error("slurp_file::fseek(f, 0, SEEK_END) -> %s\n", filename, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (fseek(f, 0, SEEK_END) < 0) {\r
+        c_log_error("slurp_file::fseek(%s, 0, SEEK_END) -> %s\n", filename, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  size_t fsize = ftell(f);\r
+    size_t fsize = ftell(f);\r
 \r
-  if (fsize == (size_t)-1){\r
-    log_error("slurp_file::ftell(f) -> %s\n", filename, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (fsize == (size_t)-1){\r
+        c_log_error("slurp_file::ftell(%s) -> %s\n", filename, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  result = malloc(sizeof(char)*(fsize+1));\r
+    result = malloc(sizeof(char)*(fsize+1));\r
 \r
-  if (result == NULL){\r
-    log_error("slurp_file::malloc(%zu) -> %s\n", sizeof(char)*fsize, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (result == NULL){\r
+        c_log_error("slurp_file::malloc(%zu) -> %s\n", sizeof(char)*fsize, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  if (fseek(f, 0, SEEK_SET) < 0) {\r
-    log_error("slurp_file::fseek(f, 0, SEEK_SET) -> %s\n", filename, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (fseek(f, 0, SEEK_SET) < 0) {\r
+        c_log_error("slurp_file::fseek(%s, 0, SEEK_SET) -> %s\n", filename, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  if (fread((char*)result, sizeof(char), fsize, f) != fsize){\r
-    log_error("slurp_file::fread(result, %d, 1, f) -> %s\n", fsize, strerror(errno));\r
-    defer(NULL);\r
-  }\r
+    if (fread((char*)result, sizeof(char), fsize, f) != fsize){\r
+        c_log_error("slurp_file::fread(result, %zu, 1, f) -> %s\n", fsize, strerror(errno));\r
+        defer(NULL);\r
+    }\r
 \r
-  // set null-terminator\r
-  result[fsize] = '\0';\r
+    // set null-terminator\r
+    result[fsize] = '\0';\r
 \r
  defer:\r
-  if (f) fclose(f);\r
-  *success = result != NULL;\r
-  return result;\r
+    if (f) fclose(f);\r
+    *success = result != NULL;\r
+    return result;\r
 }\r
 \r
-// void touch_file_if_doesnt_exist(cstr filename) {\r
-//     if (os_file_exists(filename)) return;\r
-//     FILE* file = fopen(filename, "w");\r
-//     if (file)\r
-//         fclose(file);\r
-// }\r
+void c_touch_file_if_doesnt_exist(cstr filename) {\r
+        if (c_os_file_exists(filename)) return;\r
+        FILE* file = fopen(filename, "w");\r
+        if (file) fclose(file);\r
+}\r
 \r
 //\r
 // ### Allocators ###\r
 //\r
 \r
-// Arena\r
+// c_Arena\r
 \r
-Arena Arena_make(size_t size) {\r
-  Arena res = {0};\r
-  res.buff_size = size == 0 ? ARENA_BUFF_INITIAL_SIZE : size;\r
-  res.buff = malloc(res.buff_size);\r
-  res.ptr = res.buff;\r
+c_Arena c_Arena_make(size_t size) {\r
+    c_Arena res = {0};\r
+    res.buff_size = size == 0 ? ARENA_BUFF_INITIAL_SIZE : size;\r
+    res.buff = malloc(res.buff_size);\r
+    res.ptr = res.buff;\r
 \r
-  ASSERT(res.buff, "Malloc failed?");\r
+    c_ASSERT(res.buff, "Malloc failed?");\r
 \r
-  return res;\r
+    return res;\r
 }\r
 \r
-void* Arena_alloc(Arena* a, size_t size) {\r
-  ASSERT(a->buff, "Bro pass an initialized arena!");\r
+void* c_Arena_alloc(c_Arena* a, size_t size) {\r
+    c_ASSERT(a->buff, "Bro pass an initialized arena!");\r
 \r
-  void* res = a->ptr;\r
-  a->ptr = (uint8*)a->ptr + size;\r
-\r
-  // TODO: realloc buff with greater buff_size\r
-  size_t diff = (size_t)((uint8*)a->ptr - (uint8*)a->buff);\r
-  if (diff > a->buff_size) {\r
-    log_info("Arena resized from %u to %u", a->buff_size, a->buff_size*2);\r
-    a->buff_size *= 2;\r
-    a->buff = realloc(a->buff, a->buff_size);\r
-    a->ptr = (uint8*)a->buff + diff;\r
-    res = a->ptr;\r
+    void* res = a->ptr;\r
     a->ptr = (uint8*)a->ptr + size;\r
-  }\r
-  /* ASSERT((size_t)((uint8*)a->ptr - (uint8*)a->buff) <= a->buff_size); */\r
 \r
-  return res;\r
+    // TODO: realloc buff with greater buff_size\r
+    size_t diff = (size_t)((uint8*)a->ptr - (uint8*)a->buff);\r
+    if (diff > a->buff_size) {\r
+        c_log_info("c_Arena resized from %zu to %zu", a->buff_size, a->buff_size*2);\r
+        a->buff_size *= 2;\r
+        a->buff = realloc(a->buff, a->buff_size);\r
+        a->ptr = (uint8*)a->buff + diff;\r
+        res = a->ptr;\r
+        a->ptr = (uint8*)a->ptr + size;\r
+    }\r
+    /* c_ASSERT((size_t)((uint8*)a->ptr - (uint8*)a->buff) <= a->buff_size); */\r
+\r
+    return res;\r
 }\r
 \r
-void Arena_reset(Arena* a) {\r
-  a->ptr = a->buff;\r
+void c_Arena_reset(c_Arena* a) {\r
+    a->ptr = a->buff;\r
 }\r
 \r
-void Arena_free(Arena* a) {\r
-  free(a->buff);\r
+void c_Arena_free(c_Arena* a) {\r
+    free(a->buff);\r
 }\r
 \r
 //\r
-// String\r
+// String view\r
 //\r
 \r
-bool cstr_to_wstr(Arena* warena, cstr str) {\r
-  if (warena->buff_size <= 0) {\r
-    log_error("Arena size is 0!!!");\r
-    return false;\r
-  }\r
-\r
-  size_t count = strlen(str)+1;\r
-  size_t ret = mbstowcs((wchar*)warena->buff,\r
-                 str,\r
-                 count);\r
+void c_sv_print_dumb(c_String_view sv){\r
+    for (size_t i = 0; i < (size_t)sv.count; ++i){\r
+        putc(*(sv.data+i), stdout);\r
+    }\r
+}\r
 \r
-  if (ret == (uint)-1) {\r
-    log_error("Encountered an invalid multibyte character!");\r
-    return false;\r
-  } else if (ret == count) {\r
-    log_error("The wide-character string isn't null-terminated!");\r
-    return false;\r
-  }\r
-  return true;\r
+c_String_view c_sv_from_cstr(const char* cstr){\r
+    return (c_String_view){\r
+        .data = (char *)cstr,\r
+        .count = strlen(cstr),\r
+    };\r
 }\r
 \r
-//\r
-// String view\r
-//\r
+c_String_view c_sv_lpop(c_String_view* sv, uint32 n) {\r
+    c_String_view res = {0};\r
+    if (sv->count < n) return res;\r
+    res.data = sv->data;\r
+    res.count = n;\r
+\r
+    sv->data += n;\r
+    sv->count -= n;\r
 \r
-void sv_print_dumb(String_view sv){\r
-  for (size_t i = 0; i < (size_t)sv.count; ++i){\r
-    putc(*(sv.data+i), stdout);\r
-  }\r
+    return res;\r
 }\r
 \r
-String_view sv_from_cstr(const char* cstr){\r
-  return (String_view){\r
-    .data = cstr,\r
-    .count = strlen(cstr),\r
-  };\r
+c_String_view c_sv_lpop_until_predicate(c_String_view* sv, int(*predicate)(int)){\r
+    const char* old_sv_data = sv->data;\r
+    while (sv->count > 0 && !predicate(*sv->data)){\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
+\r
+    return (c_String_view){\r
+        .data = sv->data - (sv->data - old_sv_data),\r
+        .count = (sv->data - old_sv_data),\r
+    };\r
 }\r
 \r
-String_view sv_lpop(String_view* sv, uint32 n) {\r
-  String_view res = {0};\r
-  if (sv->count < n) return res;\r
-  res.data = sv->data;\r
-  res.count = n;\r
+c_String_view c_sv_rpop_until_predicate(c_String_view* sv, int(*predicate)(int)){\r
+    size_t old_sv_count = sv->count;\r
+    while (sv->count > 0 && !predicate(*(sv->data+sv->count-1))){\r
+        sv->count--;\r
+    }\r
 \r
-  sv->data += n;\r
-  sv->count -= n;\r
+    return (c_String_view){\r
+        .data = sv->data + sv->count,\r
+        .count = old_sv_count - sv->count,\r
+    };\r
+}\r
+\r
+c_String_view c_sv_lpop_until_char(c_String_view* sv, char ch){\r
+    const char* old_sv_data = sv->data;\r
+    while (sv->count > 0 && *sv->data != ch){\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
 \r
-  return res;\r
+    return (c_String_view){\r
+        .data = sv->data - (sv->data - old_sv_data),\r
+        .count = (sv->data - old_sv_data),\r
+    };\r
 }\r
 \r
-String_view sv_lpop_until_predicate(String_view* sv, int(*predicate)(int)){\r
-  const char* old_sv_data = sv->data;\r
-  while (sv->count > 0 && !predicate(*sv->data)){\r
-    sv->data++;\r
-    sv->count--;\r
-  }\r
+c_String_view c_sv_rpop_until_char(c_String_view* sv, char ch){\r
+    size_t old_sv_count = sv->count;\r
+    while (sv->count > 0 && *(sv->data+sv->count-1) != ch){\r
+        sv->count--;\r
+    }\r
 \r
-  return (String_view){\r
-    .data = sv->data - (sv->data - old_sv_data),\r
-    .count = (sv->data - old_sv_data),\r
-  };\r
+    return (c_String_view){\r
+        .data = sv->data + sv->count,\r
+        .count = old_sv_count - sv->count,\r
+    };\r
 }\r
 \r
-String_view sv_rpop_until_predicate(String_view* sv, int(*predicate)(int)){\r
-  size_t old_sv_count = sv->count;\r
-  while (sv->count > 0 && !predicate(*(sv->data+sv->count-1))){\r
-    sv->count--;\r
-  }\r
+void c_sv_lremove(c_String_view* sv, size_t n){\r
+    if (n > sv->count) n = sv->count;\r
 \r
-  return (String_view){\r
-    .data = sv->data + sv->count,\r
-    .count = old_sv_count - sv->count,\r
-  };\r
+    sv->data += n;\r
+    sv->count -= n;\r
 }\r
 \r
-String_view sv_lpop_until_char(String_view* sv, char ch){\r
-  const char* old_sv_data = sv->data;\r
-  while (sv->count > 0 && *sv->data != ch){\r
-    sv->data++;\r
-    sv->count--;\r
-  }\r
+void c_sv_rremove(c_String_view* sv, size_t n){\r
+    if (n > sv->count)\r
+        sv->count = 0;\r
+    else\r
+        sv->count -= n;\r
+}\r
 \r
-  return (String_view){\r
-    .data = sv->data - (sv->data - old_sv_data),\r
-    .count = (sv->data - old_sv_data),\r
-  };\r
+void c_sv_lremove_until_char(c_String_view* sv, char ch){\r
+    while (sv->count > 0 && *sv->data != ch){\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
 }\r
 \r
-String_view sv_rpop_until_char(String_view* sv, char ch){\r
-  size_t old_sv_count = sv->count;\r
-  while (sv->count > 0 && *(sv->data+sv->count-1) != ch){\r
-    sv->count--;\r
-  }\r
+void c_sv_rremove_until_char(c_String_view* sv, char ch){\r
+    while (sv->count > 0 && *(sv->data+sv->count-1) != ch){\r
+        sv->count--;\r
+    }\r
+}\r
 \r
-  return (String_view){\r
-    .data = sv->data + sv->count,\r
-    .count = old_sv_count - sv->count,\r
-  };\r
+void c_sv_lremove_until_char_after(c_String_view* sv, char ch){\r
+    while (sv->count > 0 && *(sv->data-1) != ch){\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
 }\r
 \r
-void sv_lremove(String_view* sv, size_t n){\r
-  if (n > sv->count) n = sv->count;\r
+void c_sv_rremove_until_char_after(c_String_view* sv, char ch){\r
+    while (sv->count > 0 && *(sv->data+sv->count) != ch){\r
+        sv->count--;\r
+    }\r
+}\r
 \r
-  sv->data += n;\r
-  sv->count -= n;\r
+void c_sv_ltrim(c_String_view* sv){\r
+    while (sv->count > 0 && isspace(*sv->data)){\r
+        sv->data++;\r
+        sv->count--;\r
+    }\r
 }\r
 \r
-void sv_rremove(String_view* sv, size_t n){\r
-  if (n > sv->count)\r
-    sv->count = 0;\r
-  else\r
-    sv->count -= n;\r
+void c_sv_rtrim(c_String_view* sv){\r
+    while (sv->count > 0 && isspace(*(sv->data+sv->count-1))){\r
+        sv->count--;\r
+    }\r
 }\r
 \r
-void sv_lremove_until_char(String_view* sv, char ch){\r
-  while (sv->count > 0 && *sv->data != ch){\r
-    sv->data++;\r
-    sv->count--;\r
-  }\r
+void c_sv_trim(c_String_view* sv){\r
+    c_sv_ltrim(sv);\r
+    c_sv_rtrim(sv);\r
 }\r
 \r
-void sv_rremove_until_char(String_view* sv, char ch){\r
-  while (sv->count > 0 && *(sv->data+sv->count-1) != ch){\r
-    sv->count--;\r
-  }\r
+char* c_sv_to_cstr(c_String_view sv){\r
+    char* res = (char*)calloc(1, sizeof(char)*sv.count);\r
+    memcpy(res, sv.data, sv.count);\r
+    return res;\r
 }\r
 \r
-void sv_lremove_until_char_after(String_view* sv, char ch){\r
-  while (sv->count > 0 && *(sv->data-1) != ch){\r
-    sv->data++;\r
-    sv->count--;\r
-  }\r
+// TODO: check for failure of conversion. returns 0/0.0 on failure, so just check if the str contains zero.\r
+int32 c_sv_to_int(c_String_view sv) {\r
+    char* str = c_sv_to_cstr(sv);\r
+    int32 res = atoi(str);\r
+    free(str);\r
+    return res;\r
 }\r
 \r
-void sv_rremove_until_char_after(String_view* sv, char ch){\r
-  while (sv->count > 0 && *(sv->data+sv->count) != ch){\r
-    sv->count--;\r
-  }\r
+uint64 c_sv_to_uint64(c_String_view sv) {\r
+    char* str = c_sv_to_cstr(sv);\r
+    uint64 res = (uint64)atoll(str);\r
+    free(str);\r
+    return res;\r
 }\r
 \r
-void sv_ltrim(String_view* sv){\r
-  while (sv->count > 0 && isspace(*sv->data)){\r
-    sv->data++;\r
-    sv->count--;\r
-  }\r
+uint8 c_sv_to_uint8_hex(c_String_view sv) {\r
+    char* str = c_sv_to_cstr(sv);\r
+    char* end = str + sv.count;\r
+    uint8 res = (uint8)strtol(str, &end, 16);\r
+    free(str);\r
+    return res;\r
 }\r
 \r
-void sv_rtrim(String_view* sv){\r
-  while (sv->count > 0 && isspace(*(sv->data+sv->count-1))){\r
-    sv->count--;\r
-  }\r
+float32 c_sv_to_float(c_String_view sv) {\r
+    char* str = c_sv_to_cstr(sv);\r
+    float32 res = (float32)atof(str);\r
+    free(str);\r
+    return res;\r
 }\r
 \r
-void sv_trim(String_view* sv){\r
-  sv_ltrim(sv);\r
-  sv_rtrim(sv);\r
+void*    c_sv_to_ptr(c_String_view sv) {\r
+    char* str = c_sv_to_cstr(sv);\r
+    char* end = NULL;\r
+    void* res = (void*)strtoull(str, &end, 16);\r
+    free(str);\r
+    return res;\r
 }\r
 \r
-char* sv_to_cstr(String_view sv){\r
-  char* res = (char*)calloc(1, sizeof(char)*sv.count);\r
-  memcpy(res, sv.data, sv.count);\r
-  return res;\r
+bool c_sv_contains_char(c_String_view sv, char ch){\r
+    for (size_t i = 0; i < sv.count; ++i){\r
+        if (sv.data[i] == ch) return true;\r
+    }\r
+    return false;\r
 }\r
 \r
-// TODO: check for failure of conversion. returns 0/0.0 on failure, so just check if the str contains zero.\r
-int32 sv_to_int(String_view sv) {\r
-  char* str = sv_to_cstr(sv);\r
-  int32 res = atoi(str);\r
-  free(str);\r
-  return res;\r
-}\r
-\r
-uint64 sv_to_uint64(String_view sv) {\r
-  char* str = sv_to_cstr(sv);\r
-  uint64 res = (uint64)atoll(str);\r
-  free(str);\r
-  return res;\r
-}\r
-\r
-uint8 sv_to_uint8_hex(String_view sv) {\r
-  char* str = sv_to_cstr(sv);\r
-  char* end = str + sv.count;\r
-  uint8 res = (uint8)strtol(str, &end, 16);\r
-  free(str);\r
-  return res;\r
-}\r
-\r
-float32 sv_to_float(String_view sv) {\r
-  char* str = sv_to_cstr(sv);\r
-  float32 res = (float32)atof(str);\r
-  free(str);\r
-  return res;\r
-}\r
-\r
-void*  sv_to_ptr(String_view sv) {\r
-  char* str = sv_to_cstr(sv);\r
-  char* end = NULL;\r
-  void* res = (void*)strtoull(str, &end, 16);\r
-  free(str);\r
-  return res;\r
-}\r
-\r
-bool sv_contains_char(String_view sv, char ch){\r
-  for (size_t i = 0; i < sv.count; ++i){\r
-    if (sv.data[i] == ch) return true;\r
-  }\r
-  return false;\r
-}\r
-\r
-bool sv_is_hex_numbers(String_view sv) {\r
-  char hex[] = {\r
-    '0', '1', '2', '3', '4', '5', '6', '7',\r
-    '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f',\r
-    'A', 'B', 'C', 'D', 'E', 'F'\r
-  };\r
-  bool found = false;\r
-  for (size_t i = 0; i < sv.count; ++i) {\r
-    char c = sv.data[i];\r
-    for (size_t j = 0; j < ARRAY_LEN(hex); ++j) {\r
-      if (hex[j] == c) {\r
+bool c_sv_is_hex_numbers(c_String_view sv) {\r
+    char hex[] = {\r
+        '0', '1', '2', '3', '4', '5', '6', '7',\r
+        '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f',\r
+        'A', 'B', 'C', 'D', 'E', 'F'\r
+    };\r
+    bool found = false;\r
+    for (size_t i = 0; i < sv.count; ++i) {\r
+        char c = sv.data[i];\r
+        for (size_t j = 0; j < c_ARRAY_LEN(hex); ++j) {\r
+            if (hex[j] == c) {\r
        found = true;\r
-      }\r
+            }\r
+        }\r
     }\r
-  }\r
 \r
-  return found;\r
+    return found;\r
 }\r
 \r
-bool sv_equals(String_view sv1, String_view sv2) {\r
-  if (sv1.count != sv2.count) return false;\r
-  for (size_t i = 0; i < sv1.count; ++i) {\r
-    if (sv1.data[i] != sv2.data[i]) {\r
-      return false;\r
+bool c_sv_equals(c_String_view sv1, c_String_view sv2) {\r
+    if (sv1.count != sv2.count) return false;\r
+    for (size_t i = 0; i < sv1.count; ++i) {\r
+        if (sv1.data[i] != sv2.data[i]) {\r
+            return false;\r
+        }\r
     }\r
-  }\r
 \r
-  return true;\r
+    return true;\r
 }\r
 \r
 \r
@@ -540,13 +508,13 @@ bool sv_equals(String_view sv1, String_view sv2) {
 // Args\r
 //\r
 \r
-cstr shift_args(int* argc, char*** argv) {\r
-  if (*argc <= 0) return NULL;\r
+cstr c_shift_args(int* argc, char*** argv) {\r
+    if (*argc <= 0) return NULL;\r
 \r
-  cstr res = *(argv)[0];\r
-  *argv = (*argv) + 1;\r
-  *argc = (*argc) - 1;\r
-  return res;\r
+    cstr res = *(argv)[0];\r
+    *argv = (*argv) + 1;\r
+    *argc = (*argc) - 1;\r
+    return res;\r
 }\r
 \r
 #endif\r