From 961b3297f56ac0b91e3b6e1b0025ad2d8038e8b5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 7 Apr 2018 09:14:26 -0400 Subject: [PATCH] Add String module --- src/String.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/String.h | 19 ++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/String.c create mode 100644 src/String.h diff --git a/src/String.c b/src/String.c new file mode 100644 index 0000000..7e57568 --- /dev/null +++ b/src/String.c @@ -0,0 +1,63 @@ +#include "String.h" +#include + +String * String_new(const char * s) +{ + String * new_st = (String *)malloc(sizeof(String)); + size_t size = strlen(s); + if (size != 0u) + { + char * smem = (char *)malloc(size); + memcpy(smem, s, size); + new_st->value = smem; + } + else + { + new_st->value = NULL; + } + new_st->size = size; + return new_st; +} + +String * String_plus(const String * st, const char * s) +{ + String * new_st = (String *)malloc(sizeof(String)); + size_t size1 = st->size; + size_t size2 = strlen(s); + size_t size = size1 + size2; + char * smem = (char *)malloc(size); + memcpy(smem, st->value, size1); + memcpy(&smem[size1], s, size2); + new_st->value = smem; + new_st->size = size; + return new_st; +} + +String * String_concat(String * st, const char * s) +{ + size_t size2 = strlen(s); + size_t size = st->size + size2; + char * smem = NULL; + if (size != 0u) + { + smem = (char *)malloc(size); + memcpy(smem, st->value, st->size); + memcpy(&smem[st->size], s, size2); + } + if (st->value != NULL) + { + free(st->value); + } + st->value = smem; + st->size = size; + return st; +} + +void String_free(String * st) +{ + if (st->value != NULL) + { + free(st->value); + } + free(st); +} diff --git a/src/String.h b/src/String.h new file mode 100644 index 0000000..921c56e --- /dev/null +++ b/src/String.h @@ -0,0 +1,19 @@ +#ifndef STRING_H +#define STRING_H + +#include + +typedef struct +{ + char * value; + size_t size; +} String; + +String * String_new(const char * s); +String * String_plus(const String * st, const char * s); +String * String_concat(String * st, const char * s); +static inline char * String_cstr(const String * st) { return st->value; } +static inline size_t String_size(const String * st) { return st->size; } +void String_free(String * st); + +#endif