+ 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;
+}
+
+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_parse_file_or_array(2, name, 0, mem, length);
+ as3_parse_scheduled(2);
+}
+
+void as3_parse_file(const char*filename)
+{
+ char*fullfilename = find_file(filename);
+ if(!fullfilename)
+ return; // not found
+
+ as3_parse_file_or_array(1, filename, fullfilename, 0,0);
+ as3_parse_scheduled(1);
+
+ as3_parse_file_or_array(2, filename, fullfilename, 0,0);
+ as3_parse_scheduled(2);
+
+ free(fullfilename);
+}
+
+void as3_parse_directory(const char*dir)
+{
+ 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 = 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;
+ while(1) {
+ ent = readdir(dir);
+ if (!ent)
+ break;
+ char*name = ent->d_name;
+ char type = 0;
+ if(!name) continue;
+ int l=strlen(name);
+ if(l<4)
+ continue;
+ if(strncasecmp(&name[l-3], ".as", 3))
+ continue;
+ char*fullfilename = concatPaths(fulldirname, name);
+ as3_schedule_file(name, fullfilename);
+ free(fullfilename);
+ }
+ }
+ free(fulldirname);
+ i = i->next;
+ }