diff dowa/d_memory.c @ 72:4532ce6d9eb8

[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
author June Park <parkjune1995@gmail.com>
date Mon, 29 Dec 2025 07:50:07 -0800
parents 75de5903355c
children d39e8860a361
line wrap: on
line diff
--- a/dowa/d_memory.c	Sun Dec 28 20:34:22 2025 -0800
+++ b/dowa/d_memory.c	Mon Dec 29 07:50:07 2025 -0800
@@ -26,9 +26,10 @@
   return Dowa_Arena_Allocate_Aligned(p_arena, size, sizeof(void*) * 2);
 }
 
-void Dowa_Arena_Destroy(Dowa_Arena *p_arena)
+void Dowa_Arena_Free(Dowa_Arena *p_arena)
 {
-  if (!p_arena) return;
+  if (!p_arena)
+    return;
 
   if (p_arena->buffer)
     Dowa_Free(p_arena->buffer);
@@ -633,505 +634,3 @@
   Dowa_Hash_Index* p_index = dowa__hashmap_get_index(p_map);
   return p_index ? p_index->item_count : 0;
 }
-
-/*
-// --- OLD HashMap Implementation (Commented out for migration) --- //
-Dowa_HashMap *Dowa_HashMap_Create(size_t capacity)
-{
-  Dowa_HashMap *p_hash_map;
-  p_hash_map = malloc(sizeof(Dowa_HashMap));
-  if (p_hash_map == NULL)
-  {
-    return NULL;
-  }
-  p_hash_map->entries = calloc(capacity, sizeof(*p_hash_map->entries));
-  if (p_hash_map->entries == NULL)
-  {
-    Dowa_Free(p_hash_map);
-    return NULL;
-  }
-  p_hash_map->capacity = capacity;
-  p_hash_map->current_capacity = 0;
-  p_hash_map->p_arena = NULL;
-  return p_hash_map;
-}
-
-Dowa_HashMap *Dowa_HashMap_Create_With_Arena(size_t capacity, Dowa_Arena *p_arena)
-{
-  if (p_arena == NULL)
-  {
-    printf("Arena is NULL\n");
-    return Dowa_HashMap_Create(capacity);
-  }
-
-  Dowa_HashMap *p_hash_map;
-  p_hash_map = Dowa_Arena_Allocate(p_arena, sizeof(Dowa_HashMap));
-  if (p_hash_map == NULL)
-  {
-    return NULL;
-  }
-  p_hash_map->entries = Dowa_Arena_Allocate(p_arena, sizeof(*p_hash_map->entries) * capacity);
-  if (p_hash_map->entries == NULL)
-  {
-    return NULL;
-  }
-  memset(p_hash_map->entries, 0, capacity * sizeof *p_hash_map->entries);
-  p_hash_map->capacity = capacity;
-  p_hash_map->current_capacity = 0;
-  p_hash_map->p_arena = p_arena;
-  return p_hash_map;
-}
-
-void Dowa_HashMap_Destroy(Dowa_HashMap *p_hash_map)
-{
-  if (!p_hash_map) return;
-
-  if (p_hash_map->p_arena)
-  {
-    // Free arena instead of the map...
-    // Dowa_Arena_Destroy(p_hash_map->p_arena);
-    return;
-  }
-  else
-  {
-    Dowa_HashEntry *entry;
-    Dowa_HashEntry *next;
-    if (p_hash_map->entries)
-    {
-      for (int idx=0; idx<p_hash_map->capacity; idx++)
-      {
-        entry = p_hash_map->entries[idx];
-        while (entry)
-        {
-          next = entry->next;
-          Dowa_Free(entry->key);
-          Dowa_Free(entry->buffer);
-          Dowa_Free(entry);
-          entry = next;
-        }
-      }
-    }
-    Dowa_Free(p_hash_map->entries);
-  }
-  Dowa_Free(p_hash_map);
-}
-
-int32 Dowa_HashMap_Get_Position(Dowa_HashMap *p_hash_map, const char *key)
-{
-  if (!p_hash_map || !key)
-    return -1;
-
-  int32 hash_val = HASH_KEY_NUMBER;
-  int32 c;
-  while ((c = *key++))
-  {
-    hash_val = (hash_val << 5) + hash_val + c;
-  }
-  return hash_val % p_hash_map->capacity;
-}
-
-void *Dowa_HashMap_Get(Dowa_HashMap *p_hash_map, const char *key)
-{
-  if (!p_hash_map || !key)
-    return NULL;
-
-  int idx = Dowa_HashMap_Get_Position(p_hash_map, key);
-  Dowa_HashEntry *entry = p_hash_map->entries[idx];
-
-  while (entry)
-  {
-    if (strcmp(entry->key, key) == 0)
-    {
-      return entry->buffer;
-    }
-    entry = entry->next;
-  }
-
-  return NULL;
-}
-
-
-int32 Dowa_HashMap_Push_Value_With_Type_NoCopy(Dowa_HashMap *p_hash_map, const char *key,
-                                               void *value, size_t value_size,
-                                               Dowa_HashMap_ValueType type)
-{
-  if (!p_hash_map || !key || !value)
-    return -1;
-
-  int idx = Dowa_HashMap_Get_Position(p_hash_map, key);
-  Dowa_HashEntry *entry = p_hash_map->entries[idx];
-  Dowa_HashEntry *prev = NULL;
-
-  // Old key
-  while (entry)
-  {
-    if (strcmp(entry->key, key) == 0)
-    {
-      // Fails if it the key exists...
-      return -1;
-    }
-    prev = entry;
-    entry = entry->next;
-  }
-
-  // New Key
-  entry = p_hash_map->p_arena ?
-    Dowa_Arena_Allocate(p_hash_map->p_arena, sizeof(Dowa_HashEntry)) :
-    malloc(sizeof(Dowa_HashEntry));
-  if (!entry) { perror("malloc or arena alloc"); return -1; }
-
-  entry->key = p_hash_map->p_arena ?
-    Dowa_Arena_Copy(p_hash_map->p_arena, key, strlen(key) + 1) :
-    strdup(key);
-  if (!entry->key)
-  {
-    perror("strdup or arena copy");
-    if (!p_hash_map->p_arena) Dowa_Free(entry);
-    return -1;
-  }
-  entry->buffer = value;
-  entry->capacity = value_size;
-  entry->type = type;
-  entry->next = NULL;
-
-  if (prev)
-    prev->next = entry;
-  else
-    p_hash_map->entries[idx] = entry;
-
-  p_hash_map->current_capacity++;
-  return 0;
-}
-
-int32 Dowa_HashMap_Push_Value_With_Type(Dowa_HashMap *p_hash_map, const char *key,
-                                        void *value, size_t value_size,
-                                        Dowa_HashMap_ValueType type)
-{
-  if (!p_hash_map || !key || !value)
-    return -1;
-
-  int idx = Dowa_HashMap_Get_Position(p_hash_map, key);
-  Dowa_HashEntry *entry = p_hash_map->entries[idx];
-  Dowa_HashEntry *prev = NULL;
-
-  // Check for existing key
-  while (entry)
-  {
-    if (strcmp(entry->key, key) == 0)
-    {
-      if (!p_hash_map->p_arena && entry->buffer)
-        Dowa_Free(entry->buffer);
-
-      entry->buffer = p_hash_map->p_arena ?
-        Dowa_Arena_Allocate(p_hash_map->p_arena, value_size) :
-        malloc(value_size);
-      if (!entry->buffer) { perror("malloc or arena alloc"); return -1; }
-
-      memcpy(entry->buffer, value, value_size);
-      entry->capacity = value_size;
-      entry->type = type;
-      return 0;
-    }
-    prev = entry;
-    entry = entry->next;
-  }
-
-  // New Key
-  entry = p_hash_map->p_arena ?
-    Dowa_Arena_Allocate(p_hash_map->p_arena, sizeof(Dowa_HashEntry)) :
-    malloc(sizeof(Dowa_HashEntry));
-  if (!entry) { perror("malloc or arena alloc"); return -1; }
-
-  entry->key = p_hash_map->p_arena ?
-    Dowa_Arena_Copy(p_hash_map->p_arena, key, strlen(key) + 1) :
-    strdup(key);
-  if (!entry->key) { perror("strdup"); return -1; }
-
-  entry->buffer = p_hash_map->p_arena ?
-    Dowa_Arena_Allocate(p_hash_map->p_arena, value_size) :
-    malloc(value_size);
-  if (!entry->buffer) { perror("malloc or arena alloc"); return -1; }
-
-  memcpy(entry->buffer, value, value_size);
-  entry->capacity = value_size;
-  entry->type = type;
-  entry->next = NULL;
-
-  if (prev)
-    prev->next = entry;
-  else
-    p_hash_map->entries[idx] = entry;
-
-  p_hash_map->current_capacity++;
-  return 0;
-}
-
-void Dowa_HashMap_Push_Value(Dowa_HashMap *p_hash_map, const char *key, void *value, size_t value_size)
-{
-  Dowa_HashMap_Push_Value_With_Type(p_hash_map, key, value, value_size, DOWA_HASH_MAP_TYPE_BUFFER);
-}
-
-void Dowa_HashMap_Pop_Key(Dowa_HashMap *p_hash_map, const char *key)
-{
-  if (!p_hash_map || !key)
-    return;
-
-  int idx = Dowa_HashMap_Get_Position(p_hash_map, key);
-  Dowa_HashEntry *entry = p_hash_map->entries[idx];
-  Dowa_HashEntry *prev = NULL;
-
-  while (entry)
-  {
-    if (strcmp(entry->key, key) == 0)
-    {
-      if (prev)
-        prev->next = entry->next;
-      else
-        p_hash_map->entries[idx] = entry->next;
-
-      if (!(p_hash_map->p_arena))
-      {
-        Dowa_Free(entry->key);
-        Dowa_Free(entry->buffer);
-        Dowa_Free(entry);
-      }
-
-      if (p_hash_map->current_capacity > 0)
-        p_hash_map->current_capacity--;
-      return;
-    }
-    prev = entry;
-    entry = entry->next;
-  }
-}
-
-boolean Dowa_HashMap_Has_Key(Dowa_HashMap *p_hash_map, const char *key)
-{
-  if (!p_hash_map || !key)
-    return FALSE;
-
-  int idx = Dowa_HashMap_Get_Position(p_hash_map, key);
-  Dowa_HashEntry *entry = p_hash_map->entries[idx];
-
-  while (entry)
-  {
-    if (strcmp(entry->key, key) == 0)
-      return TRUE;
-    entry = entry->next;
-  }
-
-  return FALSE;
-}
-
-void Dowa_HashMap_Clear(Dowa_HashMap *p_hash_map)
-{
-  if (!p_hash_map) return;
-
-  if (p_hash_map->p_arena)
-  {
-    for (int idx=0; idx<p_hash_map->capacity; idx++)
-      p_hash_map->entries[idx] = NULL;
-  }
-  else
-  {
-    Dowa_HashEntry *entry;
-    Dowa_HashEntry *next;
-    if (p_hash_map->entries)
-    {
-      for (int idx=0; idx<p_hash_map->capacity; idx++)
-      {
-        entry = p_hash_map->entries[idx];
-        while (entry)
-        {
-          next = entry->next;
-          Dowa_Free(entry->key);
-          Dowa_Free(entry->buffer);
-          Dowa_Free(entry);
-          entry = next;
-        }
-        p_hash_map->entries[idx] = NULL;
-      }
-    }
-  }
-  p_hash_map->current_capacity = 0;
-}
-
-uint32 Dowa_HashMap_Get_Count(Dowa_HashMap *p_hash_map)
-{
-  if (!p_hash_map) return 0;
-  return p_hash_map->current_capacity;
-}
-
-void Dowa_HashMap_Print(Dowa_HashMap *map)
-{
-  if (!map)
-  {
-    printf("HashMap is NULL\n");
-    return;
-  }
-
-  printf("\n-----------\n\n");
-  for (size_t i = 0; i < map->capacity; ++i)
-  {
-    Dowa_HashEntry *e = map->entries[i];
-    while (e) 
-    {
-      if (!e) break;
-      printf("%s: ", e->key);
-      switch (e->type)
-      {
-        case DOWA_HASH_MAP_TYPE_BUFFER:
-        {
-          unsigned char *p = e->buffer;
-          for (size_t j = 0; j < e->capacity; ++j)
-          {
-            printf("%02x", p[j]);
-          }
-          printf("\n");
-        }
-        break;
-        case DOWA_HASH_MAP_TYPE_STRING:
-        {
-          printf("%.*s\n", (int)e->capacity, (char*)e->buffer);
-        }
-        break;
-        case DOWA_HASH_MAP_TYPE_HASHMAP:
-        {
-          printf("This is a hashmap with size of %zu, and pointer %p\n", e->capacity, (void *)e);
-        }
-        break;
-        case DOWA_HASH_MAP_TYPE_INT:
-        {
-          printf("%d\n", *(int32*)e->buffer);
-        }
-        break;
-        default:
-        {
-          printf("<unknown type>\n");
-        }
-      }
-      e = e->next;
-    }
-  }
-  printf("-----------\n");
-}
-
-// -- Array --//
-Dowa_Array *Dowa_Array_Init()
-{
-  Dowa_Array *dowa_array = malloc(sizeof(Dowa_Array));
-  if (dowa_array == NULL)
-  {
-    return NULL;
-  }
-
-  dowa_array->capacity = DOWA_ARRAY_DEFAULT_CAPACITY;
-  dowa_array->items = (Dowa_Array_Item *)malloc(sizeof(Dowa_Array_Item) * DOWA_ARRAY_DEFAULT_CAPACITY); 
-  if (dowa_array->items == NULL)
-  {
-    return NULL;
-  }
-
-  dowa_array->current_length = 0;
-  return dowa_array;
-}
-
-// void  Dowa_Array_Push_Value(Dowa_Array *dowa_array, void *buffer, uint32 length)
-// {
-//   if (dowa_array->current_length == dowa_array->capacity)
-//   {
-//     dowa_array->items = realloc(dowa_array->items, sizeof(Dowa_Array_Item) * dowa_array->capacity * 2);
-//     dowa_array->capacity = dowa_array->capacity * 2;
-//   }
-//   Dowa_Array_Item *item = &(dowa_array->items[dowa_array->current_length]);
-//   item->value = malloc(length);
-//   if (item->value == NULL)
-//   {
-//     // didn't alloc should raise an error.
-//     return;
-//   }
-//   memcpy(item->value, buffer, length);
-//   item->length = length;
-//   dowa_array->current_length += 1;
-// }
-
-
-#ifdef DIRECTORY
-int Dowa_HashMap_Cache_Folder(Dowa_HashMap *p_hash_map, const char *folder_path)
-{
-  if (!p_hash_map || !folder_path)
-    return -1;
-
-  DIR *dir = opendir(folder_path);
-  if (!dir) { perror("opendir"); return -1; }
-
-  struct dirent *entry;
-  while ((entry = readdir(dir)))
-  {
-    // skip "." and ".."
-    if (entry->d_name[0] == '.' &&
-       (entry->d_name[1] == '\0' ||
-      (entry->d_name[1] == '.' && entry->d_name[2] == '\0')))
-      continue;
-
-    char fullpath[PATH_MAX];
-    snprintf(fullpath, sizeof fullpath, "%s/%s", folder_path, entry->d_name);
-
-    struct stat st;
-    if (stat(fullpath, &st) < 0) { perror("stat"); continue; }
-
-    if (S_ISREG(st.st_mode))
-    {
-      size_t size = (size_t)st.st_size;
-      FILE *f = fopen(fullpath, "rb");
-      if (!f) { perror("fopen"); continue; }
-
-      // Allocate exact file size (no extra byte for null terminator)
-      void *buf = p_hash_map->p_arena ?
-        Dowa_Arena_Allocate(p_hash_map->p_arena, size) :
-        malloc(size);
-      if (!buf) { perror("malloc"); fclose(f); closedir(dir); return -1; }
-
-      if (fread(buf, 1, size, f) != size)
-      {
-        perror("fread");
-        if (!p_hash_map->p_arena) Dowa_Free(buf);
-        fclose(f);
-        continue;
-      }
-      fclose(f);
-
-      // Store file data as-is without null terminator (for binary files like images)
-      Dowa_HashMap_Push_Value_With_Type(p_hash_map, entry->d_name, buf, size, DOWA_HASH_MAP_TYPE_STRING);
-      if (!p_hash_map->p_arena)
-        Dowa_Free(buf);  // Dowa_HashMap_PushValue made its own copy
-    }
-    else if (S_ISDIR(st.st_mode))
-    {
-      // TODO: Adjust the sizes of the recursive map?
-      Dowa_HashMap *p_child_map = Dowa_HashMap_Create_With_Arena(100, p_hash_map->p_arena); 
-      if (!p_child_map)
-      {
-        perror("Dowa_HashMap_Create");
-        return -1;
-      }
-      if (Dowa_HashMap_Cache_Folder(p_child_map, fullpath) == -1)
-      {
-        perror("Dowa_HashMap_Cache_Folder");
-        return -1;
-      }
-
-      // Should not copy as we malloced already.
-      if (Dowa_HashMap_Push_Value_With_Type_NoCopy(p_hash_map, entry->d_name, p_child_map,
-                                         sizeof(p_child_map), DOWA_HASH_MAP_TYPE_HASHMAP) == -1)
-      {
-        Dowa_HashMap_Destroy(p_child_map);
-        return -1;
-      }
-    }
-  }
-  closedir(dir);
-  return 0;
-}
-#endif
-*/