summaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-04-14 15:15:10 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-04-14 15:15:10 -0400
commitd7ecc6b9efc8e8ebb032678cacb8d532b2331902 (patch)
treedc2292a212e8fefcded4652808c88025ccc4bb2f /src/program.c
parentuse correct dumb variable name (diff)
downloadbrainfucked-d7ecc6b9efc8e8ebb032678cacb8d532b2331902.tar.gz
brainfucked-d7ecc6b9efc8e8ebb032678cacb8d532b2331902.tar.bz2
brainfucked-d7ecc6b9efc8e8ebb032678cacb8d532b2331902.zip
allow stdin
Diffstat (limited to 'src/program.c')
-rw-r--r--src/program.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/src/program.c b/src/program.c
index dcec0f7..1d94da3 100644
--- a/src/program.c
+++ b/src/program.c
@@ -6,21 +6,17 @@
#include <string.h>
#include <errno.h>
-static FILE* f;
-static uint32_t count;
-
-static char next_char() {
+static char next_char(FILE* file) {
char c;
- if (fread(&c, 1, 1, f) != 1) {
+ if (fread(&c, 1, 1, file) != 1) {
return EOF;
} else {
- count++;
return c;
}
}
-static Symbol next_symbol() {
- char c = next_char();
+static Symbol next_symbol(FILE* file) {
+ char c = next_char(file);
retest:
switch (c) {
case '<':
@@ -56,28 +52,21 @@ retest:
case '\n':
case '\t':
case ' ':
- while(c = next_char(), c == '\n' || c == '\t' || c == ' ');
+ while(c = next_char(file), c == '\n' || c == '\t' || c == ' ');
goto retest;
case '/':
- while(c = next_char(), c != '\n' && c != EOF);
+ while(c = next_char(file), c != '\n' && c != EOF);
goto retest;
case EOF:
return Eof;
default:
- c = next_char();
+ c = next_char(file);
goto retest;
}
}
-void program_init(char* file_path, Program* program) {
- f = fopen (file_path, "r");
- if (f == NULL) {
- printf("error: failed to open %s (%s)\n", file_path, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
+void program_init(FILE* file, Program* program) {
uint32_t capacity = 8;
- count = 0;
program->data = malloc(capacity * sizeof(Symbol));
program->len = 0;
@@ -85,7 +74,7 @@ void program_init(char* file_path, Program* program) {
Symbol s;
while(true) {
- s = next_symbol();
+ s = next_symbol(file);
if (program->len == capacity) {
capacity *= 2;
@@ -98,7 +87,7 @@ void program_init(char* file_path, Program* program) {
if (s == Eof) break;
}
- fclose(f);
+ fclose(file);
}
void program_peek(Program* program, Symbol* symbol) {