]> www.git.momoyon.org Git - lang.git/commitdiff
[commonlib.h] Update
authorahmedsamyh <ahmedsamyh10@gmail.com>
Fri, 11 Apr 2025 14:15:50 +0000 (19:15 +0500)
committerahmedsamyh <ahmedsamyh10@gmail.com>
Fri, 11 Apr 2025 14:15:50 +0000 (19:15 +0500)
include/commonlib.h

index 3eb80c8c3a53ea4ee41c8b896234ddb2bebe9f41..326fd569179f40880abfa940d97b857c7328a2bd 100644 (file)
@@ -8,6 +8,7 @@
 #include <string.h>\r
 #include <ctype.h>\r
 #include <assert.h>\r
+#include <limits.h>\r
 \r
 // Remove Prefix\r
 #ifdef COMMONLIB_REMOVE_PREFIX\r
@@ -27,7 +28,7 @@
 #define log_info c_log_info\r
 #define log_warning c_log_warning\r
 \r
-#define slurp_file c_slurp_file\r
+#define read_file c_read_file\r
 #define touch_file_if_doesnt_exist c_touch_file_if_doesnt_exist\r
 \r
 #define Arena c_Arena\r
@@ -66,7 +67,7 @@
 #define sv_trim c_sv_trim\r
 #define sv_to_cstr c_sv_to_cstr\r
 #define sv_to_int c_sv_to_int\r
-#define sv_to_uint64 c_sv_to_uint64\r
+#define sv_to_uint c_sv_to_uint\r
 #define sv_to_uint8_hex c_sv_to_uint8_hex\r
 #define sv_to_ptr c_sv_to_ptr\r
 #define sv_to_float c_sv_to_float\r
@@ -208,8 +209,8 @@ bool c_os_file_exists(cstr filename);
 // 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* c_slurp_file(const char* filename, bool* success);\r
+// reads entire file and gives back the file content and filesize in bytes. (caller must be responsible for freeing the string!)\r
+const char* c_read_file(const char* filename, int *file_size);\r
 void c_touch_file_if_doesnt_exist(cstr file);\r
 \r
 //\r
@@ -281,11 +282,10 @@ void c_sv_ltrim(c_String_view* sv);
 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
+int64 c_sv_to_int(c_String_view sv, int *count, int base);\r
+uint64 c_sv_to_uint(c_String_view sv, int *count, int base);\r
+void* c_sv_to_ptr(c_String_view sv, int *count, int base);\r
+float64 c_sv_to_float(c_String_view sv, int *count);\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
@@ -334,8 +334,8 @@ bool c_os_file_exists(cstr filename) {
     result = ret_val;\\r
     goto defer\r
 \r
-const char *c_slurp_file(const char* filename, bool* success) {\r
-    FILE* f = fopen(filename, "rb");\r
+const char *c_read_file(const char* filename, int *file_size) {\r
+    FILE* f = fopen(filename, "r");\r
     char* result = NULL;\r
 \r
     if (f == NULL){\r
@@ -367,17 +367,16 @@ const char *c_slurp_file(const char* filename, bool* success) {
         defer(NULL);\r
     }\r
 \r
-    if (fread((char*)result, sizeof(char), fsize, f) != fsize){\r
-        c_log_error("'%s': %s", filename, strerror(errno));\r
-        defer(NULL);\r
-    }\r
+    size_t read = fread((char*)result, sizeof(char), fsize, f);\r
+\r
+    *file_size = (int)read;\r
 \r
     // set null-terminator\r
-    result[fsize] = '\0';\r
+    result[read] = '\0';\r
 \r
  defer:\r
     if (f) fclose(f);\r
-    *success = result != NULL;\r
+    if (result == NULL) *file_size = -1;\r
     return result;\r
 }\r
 \r
@@ -616,37 +615,59 @@ char* c_sv_to_cstr(c_String_view sv){
     return res;\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 c_sv_to_int(c_String_view sv) {\r
-    char* str = c_sv_to_cstr(sv);\r
-    int32 res = atoi(str);\r
-    C_FREE(str);\r
-    return res;\r
-}\r
+int64 c_sv_to_int(c_String_view sv, int *count_out, int base) {\r
+    char *str = c_sv_to_cstr(sv);\r
+\r
+    char *endptr = NULL;\r
+\r
+    int64 res = strtol(str, &endptr, base);\r
+\r
+    if (endptr == str) {\r
+        *count_out = -1;\r
+        return res;\r
+    }\r
+\r
+    *count_out = (int)(endptr - str);\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
     C_FREE(str);\r
     return res;\r
 }\r
 \r
-uint8 c_sv_to_uint8_hex(c_String_view sv) {\r
+uint64 c_sv_to_uint(c_String_view sv, int *count, int base) {\r
     char* str = c_sv_to_cstr(sv);\r
-    char* end = str + sv.count;\r
-    uint8 res = (uint8)strtol(str, &end, 16);\r
+\r
+    char *endptr = NULL;\r
+    uint64 res = strtoul(str, &endptr, base);\r
+\r
+    if (endptr == str) {\r
+        *count = -1;\r
+        return res;\r
+    }\r
+\r
+    *count = (int)(endptr - str);\r
+\r
     C_FREE(str);\r
     return res;\r
 }\r
 \r
-float32 c_sv_to_float(c_String_view sv) {\r
+float64 c_sv_to_float(c_String_view sv, int *count) {\r
     char* str = c_sv_to_cstr(sv);\r
-    float32 res = (float32)atof(str);\r
+\r
+    char *endptr = NULL;\r
+    float64 res = strtod(str, &endptr);\r
+\r
+    if (endptr == str) {\r
+        *count = -1;\r
+        return res;\r
+    }\r
+\r
+    *count = (int)(endptr - str);\r
+\r
     C_FREE(str);\r
     return res;\r
 }\r
 \r
-void*    c_sv_to_ptr(c_String_view sv) {\r
+void* c_sv_to_ptr(c_String_view sv, int *count, int base) {\r
     char* str = c_sv_to_cstr(sv);\r
     char* end = NULL;\r
     void* res = (void*)strtoull(str, &end, 16);\r