From 8d5478c6bbd83e3f260cba9a45dcdc093f4af751 Mon Sep 17 00:00:00 2001 From: Noah Swerhun Date: Wed, 30 Jun 2021 21:27:05 -0500 Subject: [PATCH] first commit --- Makefile | 22 +++++++++++++++++++ cards | Bin 0 -> 16864 bytes example.csv | 5 +++++ obj/card.o | Bin 0 -> 2616 bytes obj/main.o | Bin 0 -> 2896 bytes src/card.c | 43 +++++++++++++++++++++++++++++++++++++ src/include/card.h | 13 ++++++++++++ src/include/main.h | 8 +++++++ src/main.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 143 insertions(+) create mode 100644 Makefile create mode 100755 cards create mode 100644 example.csv create mode 100644 obj/card.o create mode 100644 obj/main.o create mode 100644 src/card.c create mode 100644 src/include/card.h create mode 100644 src/include/main.h create mode 100644 src/main.c 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 0000000000000000000000000000000000000000..db42fb840f3bdf5af0336c98bbc3d505544abf0a GIT binary patch literal 16864 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 HAZGq^|2dL! literal 0 HcmV?d00001 diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..6d786e78d24c08bf7e2e0924c9e511706d4578f7 GIT binary patch literal 2896 zcmbtVO=w(I6h3c~nl?5+#xAOL@iviG>vIAkZIGHDUviOPOYA@d;pKJaO)_@=eDg*V zZKx2C3}YZ0!G$aL;!fO|rqHx5%B-Y|EV2;>A|&o+A;$CFcW>t9F|*MF_nmXU@0@eb z{eAcCxtWAvkQRe(P`js5qDEiao{;7Q4blLmMC}i;{^zi$t+hn`3>Z;QwZ!ItG;2>q zZTA+X)-8A)-1utk@VMG1;||hdooP;bB4J+3D$V^YZKmsVnB#m^Ef4v4JeT+)QqmFtd~(V;h(jL-qApyPyc;i+M6uhK)<- z`_67Ld6Dr~6n71Ja&Y+T#Pq;(3YQq$TTw1i=jbqQ0XWN~{HWM_l9u(YNS0_f$|rV0 z2gP+#sJoZ`I_|{vbi6@CJ#sZpM{t=m67kpbInVg;X;;~Mu?v2s3qIBbf17cPtH+b; z$Jjev{NL+>zpwH&g&SPDFg-_AGWF;V@cV$~}9rLyM-s~m$&-m;VR`JGmk z{6A%KIF=0WYg8swr=iwUbFnU6Vgma(p&gXol7Bv;Wfg!k1`}r!axql&Dr?|4BT*TS zZc>DZkAIap-lXw%=6=aR#HJF{&yN1 uA*R~UeKleHA2Cim9y#NC&rtZ7vie4L+MoFP;jQTuzn~thpdBi$c>KQ;)47WP literal 0 HcmV?d00001 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; +}