diff --git a/emul/forth/forth.c b/emul/forth/forth.c index 1848772..dd1ba9e 100644 --- a/emul/forth/forth.c +++ b/emul/forth/forth.c @@ -10,10 +10,11 @@ #define STDIO_PORT 0x00 static int running; +static FILE *fp; static uint8_t iord_stdio() { - int c = getchar(); + int c = getc(fp); if (c == EOF) { running = 0; } @@ -31,19 +32,31 @@ static void iowr_stdio(uint8_t val) int main(int argc, char *argv[]) { - bool tty = isatty(fileno(stdin)); + bool tty = false; struct termios termInfo; - if (tty) { - // Turn echo off: the shell takes care of its own echoing. - if (tcgetattr(0, &termInfo) == -1) { - printf("Can't setup terminal.\n"); + if (argc == 2) { + fp = fopen(argv[1], "r"); + if (fp == NULL) { + fprintf(stderr, "Can't open %s\n", argv[1]); return 1; } - termInfo.c_lflag &= ~ECHO; - termInfo.c_lflag &= ~ICANON; - tcsetattr(0, TCSAFLUSH, &termInfo); + } else if (argc == 1) { + fp = stdin; + tty = isatty(fileno(stdin)); + if (tty) { + // Turn echo off: the shell takes care of its own echoing. + if (tcgetattr(0, &termInfo) == -1) { + printf("Can't setup terminal.\n"); + return 1; + } + termInfo.c_lflag &= ~ECHO; + termInfo.c_lflag &= ~ICANON; + tcsetattr(0, TCSAFLUSH, &termInfo); + } + } else { + fprintf(stderr, "Usage: ./forth [filename]\n"); + return 1; } - Machine *m = emul_init(); m->ramstart = RAMSTART; m->iord[STDIO_PORT] = iord_stdio; @@ -58,11 +71,12 @@ int main(int argc, char *argv[]) while (running && emul_step()); if (tty) { - printf("Done!\n"); + printf("\nDone!\n"); termInfo.c_lflag |= ECHO; termInfo.c_lflag |= ICANON; tcsetattr(0, TCSAFLUSH, &termInfo); emul_printdebug(); } + fclose(fp); return 0; }