commit 8d5478c6bbd83e3f260cba9a45dcdc093f4af751 Author: Noah Swerhun Date: Wed Jun 30 21:27:05 2021 -0500 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0f5cdfd --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +CC = gcc +CFLAGS = -Wall -Wextra -pedantic-errors -std=c99 -Wno-format +OUTFILE = cards + +SRCDIR = src +OBJDIR = obj +INCDIR = src/include + +SRC = $(wildcard $(SRCDIR)/*.c) +INC = $(wildcard $(INCDIR)/*.h) +_OBJ = $(SRC:.c=.o) +OBJ = $(subst $(SRCDIR),$(OBJDIR),$(_OBJ)) + +$(OUTFILE): $(OBJ) + $(CC) $(CFLAGS) -o $(OUTFILE) $(OBJ) + +$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INCDIR)/%.h + $(CC) $(CFLAGS) -o $@ -c $< + +.PHONY: clean +clean: + -rm $(OUTFILE) $(OBJ) diff --git a/cards b/cards new file mode 100755 index 0000000..db42fb8 Binary files /dev/null and b/cards differ diff --git a/example.csv b/example.csv new file mode 100644 index 0000000..5f036af --- /dev/null +++ b/example.csv @@ -0,0 +1,5 @@ +the,quick +brown,fox +jumped,over +the,lazy +dog,foobar diff --git a/obj/card.o b/obj/card.o new file mode 100644 index 0000000..46bb4a4 Binary files /dev/null and b/obj/card.o differ diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000..6d786e7 Binary files /dev/null and b/obj/main.o differ diff --git a/src/card.c b/src/card.c new file mode 100644 index 0000000..a533f6d --- /dev/null +++ b/src/card.c @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "include/main.h" +#include "include/card.h" + +CARD new_card(char *o, char *r) { + CARD c; + c.obverse = o; + c.reverse = r; + return c; +} + +CARD* card_parse_csv(char *f, size_t *ct) { + FILE *fp; + char *l, *o, *r; + const char *delims = ",\0"; + CARD *ca; + + if ((fp = fopen(f, "r")) == NULL) + die("failed to open file (null pointer)"); + + *ct = 0; + + while ((l = fgetl(fp)) != NULL) { + + if ((o = strtok(l, delims)) == NULL) + die("improper csv format"); + if ((r = strtok(NULL, delims)) == NULL) + die("improper csv format"); + + /* printf("o: `%s`, r: `%s`\n", o, r); */ + + ca = (CARD *)realloc((void *)ca, (sizeof(CARD) * ++(*ct))); + ca[(*ct) - 1] = new_card(strdup_(o), strdup_(r)); + + free(l); + l = NULL; + } + + return ca; +} diff --git a/src/include/card.h b/src/include/card.h new file mode 100644 index 0000000..cd228ee --- /dev/null +++ b/src/include/card.h @@ -0,0 +1,13 @@ +#ifndef CARD_H +#define CARD_H + +typedef struct card_T { + char *obverse; + char *reverse; +} CARD; + +CARD new_card(char *, char *); + +CARD* card_parse_csv(char *, size_t *); + +#endif diff --git a/src/include/main.h b/src/include/main.h new file mode 100644 index 0000000..6daac90 --- /dev/null +++ b/src/include/main.h @@ -0,0 +1,8 @@ +#ifndef MAIN_H +#define MAIN_H + +void die(char *); +char *fgetl(FILE *); +char *strdup_(char *); + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..1941309 --- /dev/null +++ b/src/main.c @@ -0,0 +1,52 @@ +#include +#include +#include + +#include "include/main.h" +#include "include/card.h" + +void die(char *s) { + fprintf(stderr, "fatal: %s\n", s); + exit(1); +} + +char *fgetl(FILE *stream) { + size_t s_sz = 1; // +1 for null byte + char *s = NULL; + char c; + + while ((c = fgetc(stream)) != '\n') { + if (c == EOF) + return NULL; + + s = (char *)realloc((void *)s, ++s_sz); + s[s_sz - 2] = c; + } + + if (s != NULL) + s[s_sz - 1] = '\0'; + + return s; +} + +char *strdup_(char *s) { + char *r; + r = (char *)malloc(strlen(s) + 1); + strcpy(r, s); + return r; +} + +int main(int argc, char **argv) { + CARD *cards; + size_t cards_ct; + + if (argc < 1) + die("filename required"); + + cards = card_parse_csv(argv[1], &cards_ct); + + for (size_t i = 0; i < cards_ct; i++) + printf("o: `%s`, r: `%s`\n", cards[i].obverse, cards[i].reverse); + + return 0; +}