]> www.git.momoyon.org Git - commonlib.git/commitdiff
[commonlib.h] Add Maths
authormomoyon <ahmedsamyh10@gmail.com>
Sun, 13 Apr 2025 12:07:28 +0000 (17:07 +0500)
committermomoyon <ahmedsamyh10@gmail.com>
Sun, 13 Apr 2025 12:07:28 +0000 (17:07 +0500)
commonlib.h

index d1b219d088c44873b9a125b0d4757545de15f599..285ae190a7747b568fc32126e75bf5967ed15a24 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,9 +67,8 @@
 #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
 #define sv_contains_char c_sv_contains_char\r
 #define sv_is_hex_numbers c_sv_is_hex_numbers\r
@@ -126,6 +126,13 @@ typedef const wchar* wstr;
 #define c_shift(xs, xsz) (assert(xsz > 0 && "Array is empty"), xsz--, *xs++)\r
 #define c_shift_args c_shift\r
 \r
+//\r
+// Math\r
+//\r
+\r
+int clampi(int v, int min, int max);\r
+float clampf(float v, float min, float max);\r
+\r
 //\r
 // Struct pre-decls\r
 //\r
@@ -209,7 +216,7 @@ bool c_os_file_exists(cstr filename);
 //\r
 \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_slurp_file(const char* filename, int *file_size);\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 +288,9 @@ 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
+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
@@ -301,6 +306,22 @@ bool c_sv_equals(c_String_view sv1, c_String_view sv2);
 \r
 // My things implementation:\r
 \r
+//\r
+// Math\r
+//\r
+\r
+int clampi(int v, int min, int max) {\r
+    v = v < min ? min : v;\r
+    v = v > max ? max : v;\r
+    return v;\r
+}\r
+\r
+float clampf(float v, float min, float max) {\r
+    v = v < min ? min : v;\r
+    v = v > max ? max : v;\r
+    return v;\r
+}\r
+\r
 //\r
 // OS\r
 //\r
@@ -334,7 +355,7 @@ bool c_os_file_exists(cstr filename) {
     result = ret_val;\\r
     goto defer\r
 \r
-const char *c_slurp_file(const char* filename, int *file_size) {\r
+const char *c_read_file(const char* filename, int *file_size) {\r
     FILE* f = fopen(filename, "r");\r
     char* result = NULL;\r
 \r
@@ -615,40 +636,54 @@ 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
-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
+    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
-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
     C_FREE(str);\r
     return res;\r
 }\r
 \r
-float32 c_sv_to_float(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
-    float32 res = (float32)atof(str);\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
-void*    c_sv_to_ptr(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
-    char* end = NULL;\r
-    void* res = (void*)strtoull(str, &end, 16);\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