view dowa/d_string.c @ 87:d39e8860a361

[Dowa] There was alignment issues rea hash key
author June Park <parkjune1995@gmail.com>
date Thu, 01 Jan 2026 14:25:17 -0800
parents 4532ce6d9eb8
children 655ea0b661fd
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 || from[0] == '\n')
    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) + 1);
  return buffer;
}