fixed bug in recursive scheduling
[swftools.git] / lib / as3 / compiler.c
index 28769e8..aac60c7 100644 (file)
@@ -96,21 +96,24 @@ static void as3_parse_file_or_array(int pass, const char*name, const char*filena
 
     FILE*fi = 0;
     if(filename) {
+        //printf("[pass %d] parse file %s %s\n", 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);
         enter_file(name, name, 0);
         as3_buffer_input(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 +121,55 @@ 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)
 {
+    //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) 
         scheduled_dict = dict_new();
-
-    if(dict_lookup(scheduled_dict, filename)) {
+    
+    if(dict_contains(scheduled_dict, filename)) {
         return; //already processed
     } else {
         dict_put(scheduled_dict, filename, 0);
     }
+    //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)
 {
     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,22 +179,26 @@ 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)
+{
+    as3_pass=1;
+    as3_schedule_directory(dir);
+    as3_parse_scheduled(1);
+    as3_pass=2;
+    as3_schedule_directory(dir);
+    as3_parse_scheduled(2);
+}
+
+char as3_schedule_directory(const char*dirname)
 {
-    char*dirname = strdup(package);
-    int s=0;
-    while(dirname[s]) {
-        if(package[s]=='.') dirname[s]='/';
-        s++;
-    };
     char ok=0;
 #ifdef HAVE_DIRENT_H
     include_dir_t*i = current_include_dirs;
@@ -204,7 +221,7 @@ void as3_schedule_package(const char*package)
                 if(strncasecmp(&name[l-3], ".as", 3)) 
                     continue;
                 char*fullfilename = concatPaths(dirname, name);
-                as3_schedule_file(fullfilename);
+                as3_schedule_file(name, fullfilename);
                 free(fullfilename);
             }
         }
@@ -212,8 +229,19 @@ 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)
+{
+    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)
@@ -253,7 +281,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;