+ FILE*fi = 0;
+ if(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 {
+ DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", as3_pass, name, length);
+ enter_file(name, name, 0);
+ as3_buffer_input((void*)mem, length);
+ }
+
+ as3_tokencount=0;
+ 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;
+
+static scheduled_file_t*scheduled=0;
+dict_t*scheduled_dict=0;
+
+void as3_parse_scheduled()
+{
+ 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) {
+ scheduled_dict = dict_new();
+ }
+
+ filename = normalize_path(filename);