# HG changeset patch # User lost # Date 1267335350 0 # Node ID 81c005b82775573143b63556be4783fa22f43e82 # Parent c15cca3ae6a2e00aa5b3cf4544e93e7955eae029 More tinkering with input subsystem diff -r c15cca3ae6a2 -r 81c005b82775 lwasm/Makefile.am --- a/lwasm/Makefile.am Sun Feb 28 05:01:31 2010 +0000 +++ b/lwasm/Makefile.am Sun Feb 28 05:35:50 2010 +0000 @@ -2,4 +2,4 @@ bin_PROGRAMS = lwasm lwasm_SOURCES = main.c pragma.c input.c lwasm_LDADD = -L$(top_builddir)/lib -L$(top_srcdir)/lib -L$(top_builddir)/lwlib -L$(top_srcdir)/lwlib -lgnu -llw -EXTRA_DIST = lwasm.h +EXTRA_DIST = lwasm.h input.h diff -r c15cca3ae6a2 -r 81c005b82775 lwasm/input.c --- a/lwasm/input.c Sun Feb 28 05:01:31 2010 +0000 +++ b/lwasm/input.c Sun Feb 28 05:35:50 2010 +0000 @@ -58,17 +58,20 @@ char *filespec; }; -static struct input_stack *is = NULL; +#define IS ((struct input_stack *)(as -> input_data)) void input_init(asmstate_t *as) { struct input_stack *t; - + + if (as -> file_dir) + lw_stack_destroy(as -> file_dir); + as -> file_dir = lw_stack_create(lw_free); lw_stringlist_reset(as -> input_files); - while (is) + while (IS) { - t = is; - is = is -> next; + t = IS; + as -> input_data = IS -> next; lw_free(t); } } @@ -113,8 +116,8 @@ t -> type = input_type_string; t -> data = lw_strdup(str); t -> data2 = 0; - t -> next = is; - is = t; + t -> next = IS; + as -> input_data = t; t -> filespec = lw_strdup(s); } @@ -148,18 +151,18 @@ t -> type = input_type_error; } - t -> next = is; - is = t; + t -> next = IS; + as -> input_data = t; - switch (is -> type) + switch (IS -> type) { case input_type_include: /* first check for absolute path and if so, skip path */ if (*s == '/') { /* absolute path */ - is -> data = fopen(s, "rb"); - if (!is -> data) + IS -> data = fopen(s, "rb"); + if (!IS -> data) { lw_error("Cannot open file '%s': %s", s, strerror(errno)); } @@ -170,8 +173,8 @@ /* relative path, check relative to "current file" directory */ p = lw_stack_top(as -> file_dir); 0 == asprintf(&p2, "%s/%s", p, s); - is -> data = fopen(p2, "rb"); - if (is -> data) + IS -> data = fopen(p2, "rb"); + if (IS -> data) { input_pushpath(as, p2); lw_free(p2); @@ -184,8 +187,8 @@ while (p = lw_stringlist_current(as -> include_list)) { 0 == asprintf(&p2, "%s/%s", p, s); - is -> data = fopen(p2, "rb"); - if (is -> data) + IS -> data = fopen(p2, "rb"); + if (IS -> data) { input_pushpath(as, p2); lw_free(p2); @@ -197,9 +200,9 @@ lw_error("Cannot open include file '%s': %s", s, strerror(errno)); case input_type_file: - is -> data = fopen(s, "rb"); + IS -> data = fopen(s, "rb"); - if (!is -> data) + if (!IS -> data) { lw_error("Cannot open file '%s': %s", s, strerror(errno)); } @@ -219,7 +222,7 @@ /* if no file is open, open one */ nextfile: - if (!is) { + if (!IS) { s = lw_stringlist_current(as -> input_files); if (!s) return NULL; @@ -227,7 +230,7 @@ input_open(as, s); } - switch (is -> type) + switch (IS -> type) { case input_type_file: case input_type_include: @@ -235,19 +238,19 @@ for (;;) { int c, c2; - c = fgetc(is -> data); + c = fgetc(IS -> data); lbloc = 0; if (c == EOF) { if (lbloc == 0) { struct input_stack *t; - fclose(is -> data); + fclose(IS -> data); lw_free(lw_stack_pop(as -> file_dir)); - lw_free(is -> filespec); - t = is -> next; - lw_free(is); - is = t; + lw_free(IS -> filespec); + t = IS -> next; + lw_free(IS); + as -> input_data = t; goto nextfile; } linebuff[lbloc] = '\0'; @@ -257,21 +260,21 @@ { linebuff[lbloc] = '\0'; eol = 1; - c2 = fgetc(is -> data); + c2 = fgetc(IS -> data); if (c2 == EOF) c = EOF; else if (c2 != '\n') - ungetc(c2, is -> data); + ungetc(c2, IS -> data); } else if (c == '\n') { linebuff[lbloc] = '\0'; eol = 1; - c2 = fgetc(is -> data); + c2 = fgetc(IS -> data); if (c2 == EOF) c = EOF; else if (c2 != '\r') - ungetc(c2, is -> data); + ungetc(c2, IS -> data); } else { @@ -287,24 +290,24 @@ case input_type_string: /* read from a string */ - if (((char *)(is -> data))[is -> data2] == '\0') + if (((char *)(IS -> data))[IS -> data2] == '\0') { struct input_stack *t; - lw_free(is -> data); - lw_free(is -> filespec); - t = is -> next; - lw_free(is); - is = t; + lw_free(IS -> data); + lw_free(IS -> filespec); + t = IS -> next; + lw_free(IS); + as -> input_data = t; goto nextfile; } - s = (char *)(is -> data); + s = (char *)(IS -> data); lbloc = 0; for (;;) { int c; - c = s[is -> data2]; + c = s[IS -> data2]; if (c) - is -> data2++; + IS -> data2++; if (c == '\0') { linebuff[lbloc] = '\0'; @@ -314,15 +317,15 @@ { linebuff[lbloc] = '\0'; eol = 1; - if (s[is -> data2] == '\n') - is -> data2++; + if (s[IS -> data2] == '\n') + IS -> data2++; } else if (c == '\n') { linebuff[lbloc] = '\0'; eol = 1; - if (s[is -> data2] == '\r') - is -> data2++; + if (s[IS -> data2] == '\r') + IS -> data2++; } else { @@ -340,3 +343,10 @@ lw_error("Problem reading from unknown input type"); } } + +char *input_curspec(asmstate_t *as) +{ + if (IS) + return IS -> filespec; + return NULL; +} diff -r c15cca3ae6a2 -r 81c005b82775 lwasm/input.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lwasm/input.h Sun Feb 28 05:35:50 2010 +0000 @@ -0,0 +1,33 @@ +/* +input.h + +Copyright © 2010 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 . +*/ + +#ifndef ___input_h_seen___ +#define ___input_h_seen___ + +#include "lwasm.h" + +extern void input_init(asmstate_t *as); +extern void input_openstring(asmstate_t *as, char *s, char *str); +extern void input_open(asmstate_t *as, char *s); +extern char *input_readline(asmstate_t *as); +extern char *input_curspec(asmstate_t *as); + +#endif diff -r c15cca3ae6a2 -r 81c005b82775 lwasm/lwasm.h --- a/lwasm/lwasm.h Sun Feb 28 05:01:31 2010 +0000 +++ b/lwasm/lwasm.h Sun Feb 28 05:35:50 2010 +0000 @@ -68,6 +68,7 @@ char *list_file; // name of file to list to char *output_file; // output file name lw_stringlist_t input_files; // files to assemble + void *input_data; // opaque data used by the input system lw_stringlist_t include_list; // include paths lw_stack_t file_dir; // stack of the "current file" dir } asmstate_t; diff -r c15cca3ae6a2 -r 81c005b82775 lwasm/main.c --- a/lwasm/main.c Sun Feb 28 05:01:31 2010 +0000 +++ b/lwasm/main.c Sun Feb 28 05:35:50 2010 +0000 @@ -30,6 +30,7 @@ #include #include "lwasm.h" +#include "input.h" extern int parse_pragma_string(asmstate_t *as, char *str); @@ -171,8 +172,6 @@ /* initialize assembler state */ asmstate.include_list = lw_stringlist_create(); asmstate.input_files = lw_stringlist_create(); - asmstate.file_dir = lw_stack_create(lw_free); - input_init(); /* parse command line arguments */ argp_parse(&argp, argc, argv, 0, 0, &asmstate); @@ -182,5 +181,7 @@ asmstate.output_file = lw_strdup("a.out"); } + input_init(&asmstate); + exit(0); }