view dowa/dowa.h @ 22:947b81010aba

[Dowa & Seobeo] Updated so that Dowa hashmaps can use arena and not be broken. Split up web so taht it can handle different paths. Also fixes issues with hash collisions which was pain in the ass.
author June Park <parkjune1995@gmail.com>
date Tue, 07 Oct 2025 07:11:02 -0700
parents 09def63429b9
children 84672efec192
line wrap: on
line source

#ifndef DOWA
#define DOWA

#include <stdio.h>
#include <string.h> // stdup
#include <stdlib.h> // only for malloc, free, stuff
#include <assert.h> // mostly for TODO
#include <dirent.h> // some functions loop through files

#include <sys/stat.h>
#include <limits.h>

#include "dowa_internal.h"

#define HASH_KEY_NUMBER 5381 // DJD hash number
#define ONE_MEGA_BYTE   1048576
#define TRUE  1
#define FALSE 0

// Fixed-width integer types
typedef unsigned int   uint32;   // 32-bit unsigned integer
typedef int            int32;    // 32-bit signed integer
typedef unsigned short uint16;   // 16-bit unsigned integer
typedef short          int16;    // 16-bit signed integer
typedef unsigned char  uint8;    // 8-bit unsigned integer
typedef char           int8;     // 8-bit signed integer
typedef char           boolean;  // Boolean type (0 = false, nonzero = true)


// --- Miscellaneous --- //
/* Just use atoid lmao*/
char *Dowa_Int32ToString(uint32 value, char *buffer);


// --- Arena Allocator --- //
typedef struct {
  char   *buffer;
  size_t  offset;
  size_t  capacity;
} Dowa_Arena, *Dowa_PArena;

/* Creates a new arena with the specified capacity (in bytes). Returns a pointer to the arena, or NULL on failure. */
extern       Dowa_PArena Dowa_Arena_Create(size_t capacity);
/* Allocates a block of memory of the given size from the arena. Returns pointer to the allocated memory, or NULL if there is insufficient space. */
extern void *Dowa_Arena_Allocate(Dowa_PArena arena, size_t size);
/* Destroys the arena and frees its underlying memory block.*/
extern void  Dowa_Arena_Destroy(Dowa_PArena arena);
/* Strdup but saves within the arena */
extern void *Dowa_Arena_Copy(Dowa_PArena p_arena, const void *src, size_t size);


// --- HashMap --- //
typedef enum {
  DOWA_HASH_MAP_TYPE_BUFFER,   // Raw byte buffer
  DOWA_HASH_MAP_TYPE_STRING,   // Null-terminated string
  DOWA_HASH_MAP_TYPE_HASHMAP,  // Nested hashmap
  DOWA_HASH_MAP_TYPE_INT       // Integer value
} Dowa_HashMap_ValueType;

typedef struct {
  char                  *key;
  void                  *buffer;
  size_t                 capacity;
  Dowa_HashMap_ValueType type;
  struct Dowa_HashEntry *next; 
} Dowa_HashEntry, *Dowa_PHashEntry;

typedef struct {
    Dowa_PHashEntry *entries;
    size_t           capacity;
    uint32           current_capacity;
    Dowa_PArena      p_arena;
} Dowa_HashMap, *Dowa_PHashMap;

/* Creates a new hashmap with the given initial capacity. Returns pointer to the hashmap, or NULL on failure. */
extern Dowa_PHashMap Dowa_HashMap_Create(size_t capacity);
/* Creates a new hashmap with the given initial capacity, using the provided arena for all internal allocations. Returns pointer to the hashmap, or NULL on failure. */
extern Dowa_PHashMap Dowa_HashMap_Create_With_Arena(size_t capacity, Dowa_PArena arena);
/* Destroys the hashmap and frees all associated memory */
extern void          Dowa_HashMap_Destroy(Dowa_PHashMap p_hash_map);
/* Returns the index of the entry for the specified key, or -1 if the key is not found. */
extern int32         Dowa_HashMap_Get_Position(Dowa_PHashMap p_hash_map, const char *key);
/* Retrieves the value buffer for the specified key, or NULL if the key does not exist. */
extern void         *Dowa_HashMap_Get(Dowa_PHashMap p_hash_map, const char *key);
/* Inserts a copy of the given value into the hashmap under the specified key. Uses DOWA_HASH_MAP_TYPE_BUFFER as the entry type. */
extern void          Dowa_HashMap_Push_Value(Dowa_PHashMap p_hash_map, const char *key, void *value, size_t value_size);
/* Inserts a copy of the given value with the specified type into the hashmap under the key. Returns the index of the new entry, or -1 on failure. */
extern int32         Dowa_HashMap_Push_Value_With_Type(Dowa_PHashMap p_hash_map, const char *key, void *value, size_t value_size, Dowa_HashMap_ValueType type);
/* Inserts a value pointer into the hashmap under the specified key without copying data. The caller retains ownership of the pointer. Returns the entry index, or -1 on failure. */
extern int32         Dowa_HashMap_Push_Value_With_Type_NoCopy(Dowa_PHashMap p_hash_map, const char *key, void *value, size_t value_size, Dowa_HashMap_ValueType type);
/* Removes the entry with the specified key from the hashmap and frees its data if owned. */
extern void          Dowa_HashMap_Pop_Key(Dowa_PHashMap p_hash_map, const char *key);

// --- Utility Functions --- //
/* Prints all entries in the hashmap to stdout for debugging purposes. */
extern void          Dowa_HashMap_Print(Dowa_PHashMap map);
/* Loads all files from the specified folder into the hashmap. Uses file names as keys and file contents as values. Returns 0 on success, or -1 on failure. */
extern int           Dowa_HashMap_Cache_Folder(Dowa_PHashMap map, const char *folder_path);


#endif