# HG changeset patch # User William Astle # Date 1342407018 21600 # Node ID 3864d96ee8c77b279945eb44ec705d3b42d2fd60 # Parent 211fc8038b8d8318a6caac1fca0e6a33bc06f676 Make unicorns notice referenced files better Fix bug related to includebin and also make unicorns notice all files opened through the input subsystem when generating the resource list. diff -r 211fc8038b8d -r 3864d96ee8c7 lwasm/input.c --- a/lwasm/input.c Sun Jul 15 20:14:51 2012 -0600 +++ b/lwasm/input.c Sun Jul 15 20:50:18 2012 -0600 @@ -80,6 +80,28 @@ #define IS ((struct input_stack *)(as -> input_data)) +struct ifl *ifl_head = NULL; + +/* this adds real filenames that were opened to a list */ +void input_add_to_resource_list(asmstate_t *as, const char *s) +{ + struct ifl *ifl; + + /* first see if the file is already referenced */ + for (ifl = ifl_head; ifl; ifl = ifl -> next) + { + if (strcmp(s, ifl -> fn) == 0) + break; + } + if (!ifl) + { + ifl = lw_alloc(sizeof(struct ifl)); + ifl -> next = ifl_head; + ifl_head = ifl; + ifl -> fn = lw_strdup(s); + } +} + void input_init(asmstate_t *as) { struct input_stack *t; @@ -200,6 +222,7 @@ as -> fileerr = 1; } input_pushpath(as, s); + input_add_to_resource_list(as, s); return; } @@ -211,6 +234,7 @@ if (IS -> data) { input_pushpath(as, p2); + input_add_to_resource_list(as, p2); lw_free(p2); return; } @@ -227,6 +251,7 @@ if (IS -> data) { input_pushpath(as, p2); + input_add_to_resource_list(as, p2); lw_free(p2); return; } @@ -252,18 +277,20 @@ lw_error("Cannot open file '%s': %s\n", s, strerror(errno)); } input_pushpath(as, s); + input_add_to_resource_list(as, s); return; } lw_error("Cannot figure out how to open '%s'.\n", t -> filespec); } -FILE *input_open_standalone(asmstate_t *as, char *s) +FILE *input_open_standalone(asmstate_t *as, char *s, char **rfn) { // char *s2; FILE *fp; char *p, *p2; + debug_message(as, 2, "Open file (st) %s", s); /* first check for absolute path and if so, skip path */ if (*s == '/') { @@ -276,6 +303,9 @@ { return NULL; } + if (rfn) + *rfn = lw_strdup(s); + input_add_to_resource_list(as, s); return fp; } @@ -288,6 +318,9 @@ { if (as -> flags & FLAG_DEPEND) printf("%s\n", p2); + input_add_to_resource_list(as, p2); + if (rfn) + *rfn = lw_strdup(p2); lw_free(p2); return fp; } @@ -304,6 +337,9 @@ { if (as -> flags & FLAG_DEPEND) printf("%s\n", p2); + input_add_to_resource_list(as, p2); + if (rfn) + *rfn = lw_strdup(p2); lw_free(p2); return fp; } diff -r 211fc8038b8d -r 3864d96ee8c7 lwasm/input.h --- a/lwasm/input.h Sun Jul 15 20:14:51 2012 -0600 +++ b/lwasm/input.h Sun Jul 15 20:50:18 2012 -0600 @@ -37,6 +37,14 @@ extern void input_open(asmstate_t *as, char *s); extern char *input_readline(asmstate_t *as); extern char *input_curspec(asmstate_t *as); -extern FILE *input_open_standalone(asmstate_t *as, char *s); +extern FILE *input_open_standalone(asmstate_t *as, char *s, char **rfn); + +struct ifl +{ + const char *fn; + struct ifl *next; +}; + +extern struct ifl *ifl_head; #endif diff -r 211fc8038b8d -r 3864d96ee8c7 lwasm/main.c --- a/lwasm/main.c Sun Jul 15 20:14:51 2012 -0600 +++ b/lwasm/main.c Sun Jul 15 20:50:18 2012 -0600 @@ -58,7 +58,7 @@ { "includedir", 'I', "PATH", 0, "Add entry to include path" }, { "define", 'D', "SYM[=VAL]", 0, "Automatically define SYM to be VAL (or 1)"}, { "preprocess", 'P', 0, 0, "Preprocess macros and conditionals and output revised source to stdout" }, - { "unicorns", 0x4242, 0, 0, "Add sooper sekrit sauce"}, + { "unicorns", 0x142, 0, 0, "Add sooper sekrit sauce"}, { 0 } }; @@ -141,7 +141,7 @@ as -> flags |= FLAG_DEPEND | FLAG_DEPENDNOERR; break; - case 0x4242: + case 0x142: as -> flags |= FLAG_UNICORNS; break; @@ -299,16 +299,13 @@ if (asmstate.flags & FLAG_DEPEND) { - if ((asmstate.flags & FLAG_UNICORNS) == 0) - { - // output dependencies (other than "includebin") - char *n; + // output dependencies (other than "includebin") + char *n; - while ((n = lw_stack_pop(asmstate.includelist))) - { - fprintf(stdout, "%s\n", n); - lw_free(n); - } + while ((n = lw_stack_pop(asmstate.includelist))) + { + fprintf(stdout, "%s\n", n); + lw_free(n); } } else @@ -321,6 +318,7 @@ if (asmstate.flags & FLAG_UNICORNS) { + debug_message(&asmstate, 50, "Invoking unicorns"); lwasm_do_unicorns(&asmstate); } else diff -r 211fc8038b8d -r 3864d96ee8c7 lwasm/pseudo.c --- a/lwasm/pseudo.c Sun Jul 15 20:14:51 2012 -0600 +++ b/lwasm/pseudo.c Sun Jul 15 20:50:18 2012 -0600 @@ -1316,6 +1316,7 @@ int delim = 0; FILE *fp; long flen; + char *rfn; if (!**p) { @@ -1341,7 +1342,7 @@ if (delim && **p) (*p)++; - fp = input_open_standalone(as, fn); + fp = input_open_standalone(as, fn, &rfn); if (!fp) { lwasm_register_error(as, l, "Cannot open file"); @@ -1349,7 +1350,7 @@ return; } - l -> lstr = fn; + l -> lstr = rfn; fseek(fp, 0, SEEK_END); flen = ftell(fp); @@ -1363,7 +1364,7 @@ FILE *fp; int c; - fp = input_open_standalone(as, l -> lstr); + fp = fopen(l -> lstr, "r"); if (!fp) { lwasm_register_error(as, l, "Cannot open file (emit)!"); diff -r 211fc8038b8d -r 3864d96ee8c7 lwasm/unicorns.c --- a/lwasm/unicorns.c Sun Jul 15 20:14:51 2012 -0600 +++ b/lwasm/unicorns.c Sun Jul 15 20:50:18 2012 -0600 @@ -27,6 +27,7 @@ #include #include +#include "input.h" #include "lwasm.h" #include "lw_alloc.h" @@ -47,18 +48,17 @@ void lwasm_do_unicorns(asmstate_t *as) { - char *n; + struct ifl *ifl; macrotab_t *me; structtab_t *se; int i; /* output file list */ - while ((n = lw_stack_pop(as -> includelist))) + for (ifl = ifl_head; ifl; ifl = ifl -> next) { fputs("RESOURCE: type=file,filename=", stdout); - print_urlencoding(stdout, n); + print_urlencoding(stdout, ifl -> fn); fputc('\n', stdout); - lw_free(n); } /* output macro list */