Mercurial > hg > index.cgi
changeset 23:25a4aef9c5ed
lwbasic: Added basic character input framework
author | lost@l-w.ca |
---|---|
date | Sat, 22 Jan 2011 21:13:09 -0700 |
parents | 7c35fa8dbc91 |
children | 421d7ceb4d86 |
files | lwbasic/input.c lwbasic/lwbasic.h lwbasic/rules.make |
diffstat | 3 files changed, 92 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /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 <http://www.gnu.org/licenses/>. +*/ + +/* +handle reading input for the rest of the system +*/ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <lw_alloc.h> + +#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; +}
--- 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__ */
--- 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)