From 905a0e9056e9c3d50be568f878d211e8e8b038f4 Mon Sep 17 00:00:00 2001 From: dtb Date: Fri, 9 Dec 2022 19:26:10 -0500 Subject: [PATCH] fix most compiler errors --- Makefile | 12 ++++++++++-- src/blang.c | 50 ++++++++++++++++---------------------------------- src/blang.h | 7 +++++++ src/ops.c | 18 +++++++++--------- 4 files changed, 42 insertions(+), 45 deletions(-) create mode 100644 src/blang.h diff --git a/Makefile b/Makefile index 6a59115..d86b1cf 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,16 @@ clean: bin: mkdir -p bin +build: + mkdir -p build -bin/blang: bin src/*.c - $(CC) $(CFLAGS) -o $@ src/*.c +build/blang.o: build src/blang.c src/blang.h + $(CC) -c -o $@ src/blang.c + +build/ops.o: build src/blang.h src/ops.c src/ops.h + $(CC) -c -o $@ src/ops.c + +bin/blang: bin build/blang.o build/ops.o + $(CC) $(CFLAGS) -o $@ build/*.o .PHONY: all clean diff --git a/src/blang.c b/src/blang.c index 400bf44..db345b6 100644 --- a/src/blang.c +++ b/src/blang.c @@ -1,42 +1,24 @@ #include #include -static unsigned char get = 0; -static unsigned char _stack[4]; -static unsigned char *stack = _stack; -static unsigned char *state; +#include "blang.h" +#include "ops.h" -int main(){ +int main(int argc, char **argv){ + struct State s; int c; - while((c = getchar()) != EOF){ - if(stack == (unsigned char *)0) - return (char)state; - if(get){ - state = (char *)c; - get = 0; + void (*op)(struct State *); + + s.chart = *argv; + + while((c = getc(stdin)) != EOF){ + /* proper exit is ^* */ + if(s.chart == (char *)0) + return (int)s.hand; + if((op = Ops_lookup(c)) == NULL) continue; - } - switch(c){ - case ' ': - case '\n': - case '\r': - case '\t': - case '\v': - break; - case '!': state = stack; break; - case '$': stack = state; state = (char *)*_stack; break; - case '%': *stack = (char)state; break; - case '^': state = (char *)0; break; - case '+': ++state; break; - case '-': --state; break; - case '>': putchar((char)state); break; - case '<': get = 1; break; - case ':': - while((c = getchar()) != '\n') - if(c == EOF) - goto fin; - break; - } + else + op(&s); } -fin: return 1; + return 1; } diff --git a/src/blang.h b/src/blang.h new file mode 100644 index 0000000..6a8e94e --- /dev/null +++ b/src/blang.h @@ -0,0 +1,7 @@ +#if !defined _BLANG_H +# define _BLANG_H +struct State{ + unsigned char hand; + char *chart; +} +#endif diff --git a/src/ops.c b/src/ops.c index 001dc3b..03d3643 100644 --- a/src/ops.c +++ b/src/ops.c @@ -8,36 +8,36 @@ void Ops_bang(struct State *s){ return; } -void Ops_dollar(struct State *s){ - s->chart = (char *)0; -} - void Ops_percent(struct State *s){ *(s->chart) = s->hand; } void Ops_carat(struct State *s){ - s->state = 0; + s->hand = 0; } void Ops_ampersand(struct State *s){ s->hand = s->chart; } +void Ops_splat(struct State *s){ + s->chart = s->hand; +} + void Ops_plus(struct State *s){ - ++(s->state); + ++(s->hand); } void Ops_dash(struct State *s){ - --(s->state); + --(s->hand); } void Ops_right(struct State *s){ - putc((char)s->state, stdout); + putc((char)s->hand, stdout); } void Ops_left(struct State *s){ - s->state = getc(stdin); + s->hand = getc(stdin); } void Ops_semi(struct State *s){