# HG changeset patch # User lost@l-w.ca # Date 1295755989 25200 # Node ID 25a4aef9c5eda8bade1137e1ddf966debd9b8028 # Parent 7c35fa8dbc91f906501d9db8b7ed6d149e91a76d lwbasic: Added basic character input framework diff -r 7c35fa8dbc91 -r 25a4aef9c5ed lwbasic/input.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lwbasic/input.c Sat Jan 22 21:13:09 2011 -0700 @@ -0,0 +1,85 @@ +/* +input.c + +Copyright © 2011 William Astle + +This file is part of LWTOOLS. + +LWTOOLS is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . +*/ + +/* +handle reading input for the rest of the system +*/ + +#include +#include +#include + +#include + +#define __input_c_seen__ +#include "lwbasic.h" + +struct input_state +{ + FILE *fp; + int error; +}; + +static void input_init(cstate *state) +{ + struct input_state *sp; + + sp = lw_alloc(sizeof(struct input_state)); + sp -> error = 0; + + if (!(state -> input_file) || strcmp(state -> input_file, "-")) + { + sp -> fp = stdin; + } + else + { + sp -> fp = fopen(state -> input_file, "rb"); + if (!(sp -> fp)) + { + fprintf(stderr, "Cannot open input file\n"); + exit(1); + } + } + + state -> input_state = sp; +} + +int input_getchar(cstate *state) +{ + int r; + struct input_state *sp; + + if (!(state -> input_state)) + input_init(state); + sp = state -> input_state; + + + if (sp -> error) + return -2; + + if (feof(sp -> fp)) + return -1; + + r = fgetc(sp -> fp); + if (r == EOF) + return -1; + return r; +} diff -r 7c35fa8dbc91 -r 25a4aef9c5ed lwbasic/lwbasic.h --- a/lwbasic/lwbasic.h Sat Jan 22 21:01:03 2011 -0700 +++ b/lwbasic/lwbasic.h Sat Jan 22 21:13:09 2011 -0700 @@ -32,6 +32,12 @@ char *input_file; int debug_level; + + void *input_state; } cstate; +#ifndef __input_c_seen__ +extern int input_getchar(cstate *state); +#endif + #endif /* __lwbasic_h_seen__ */ diff -r 7c35fa8dbc91 -r 25a4aef9c5ed lwbasic/rules.make --- a/lwbasic/rules.make Sat Jan 22 21:01:03 2011 -0700 +++ b/lwbasic/rules.make Sat Jan 22 21:13:09 2011 -0700 @@ -1,7 +1,7 @@ dirname := $(dir $(lastword $(MAKEFILE_LIST))) lwbasic_dir := $(dirname) -lwbasic_lsrcs := main.c +lwbasic_lsrcs := main.c input.c lwbasic_srcs := $(addprefix $(dirname),$(lwbasic_lsrcs)) lwbasic_objs := $(lwbasic_srcs:.c=.o)