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 |
initial commit
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | badroff.c | 18 | ||||
-rw-r--r-- | sb.c | 67 | ||||
-rw-r--r-- | sb.h | 11 |
4 files changed, 105 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..32e5f37 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.POSIX: +.PHONY: all clean +OBJS = badroff.o sb.o +badroff: $(OBJS) + $(CC) $(OBJS) +badroff.o: badroff.c sb.h +sb.o: sb.c sb.h +clean: + rm -f badroff $(OBJS) diff --git a/badroff.c b/badroff.c new file mode 100644 index 0000000..5149c23 --- /dev/null +++ b/badroff.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include "sb.h" + +int main(int argc, char** argv){ + FILE* in; + int c; + if (argc >= 2) + in = fopen(argv[1], "r"); + else + in = stdin; + if (in == NULL){ + perror(argv[1]); + return 1; + } + while ( (c = fgetc(in)) != EOF){ + + } +} @@ -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; +} @@ -0,0 +1,11 @@ +#ifndef _SB_INCLUDE +#define _SB_INCLUDE + +typedef struct node node; +node* newsb(size_t cap); +node* extendsb(node* tail); +node* appendsb(node* tail, const char* str); +char* tostr(node* head); +int lensb(node* head); + +#endif |