X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ffiles.c;h=cf6145b81104e11f0c4c585eb8ebd3adaf5f9069;hb=476adb011f3e50495ad8686169ddcf9cf3dd6b97;hp=e30b112eb38f7333d22bfee636791e3080e121f5;hpb=1ae58b8b15dee25f1915c344f4fdea9f9c3d41ea;p=swftools.git diff --git a/lib/as3/files.c b/lib/as3/files.c index e30b112..cf6145b 100644 --- a/lib/as3/files.c +++ b/lib/as3/files.c @@ -23,7 +23,9 @@ #include #include #include +#include #include "files.h" +#include "tokenizer.h" static int verbose = 0; static void dbg(const char*format, ...) @@ -55,6 +57,7 @@ typedef struct _include_dir { int current_line=1; int current_column=0; char* current_filename=0; +char* current_filename_short=0; include_dir_t* current_include_dirs=0; #define MAX_INCLUDE_DEPTH 16 @@ -63,6 +66,7 @@ void*include_stack[MAX_INCLUDE_DEPTH]; int line_stack[MAX_INCLUDE_DEPTH]; int column_stack[MAX_INCLUDE_DEPTH]; char* filename_stack[MAX_INCLUDE_DEPTH]; +char* shortfilename_stack[MAX_INCLUDE_DEPTH]; include_dir_t* includedir_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; @@ -129,6 +133,9 @@ char*find_file(char*filename) } return 0; } + if(!i) { + as3_warning("Include directory stack is empty, while looking for file %s", filename); + } while(i) { char*p = concat_paths(i->path, filename); fi = fopen(p, "rb"); @@ -143,13 +150,15 @@ char*find_file(char*filename) char*enter_file(char*filename, void*state) { + filename = strdup(filename); + if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { - syntaxerror("Includes nested too deeply"); + as3_error("Includes nested too deeply"); exit(1); } char*fullfilename = find_file(filename); if(!fullfilename) { - syntaxerror("Couldn't find file %s", filename); + as3_error("Couldn't find file %s", filename); include_dir_t*i = current_include_dirs; while(i) { fprintf(stderr, "include dir: %s\n", i->path); @@ -160,6 +169,7 @@ char*enter_file(char*filename, void*state) include_stack[include_stack_ptr] = state; line_stack[include_stack_ptr] = current_line; column_stack[include_stack_ptr] = current_column; + shortfilename_stack[include_stack_ptr] = current_filename_short; filename_stack[include_stack_ptr] = current_filename; includedir_stack[include_stack_ptr] = current_include_dirs; add_include_dir(get_path(fullfilename)); @@ -169,20 +179,32 @@ char*enter_file(char*filename, void*state) current_line=1; current_column=0; - current_filename=fullfilename; + current_filename = fullfilename; + current_filename_short = filename; return fullfilename; } +FILE*enter_file2(char*filename, void*state) +{ + char*fullfilename = enter_file(filename, state); + FILE*fi = fopen(fullfilename, "rb"); + if(!fi) { + as3_error("Couldn't find file %s: %s", fullfilename, strerror(errno)); + } + return fi; +} + + void* leave_file() { dbg("leaving file %s", current_filename); - if(--include_stack_ptr<0) { + if(--include_stack_ptr<=0) { return 0; } else { + free(current_filename);current_filename = filename_stack[include_stack_ptr]; + free(current_filename_short);current_filename_short = shortfilename_stack[include_stack_ptr]; current_column = column_stack[include_stack_ptr]; current_line = line_stack[include_stack_ptr]; - free(current_filename); - current_filename = filename_stack[include_stack_ptr]; current_include_dirs = includedir_stack[include_stack_ptr]; return include_stack[include_stack_ptr]; }