diff options
author | Holden Rohrer <hr@hrhr.dev> | 2020-03-27 00:42:31 -0400 |
---|---|---|
committer | Holden Rohrer <hr@hrhr.dev> | 2020-03-28 13:57:14 -0400 |
commit | f1638f63a7e0ffe854ec6bb940c4ed1e4a175215 (patch) | |
tree | 2a3fe5c7753d2f781302057f8cd7d3f703107eb5 /sb.c |
initial commit
Diffstat (limited to 'sb.c')
-rw-r--r-- | sb.c | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -0,0 +1,67 @@ +#include <stdlib.h> +#include <string.h> +#include "sb.h" + +struct node{ // linked list, but strings don't have to be max size + size_t cap; + size_t len; + char* text; + node* next; +}; + +// malloc might fail, but the entire program should just crash if it does +node* newsb(size_t cap){ + node* sb; + sb = malloc(sizeof(node)); + sb->text = malloc(sizeof(char)*cap); + sb->len = 0; sb->cap = cap; + sb->next = NULL; + return sb; +} + +node* extendsb(node* tail){ + tail->next = newsb(tail->cap*2); + return tail->next; +} + +node* appendsb(node* tail, const char* str){ + for (int i=0; str[i] != '\0'; i++){ + if (tail->len == tail->cap) tail = extendsb(tail); // if full, extend + *(tail->text + tail->len) = str[i]; // copy str[i] to last open spot + tail->len++; + } + return tail; +} +///////// i want to prevent this duplication but cant figure out how :( + +node* addchrsb(node* tail, char chr){ + if (tail->len == tail->cap) tail = extendsb(tail); // if full, extend + *(tail->text + tail->len) = chr; // copy str[i] to last open spot + tail->len++; + return tail; +} + +char* tostr(node* head){ // destructive; frees the whole chain + int len; + char* str; + len = lensb(head); + str = malloc((len+1)*sizeof(char)); // need +1 for null terminator + str[len] = '\0'; + + len = 0; //controls progression through str + do { + strncpy(str+len, head->text, head->len); + len += head->len; + head = head->next; + free(head); + } while ( head != NULL); + return str; +} + +int lensb(node* head){ // how much space do i need to concat all strings + int len = 0; + do { + len += head->len; + } while ( (head = head->next) != NULL); + return len; +} |