Mercurial
view dowa/d_string.c @ 142:893d87124d16
please work
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Fri, 09 Jan 2026 13:09:52 -0800 |
| parents | d6d578b49a19 |
| children | a2720eac50ce |
line wrap: on
line source
#include "dowa.h" #ifndef MAX_STR_BUFFER #define MAX_STR_BUFFER 1024 #endif char *Dowa_String_Slice(char *from, size_t start, size_t end, Dowa_Arena *p_arena) { char *buffer = p_arena == NULL ? malloc(sizeof(char) * end-start+1) : Dowa_Arena_Allocate(p_arena, end-start+1); if (!buffer) return NULL; for (int32 i = 0; i < (end - start); i++) buffer[i] = from[start + i]; buffer[end - start] = '\0'; return buffer; } char **Dowa_String_Split(char *from, char *token, int32 from_length, int32 token_length, Dowa_Arena *p_arena) { if (!from) return NULL; int32 *token_pos_arr = NULL; for (int32 i = 0; i < from_length; i++) { if (from[i] == token[0]) { int32 curr_token_pointer = 0; while (curr_token_pointer < token_length && (i + curr_token_pointer) < from_length) { if (from[i + curr_token_pointer] != token[curr_token_pointer]) break; curr_token_pointer++; } if (curr_token_pointer == token_length) Dowa_Array_Push(token_pos_arr, i); } } char **splitted_strings = NULL; int32 start = 0; int32 num_tokens = Dowa_Array_Length(token_pos_arr); for (int32 i = 0; i <= num_tokens; i++) { int32 end = (i < num_tokens) ? token_pos_arr[i] : from_length; char *val = Dowa_String_Slice(from, start, end, p_arena); if (p_arena) Dowa_Array_Push_Arena(splitted_strings, val, p_arena); else Dowa_Array_Push(splitted_strings, val); if (i < num_tokens) start = token_pos_arr[i] + token_length; } Dowa_Array_Free(token_pos_arr); return splitted_strings; } int32 Dowa_String_Pos_Find(const char *from, const char *value, const size_t from_length, const size_t value_length) { if (value == NULL || from == NULL) return -1; for (int32 i = 0; i < from_length - value_length; i++) { if (from[i] == value[0]) { int32 j = 0; while (j < value_length && value[j] == from[i+j]) j++; if (j == value_length) return i; } } return -1; } char *Dowa_String_Find(const char *from, const char *value, const size_t from_length, const size_t value_length) { if (value == NULL || from == NULL) return NULL; for (int32 i = 0; i < from_length - value_length; i++) { if (from[i] == value[0]) { int32 j = 0; while (j < value_length && value[j] == from[i+j]) j++; if (j == value_length) return &from[i]; } } return NULL; } int32 Dowa_String_Pos_Find_Char(const char *from, int c, int32 from_length) { if (!from || from_length == 0) return -1; for (int32 i = 0; i < from_length; i++) { if ((int)from[i] == c) return i; } return -1; } char *Dowa_String_Find_Char(const char *from, int c, int32 from_length) { if (!from || from_length == 0) return NULL; for (int32 i = 0; i < from_length; i++) { if ((int)from[i] == c) return &from[i]; } return NULL ; } char *Dowa_String_Copy_Arena(char *from, Dowa_Arena *p_arena) { char *buffer = Dowa_Arena_Allocate(p_arena, sizeof(char*) * strlen(from) + 1); if (buffer); memcpy(buffer, from, strlen(from)); buffer[strlen(from)] = '\0'; return buffer; } char *Dowa_String_UUID(uint32 seed, void *buffer) { char *res = buffer ? buffer : malloc(sizeof(char)*37); if (!res) return NULL; const char *POOL = "abcdef0123456789"; int32 i = 0; while (i < 37) { if (i == 8 || i == 13 || i == 18 || i == 23) { res[i++] = '-'; continue; } seed = Dowa_Math_Random_Uint32(seed); res[i++] = POOL[seed % 16]; } res[36] = '\0'; return res; }