X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fas3%2Fcompiler.c;h=e6571dbfc74f885c838b848f499101737259511a;hp=8c2337a7440d205d6e26b384672a49a0e2890731;hb=9ed9a87914fc9a590967d46de404e0f6290b7bb2;hpb=05c9d104ed2cd98d18d4f717734117ce59910912 diff --git a/lib/as3/compiler.c b/lib/as3/compiler.c index 8c2337a..e6571db 100644 --- a/lib/as3/compiler.c +++ b/lib/as3/compiler.c @@ -21,12 +21,18 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "common.h" #include "tokenizer.h" #include "files.h" #include "parser.h" #include "parser.tab.h" #include "compiler.h" +#include "registry.h" +#include "assets.h" #include "../os.h" +#ifdef HAVE_SYS_STAT_H +#include +#endif #ifdef HAVE_DIRENT_H #include #endif @@ -36,6 +42,8 @@ extern int a3_parse(); extern int as3_lex(); extern int as3_lex_destroy(); +static char config_recurse = 0; + void as3_setverbosity(int level) { as3_verbosity=level; @@ -44,42 +52,35 @@ void as3_add_include_dir(char*dir) { add_include_dir(dir); } +void as3_set_option(const char*key, const char*value) +{ + if(!strcmp(key, "recurse")) { + config_recurse=atoi(value); + } +} static char registry_initialized = 0; static char parser_initialized = 0; //#define STORE_TOKENS -#ifdef STORE_TOKENS -static mem_t tokens; -#endif +//#define DEBUG +#define DEBUG if(0) int a3_lex() { as3_tokencount++; -#ifdef STORE_TOKENS - if(as3_pass==1) { - int token = as3_lex(); - /* FIXME: current_file needs to be stored, too */ - mem_put(&tokens, &token, sizeof(token)); - mem_put(&tokens, &a3_lval, sizeof(a3_lval)); - mem_put(&tokens, ¤t_line, sizeof(current_line)); - mem_put(&tokens, ¤t_column, sizeof(current_column)); - return token; - } else { - int token; - mem_get(&tokens, &token, sizeof(token)); - mem_get(&tokens, &a3_lval, sizeof(a3_lval)); - mem_get(&tokens, ¤t_line, sizeof(current_line)); - mem_get(&tokens, ¤t_column, sizeof(current_column)); - return token; - } -#else return as3_lex(); -#endif } -static void as3_parse_file_or_array(int pass, const char*name, const char*filename, void*mem, int length) +typedef struct _compile_list { + const char*name; + const char*filename; + struct _compile_list*next; +} compile_list_t; +static compile_list_t*compile_list=0; + +static void as3_parse_file_or_array(const char*name, const char*filename, const void*mem, int length) { if(!registry_initialized) { registry_initialized = 1; @@ -88,21 +89,25 @@ static void as3_parse_file_or_array(int pass, const char*name, const char*filena if(!parser_initialized) { parser_initialized = 1; initialize_parser(); -#if defined(STORE_TOKENS) - mem_init(&tokens); -#endif } - as3_pass=pass; FILE*fi = 0; if(filename) { - //printf("[pass %d] parse file %s %s\n", pass, name, filename); + if(as3_pass==1 && !mem) { + // record the fact that we compiled this file + compile_list_t*c = rfx_calloc(sizeof(compile_list_t)); + c->next = compile_list; + c->name = strdup(name); + c->filename = strdup(filename); + compile_list = c; + } + DEBUG printf("[pass %d] parse file %s %s\n", as3_pass, name, filename); fi = enter_file2(name, filename, 0); as3_file_input(fi); } else { - //printf("[pass %d] parse bytearray %s (%d bytes)\n", pass, name, length); + DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", as3_pass, name, length); enter_file(name, name, 0); - as3_buffer_input(mem, length); + as3_buffer_input((void*)mem, length); } as3_tokencount=0; @@ -110,6 +115,7 @@ static void as3_parse_file_or_array(int pass, const char*name, const char*filena a3_parse(); as3_lex_destroy(); finish_file(); + if(fi) fclose(fi); } typedef struct _scheduled_file { @@ -121,37 +127,44 @@ typedef struct _scheduled_file { static scheduled_file_t*scheduled=0; dict_t*scheduled_dict=0; -void as3_parse_scheduled(int pass) +void as3_parse_scheduled() { - 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); + DEBUG printf("[pass %d] parse scheduled\n", as3_pass); + + while(scheduled) { + scheduled_file_t*s = scheduled; + scheduled = 0; + while(s) { + scheduled_file_t*old = s; + as3_parse_file_or_array(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*name, const char*filename) { - if(!scheduled_dict) + if(!scheduled_dict) { scheduled_dict = dict_new(); - - //printf("schedule %s %s\n", name, 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); @@ -160,46 +173,72 @@ void as3_schedule_file(const char*name, const char*filename) scheduled = f; } -void as3_parse_bytearray(const char*name, void*mem, int length) +void as3_parse_list() +{ + while(compile_list) { + as3_parse_file_or_array(compile_list->name, compile_list->filename, 0,0); + compile_list = compile_list->next; + } +} + +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(1); + as3_pass = 1; + as3_parse_file_or_array(name, 0, mem, length); + as3_parse_scheduled(); - as3_parse_file_or_array(2, name, 0, mem, length); - as3_parse_scheduled(2); + registry_resolve_all(); + + as3_pass = 2; + as3_parse_file_or_array(name, 0, mem, length); + as3_parse_list(); } void as3_parse_file(const char*filename) { - char*fullfilename = find_file(filename); + char*fullfilename = find_file(filename, 1); if(!fullfilename) return; // not found + + compile_list = 0; + as3_pass = 1; + as3_schedule_file(filename, fullfilename); + as3_parse_scheduled(); - as3_parse_file_or_array(1, filename, fullfilename, 0,0); - as3_parse_scheduled(1); + registry_resolve_all(); - as3_parse_file_or_array(2, filename, fullfilename, 0,0); - as3_parse_scheduled(2); + as3_pass = 2; + as3_parse_list(); free(fullfilename); } void as3_parse_directory(const char*dir) { + compile_list = 0; + + as3_pass = 1; as3_schedule_directory(dir); - as3_parse_scheduled(1); - as3_schedule_directory(dir); - as3_parse_scheduled(2); + if(!scheduled) + as3_warning("Directory %s doesn't contain any ActionScript files", dir); + as3_parse_scheduled(); + + registry_resolve_all(); + + as3_pass = 2; + as3_parse_list(); } 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; @@ -215,7 +254,7 @@ char as3_schedule_directory(const char*dirname) continue; if(strncasecmp(&name[l-3], ".as", 3)) continue; - char*fullfilename = concatPaths(dirname, name); + char*fullfilename = concatPaths(fulldirname, name); as3_schedule_file(name, fullfilename); free(fullfilename); } @@ -229,18 +268,23 @@ char as3_schedule_directory(const char*dirname) 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]='/'; + if(dirname[s]=='.') + dirname[s] = path_seperator; s++; }; - if(!as3_schedule_directory(package)) + if(!as3_schedule_directory(dirname)) as3_softwarning("Could not find package %s in file system", package); } -void as3_schedule_class(const char*package, const char*cls) +static void schedule_class(const char*package, const char*cls, char error) { + if(error) { + DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls); + } if(!cls) { as3_schedule_package(package); return; @@ -261,24 +305,36 @@ void as3_schedule_class(const char*package, const char*cls) strcpy(filename+t, cls); strcpy(filename+t+l2, ".as"); - char*f=0; - if(!(f=find_file(filename))) { + char*f=find_file(filename, error); + if(!f) { int i; - /* try lower case filename (not packagename!), too */ - for(i=t;i='A' && filename[i]<='Z') - filename[i] += 'a'-'A'; - } - if(!(f=find_file(filename))) { - strcpy(filename+t, cls); - strcpy(filename+t+l2, ".as"); - as3_warning("Could not open file %s", filename); - return; - } + filename = filename_to_lowercase(filename); + f=find_file(filename, error); + } + if(!f) { + if(error) { + strcpy(filename+t, cls); + strcpy(filename+t+l2, ".as"); + as3_warning("Could not open file %s", filename); + } + return; } as3_schedule_file(filename, f); } +void as3_schedule_class(const char*package, const char*cls) +{ + schedule_class(package, cls, 1); +} + +void as3_schedule_class_noerror(const char*package, const char*cls) +{ + if(config_recurse) { + schedule_class(package, cls, 0); + } +} + + static void*as3code = 0; void* as3_getcode() { @@ -288,6 +344,10 @@ void* as3_getcode() } return as3code; } +void* as3_getassets(void*t) +{ + return swf_AssetsToTags((TAG*)t, registry_getassets()); +} char* as3_getglobalclass() { return as3_globalclass;