allow stdin
This commit is contained in:
parent
9085afb7c8
commit
d7ecc6b9ef
3 changed files with 26 additions and 25 deletions
15
src/main.c
15
src/main.c
|
@ -25,13 +25,24 @@
|
||||||
/// % Clear screen
|
/// % Clear screen
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
if (argc != 2) {
|
|
||||||
|
FILE* file;
|
||||||
|
|
||||||
|
if (argc == 1) {
|
||||||
|
file = stdin;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
file = fopen (argv[1], "r");
|
||||||
|
if (file == NULL) {
|
||||||
|
printf("error: failed to open %s (%s)\n", argv[1], strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
printf("usage: brainfucked infile\n");
|
printf("usage: brainfucked infile\n");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Program program;
|
Program program;
|
||||||
program_init(argv[1], &program);
|
program_init(file, &program);
|
||||||
run_program(&program);
|
run_program(&program);
|
||||||
program_free(&program);
|
program_free(&program);
|
||||||
|
|
||||||
|
|
|
@ -6,21 +6,17 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
static FILE* f;
|
static char next_char(FILE* file) {
|
||||||
static uint32_t count;
|
|
||||||
|
|
||||||
static char next_char() {
|
|
||||||
char c;
|
char c;
|
||||||
if (fread(&c, 1, 1, f) != 1) {
|
if (fread(&c, 1, 1, file) != 1) {
|
||||||
return EOF;
|
return EOF;
|
||||||
} else {
|
} else {
|
||||||
count++;
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Symbol next_symbol() {
|
static Symbol next_symbol(FILE* file) {
|
||||||
char c = next_char();
|
char c = next_char(file);
|
||||||
retest:
|
retest:
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '<':
|
case '<':
|
||||||
|
@ -56,28 +52,21 @@ retest:
|
||||||
case '\n':
|
case '\n':
|
||||||
case '\t':
|
case '\t':
|
||||||
case ' ':
|
case ' ':
|
||||||
while(c = next_char(), c == '\n' || c == '\t' || c == ' ');
|
while(c = next_char(file), c == '\n' || c == '\t' || c == ' ');
|
||||||
goto retest;
|
goto retest;
|
||||||
case '/':
|
case '/':
|
||||||
while(c = next_char(), c != '\n' && c != EOF);
|
while(c = next_char(file), c != '\n' && c != EOF);
|
||||||
goto retest;
|
goto retest;
|
||||||
case EOF:
|
case EOF:
|
||||||
return Eof;
|
return Eof;
|
||||||
default:
|
default:
|
||||||
c = next_char();
|
c = next_char(file);
|
||||||
goto retest;
|
goto retest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void program_init(char* file_path, Program* program) {
|
void program_init(FILE* file, 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t capacity = 8;
|
uint32_t capacity = 8;
|
||||||
count = 0;
|
|
||||||
|
|
||||||
program->data = malloc(capacity * sizeof(Symbol));
|
program->data = malloc(capacity * sizeof(Symbol));
|
||||||
program->len = 0;
|
program->len = 0;
|
||||||
|
@ -85,7 +74,7 @@ void program_init(char* file_path, Program* program) {
|
||||||
|
|
||||||
Symbol s;
|
Symbol s;
|
||||||
while(true) {
|
while(true) {
|
||||||
s = next_symbol();
|
s = next_symbol(file);
|
||||||
|
|
||||||
if (program->len == capacity) {
|
if (program->len == capacity) {
|
||||||
capacity *= 2;
|
capacity *= 2;
|
||||||
|
@ -98,7 +87,7 @@ void program_init(char* file_path, Program* program) {
|
||||||
if (s == Eof) break;
|
if (s == Eof) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void program_peek(Program* program, Symbol* symbol) {
|
void program_peek(Program* program, Symbol* symbol) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MoveLeft,
|
MoveLeft,
|
||||||
|
@ -28,7 +29,7 @@ typedef struct {
|
||||||
Symbol* data;
|
Symbol* data;
|
||||||
} Program;
|
} Program;
|
||||||
|
|
||||||
void program_init(char* file_path, Program* program);
|
void program_init(FILE* file, Program* program);
|
||||||
void program_peek(Program* program, Symbol* symbol);
|
void program_peek(Program* program, Symbol* symbol);
|
||||||
void program_next(Program* program, Symbol* symbol);
|
void program_next(Program* program, Symbol* symbol);
|
||||||
void program_last(Program* program, Symbol* symbol);
|
void program_last(Program* program, Symbol* symbol);
|
||||||
|
|
Loading…
Reference in a new issue