X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fcompiler.c;h=02726509901fda2e1d916d01e299df46144b2e18;hb=65dec90461cf9ceb574ba89189a65980960a3f56;hp=28769e8a7b5cc93f6c9ad7921dd3e9ce9f794625;hpb=dac2d533ddea79fcc214638837bb5b746639dbab;p=swftools.git diff --git a/lib/as3/compiler.c b/lib/as3/compiler.c index 28769e8..0272650 100644 --- a/lib/as3/compiler.c +++ b/lib/as3/compiler.c @@ -27,6 +27,9 @@ #include "parser.tab.h" #include "compiler.h" #include "../os.h" +#ifdef HAVE_SYS_STAT_H +#include +#endif #ifdef HAVE_DIRENT_H #include #endif @@ -50,6 +53,9 @@ static char parser_initialized = 0; //#define STORE_TOKENS +//#define DEBUG +#define DEBUG if(0) + #ifdef STORE_TOKENS static mem_t tokens; #endif @@ -79,7 +85,7 @@ int a3_lex() #endif } -static void as3_parse_file_or_array(int pass, const char*name, const char*filename, void*mem, int length) +static void as3_parse_file_or_array(int pass, const char*name, const char*filename, const void*mem, int length) { if(!registry_initialized) { registry_initialized = 1; @@ -96,21 +102,24 @@ static void as3_parse_file_or_array(int pass, const char*name, const char*filena FILE*fi = 0; if(filename) { + DEBUG printf("[pass %d] parse file %s %s\n", pass, name, filename); fi = enter_file2(name, filename, 0); as3_file_input(fi); } else { + DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", pass, name, length); enter_file(name, name, 0); - as3_buffer_input(mem, length); + as3_buffer_input((void*)mem, length); } as3_tokencount=0; - initialize_file(name); + initialize_file(name, filename); a3_parse(); as3_lex_destroy(); finish_file(); } typedef struct _scheduled_file { + char*name; char*filename; struct _scheduled_file*next; } scheduled_file_t; @@ -118,45 +127,59 @@ typedef struct _scheduled_file { static scheduled_file_t*scheduled=0; dict_t*scheduled_dict=0; -void as3_parse_scheduled() +void as3_parse_scheduled(int pass) { + DEBUG printf("[pass %d] parse scheduled\n", pass); + while(scheduled) { - scheduled_file_t*old = scheduled; - as3_parse_file(scheduled->filename); - scheduled = scheduled->next; - free(old->filename); - free(old); + scheduled_file_t*s = scheduled; + scheduled = 0; + while(s) { + scheduled_file_t*old = s; + as3_parse_file_or_array(pass, s->name, s->filename, 0,0); + s = s->next; + + free(old->filename); + free(old->name); + old->filename = old->name = 0; + free(old); + } } if(scheduled_dict) { dict_destroy(scheduled_dict); scheduled_dict=0; } } -void as3_schedule_file(const char*filename) + +void as3_schedule_file(const char*name, const char*filename) { - if(!scheduled_dict) + if(!scheduled_dict) { scheduled_dict = dict_new(); + } - if(dict_lookup(scheduled_dict, filename)) { + filename = normalize_path(filename); + + if(dict_contains(scheduled_dict, filename)) { return; //already processed } else { dict_put(scheduled_dict, filename, 0); } + DEBUG printf("[pass %d] schedule %s %s\n", as3_pass, name, filename); NEW(scheduled_file_t, f); + f->name = strdup(name); f->filename = strdup(filename); f->next = scheduled; // dfs scheduled = f; - printf("schedule %s\n", filename); } -void as3_parse_bytearray(const char*name, void*mem, int length) +void as3_parse_bytearray(const char*name, const void*mem, int length) { as3_parse_file_or_array(1, name, 0, mem, length); - as3_parse_scheduled(); + as3_parse_scheduled(1); as3_parse_file_or_array(2, name, 0, mem, length); - as3_parse_scheduled(); + as3_parse_scheduled(2); } void as3_parse_file(const char*filename) @@ -166,28 +189,36 @@ void as3_parse_file(const char*filename) return; // not found as3_parse_file_or_array(1, filename, fullfilename, 0,0); - as3_parse_scheduled(); + as3_parse_scheduled(1); as3_parse_file_or_array(2, filename, fullfilename, 0,0); - as3_parse_scheduled(); + as3_parse_scheduled(2); free(fullfilename); } -void as3_schedule_package(const char*package) +void as3_parse_directory(const char*dir) { - char*dirname = strdup(package); - int s=0; - while(dirname[s]) { - if(package[s]=='.') dirname[s]='/'; - s++; - }; + as3_pass=1; + as3_schedule_directory(dir); + if(!scheduled) + as3_warning("Directory %s doesn't contain any ActionScript files", dir); + as3_parse_scheduled(1); + as3_pass=2; + as3_schedule_directory(dir); + as3_parse_scheduled(2); +} + +char as3_schedule_directory(const char*dirname) +{ + DEBUG printf("[pass %d] schedule directory %s\n", as3_pass, dirname); char ok=0; #ifdef HAVE_DIRENT_H include_dir_t*i = current_include_dirs; while(i) { - char*fulldirname = concatPaths(i->path, dirname); - DIR*dir = opendir(dirname); + char*fulldirname = concat_paths(i->path, dirname); + DEBUG printf("[pass %d] ... %s\n", as3_pass, fulldirname); + DIR*dir = opendir(fulldirname); if(dir) { ok = 1; struct dirent*ent; @@ -203,8 +234,8 @@ void as3_schedule_package(const char*package) continue; if(strncasecmp(&name[l-3], ".as", 3)) continue; - char*fullfilename = concatPaths(dirname, name); - as3_schedule_file(fullfilename); + char*fullfilename = concatPaths(fulldirname, name); + as3_schedule_file(name, fullfilename); free(fullfilename); } } @@ -212,12 +243,25 @@ void as3_schedule_package(const char*package) i = i->next; } #endif - if(!ok) - as3_warning("Could not find package %s", package); + return ok; +} + +void as3_schedule_package(const char*package) +{ + DEBUG printf("[pass %d] schedule package %s\n", as3_pass, package); + char*dirname = strdup(package); + int s=0; + while(dirname[s]) { + if(dirname[s]=='.') dirname[s]='/'; + s++; + }; + if(!as3_schedule_directory(package)) + as3_softwarning("Could not find package %s in file system", package); } void as3_schedule_class(const char*package, const char*cls) { + DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls); if(!cls) { as3_schedule_package(package); return; @@ -253,7 +297,7 @@ void as3_schedule_class(const char*package, const char*cls) return; } } - as3_schedule_file(f); + as3_schedule_file(filename, f); } static void*as3code = 0;