implemented asset resolving
[swftools.git] / lib / as3 / main.c
index 6a664a3..1ce83a6 100644 (file)
@@ -27,6 +27,7 @@
 #include "../rfxswf.h"
 #include "../os.h"
 #include "files.h"
+#include "common.h"
 #include "tokenizer.h"
 #include "parser.tab.h"
 #include "parser.h"
@@ -35,7 +36,7 @@
 
 void test_lexer(char*filename)
 {
-    char*fullfilename = find_file(filename);
+    char*fullfilename = find_file(filename, 1);
     enter_file(filename, fullfilename, 0);
     FILE*fi = fopen(fullfilename, "rb");
     as3_file_input(fi);
@@ -51,6 +52,7 @@ void test_lexer(char*filename)
     }
 }
 
+extern int a3_debug;
 int main(int argn, char*argv[])
 {
     char*filename = 0;
@@ -61,35 +63,59 @@ int main(int argn, char*argv[])
         exit(1);
     }
     filename=argv[argn-1];
+
+#ifdef BISONDEBUG
+    a3_debug = 1; //if bison was called with -t
+#endif
    
     as3_add_include_dir(getcwd(buf, 512));
 
+    registry_init();
+
     int t=0;
+    char*mainclass = 0;
     for(t=1;t<argn-1;t++) {
         if(!strcmp(argv[t], "-lex")) {
             test_lexer(filename);
             return 0;
         }
+        if(!strcmp(argv[t], "-M")) {
+            mainclass = argv[++t];
+        }
         if(!strcmp(argv[t], "-v")) {
             as3_verbosity++;
         }
         if(!strcmp(argv[t], "-q")) {
             as3_verbosity--;
         }
+        if(!strcmp(argv[t], "-D")) {
+            char*c = argv[t+1];
+            if(!strstr(c, "::"))
+                printf("Error: compile definition must contain \"::\"\n");
+            as3_set_define(c);
+        }
+        if(!strcmp(argv[t], "-R")) {
+            as3_set_option("recurse","1");
+        }
         if(!strcmp(argv[t], "-I")) {
             as3_add_include_dir(argv[++t]);
         }
+        if(!strcmp(argv[t], "-l")) {
+            as3_import_file(argv[++t]);
+        }
     }
 
     //extern int avm2_debug;
     //avm2_debug = 1;
 
-    registry_init();
-
     //memfile_t*m = memfile_open(filename);
     //as3_parse_bytearray(filename, m->data, m->len);
     //memfile_close(m);
-    as3_parse_file(filename);
+    if(!strcmp(filename, ".")) {
+        as3_parse_directory(".");
+    } else {
+        as3_parse_file(filename);
+    }
 
     void*code = as3_getcode();
 
@@ -100,14 +126,23 @@ int main(int argn, char*argv[])
     swf.movieSize.xmin = swf.movieSize.ymin = 0;
     swf.movieSize.xmax = 20*20;
     swf.movieSize.ymax = 10*20;
-    TAG*tag = swf.firstTag = swf_InsertTag(0, ST_DOABC);
+    TAG*tag = (TAG*)as3_getassets(0);
+    if(!swf.firstTag && tag) swf.firstTag = tag;
+
+    while(tag && tag->next) tag = tag->next;
+
+    tag = swf_InsertTag(tag, ST_DOABC);
+    if(!swf.firstTag && tag) swf.firstTag = tag;
     swf_WriteABC(tag, code);
 
-    if(as3_getglobalclass()) {
+    if(!mainclass)
+        mainclass = as3_getglobalclass();
+
+    if(mainclass) {
         tag = swf_InsertTag(tag, ST_SYMBOLCLASS);
         swf_SetU16(tag, 1);
         swf_SetU16(tag, 0);
-        swf_SetString(tag, as3_getglobalclass());
+        swf_SetString(tag, mainclass);
     } else {
         printf("Warning: no global public MovieClip subclass\n");
     }