Mercurial > hg-old > index.cgi
diff lwasm/input.c @ 330:81c005b82775
More tinkering with input subsystem
author | lost |
---|---|
date | Sun, 28 Feb 2010 05:35:50 +0000 |
parents | c15cca3ae6a2 |
children | 67224d8d1024 |
line wrap: on
line diff
--- 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; +}