+}
+
+void as3_import_swf(char*filename)
+{
+ reader_t reader;
+ reader_init_filereader2(&reader, filename);
+ as3_import_swf2(&reader, filename, 0);
+ reader.dealloc(&reader);
+}
+
+#ifdef HAVE_ZZIP
+typedef struct _catalog_state {
+ char*xml_filename;
+ char in_libraries;
+ char*library;
+ char*script;
+ dict_t*deps;
+ deps_t*current_deps;
+ dict_t*name2deps;
+ dict_t*id2script;
+ ZZIP_DIR*dir;
+} catalog_state_t;
+
+const char* fa(catalog_state_t*state, xmlattribute_t*attr, const char*name)
+{
+ while(attr) {
+ if(!strcmp(attr->name, name)) return attr->value;
+ attr = attr->next;
+ }
+ syntaxerror("error parsing %s: attribute %s missing", state->xml_filename, name);
+}
+
+void catalog_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+ if(!strcmp(name, "libraries")) {
+ state->in_libraries = 1;
+ } else if(!strcmp(name, "library")) {
+ state->library = strdup(fa(state, attr, "path"));
+ } else if(!strcmp(name, "script")) {
+ state->script = strdup(fa(state, attr, "name"));
+ } else if(!strcmp(name, "def")) {
+ dict_put(state->id2script, strdup(fa(state, attr, "id")), strdup(state->script));
+ } else if(!strcmp(name, "dep")) {
+ NEW(deps_t,d);
+ d->name = strdup(fa(state, attr, "id"));
+ d->next = state->current_deps;
+ state->current_deps = d;
+ }
+}
+void catalog_data(xmlconsumer_t*c, char*data, int len)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+}
+void catalog_end_tag(xmlconsumer_t*c, char*name)
+{
+ catalog_state_t*state = (catalog_state_t*)c->internal;
+ if(!strcmp(name, "libraries")) {
+ state->in_libraries = 0;
+ } else if(!strcmp(name, "library")) {
+ ZZIP_FILE*file = zzip_file_open(state->dir, state->library, 0);
+
+ DICT_ITERATE_DATA(state->deps,deps_t*,deps) {
+ while(deps) {
+ char*script = dict_lookup(state->id2script, deps->name);
+ if(!script) {
+ //as3_warning("when importing %s: depencency %s referenced in catalog.xml, but not found.", state->xml_filename, deps->name);
+ }
+ deps->name = script;
+ deps = deps->next;
+ }
+ }