dynamic string implemented
MMakefile
@@ -1,3 +1,3 @@
all:
gcc -Og -g -march=native -shared -fPIC -fstrict-aliasing vector.c -o cutils.so -flto \
gcc -Og -g -march=native -shared -fPIC -fstrict-aliasing vector.c dyn_string.c -o cutils.so -flto \
-Wall -Werror -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter
Mcutils.h
@@ -1,4 +1,5 @@
#ifndef CUTILS_H
#define CUTILS_H
#include <vector.h>
#include <dyn_string.h>
#endif //CUTILS_H
Adyn_string.c
@@ -0,0 +1,105 @@
#include "dyn_string.h"
String* new_string(void)
{
String* string = malloc(sizeof(*string));
if(!string)
return NULL;
string->chars = calloc(sizeof(*string->chars)*STRING_DEFAULT_SIZE,1);
if(!string->chars)
{
free(string);
return NULL;
}
string->length = 0;
string->capacity = STRING_DEFAULT_SIZE;
return string;
}
bool string_append(String* string, char character)
{
if(!string_adjust_size(string, ++string->length))
return false;
string->chars[string->length-1] = character;
return true;
}
void string_remove(String* string, size_t index)
{
if(index < string->length)
{
memmove(string->chars+index, string->chars+index+1, (string->length-index-1)*sizeof(*string->chars));
string->length--;
}
}
bool string_insert(String* string, size_t index, char character)
{
if(!string_adjust_size(string, string->length))
return false;
memmove(string->chars+index+1, string->chars+index, (string->length-index)*sizeof(*string->chars));
string->chars[index] = character;
string->length++;
return true;
}
char string_at(const String* string, size_t index)
{
if(index >= string->length)
return '\0';
else
return string->chars[index];
}
bool string_concat(String* string, String* other)
{
if(!string_adjust_size(string,string->length+other->length-1))
return false;
memcpy(string->chars+string->length,other->chars,other->length);
return true;
}
FindReturn string_find_char(const String* haystack, const char needle)
{
FindReturn ret;
for(size_t i = 0; i < haystack->length; i++)
{
if(haystack->chars[i] == needle)
{
ret.found = true;
ret.index = i;
return ret;
}
}
ret.found = false;
return ret;
}
bool string_adjust_size(String* string, size_t size)
{
while(string->capacity < size)
{
char* tmp = string->chars;
string->chars = realloc(string->chars, string->capacity*2*(sizeof(*string->chars)));
if(!string->chars)
{
string->chars = tmp;
return false;
}
string->capacity *= 2;
}
while(string->capacity > (size*2))
{
char* tmp = string->chars;
string->chars = realloc(string->chars, string->capacity/2*(sizeof(*string->chars)));
if(!string->chars)
{
string->chars = tmp;
return false;
}
string->capacity /= 2;
}
return true;
}
Adyn_string.h
@@ -0,0 +1,32 @@
#ifndef DYN_STRING_H
#define DYN_STRING_H
#define STRING_DEFAULT_SIZE 8
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct String
{
char* chars;
size_t capacity;
size_t length;
} String;
typedef struct FindReturn
{
bool found;
size_t index; //if found is false, this contains rubbish
} FindReturn;
String* new_string(void);
char string_at(const String* string, size_t index);
bool string_append(String* string, char item);
void string_remove(String* string, size_t index);
bool string_adjust_size(String* string, size_t size);
FindReturn string_find_char(const String* haystack, const char needle);
bool string_insert(String* string, size_t index, char character);
bool string_concat(String* string, String* other);
#endif //DYN_STRING_H
Mvector.c
@@ -12,7 +12,7 @@ Vector* new_vector(void)
return NULL;
}
vector->length = 0;
vector->capacity = 4;
vector->capacity = VECTOR_DEFAULT_SIZE;
return vector;
}
@@ -84,7 +84,7 @@ FindReturn vector_find(const Vector* haystack, const void* needle, bool (*cmp)(c
bool vector_insert(Vector* vector, size_t index, void* item)
{
if(!vector_adjust_size(vector, ++vector->length))
if(!vector_adjust_size(vector, vector->length))
return false;
memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));