#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
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
//\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
// 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