From 32add149087f12dd242eff60e09737389ec587bb Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Fri, 1 Jan 2010 21:00:27 -0800 Subject: [PATCH] bugfixes --- lib/as3/Makefile | 2 +- lib/as3/abc.h | 13 +++++--- lib/as3/assets.c | 96 +++++++++++++++++++++--------------------------------- 3 files changed, 48 insertions(+), 63 deletions(-) diff --git a/lib/as3/Makefile b/lib/as3/Makefile index 0ddf96a..826281c 100644 --- a/lib/as3/Makefile +++ b/lib/as3/Makefile @@ -18,7 +18,7 @@ BISONDEBUGFLAGS=-t BISONDEBUGDEFINE=-DBISONDEBUG endif parser.tab.h parser.tab.c: parser.y parser.h skeleton.m4 Makefile - /usr/local/bin/bison $(BISONDEBUGFLAGS) -S ./skeleton.m4 -v --defines -pa3_ parser.y -o parser.tab.c + bison $(BISONDEBUGFLAGS) -S ./skeleton.m4 -v --defines -pa3_ parser.y -o parser.tab.c main.o: main.c parser.tab.h parser.h $(C) $(BISONDEBUGDEFINE) main.c -o main.o diff --git a/lib/as3/abc.h b/lib/as3/abc.h index 41496ed..4ba6da3 100644 --- a/lib/as3/abc.h +++ b/lib/as3/abc.h @@ -35,8 +35,10 @@ DECLARE(abc_class); DECLARE(abc_exception); DECLARE(abc_asset); DECLARE(asset_dependency); +DECLARE(asset_tag); DECLARE_LIST(abc_asset); DECLARE_LIST(asset_dependency); +DECLARE_LIST(asset_tag); DECLARE_LIST(abc_exception); DECLARE_LIST(TAG); @@ -206,13 +208,16 @@ typedef struct _abc_script { struct _asset_dependency { abc_asset_t*asset; - int*patch; - int patch_size; + int patch_pos; +}; +struct _asset_tag { + TAG*tag; + asset_dependency_t*deps; + int num_deps; }; struct _abc_asset { - TAG_list_t*tags; + asset_tag_list_t*tags; U16 id; - asset_dependency_list_t*dependencies; }; abc_method_t* abc_nullmethod(abc_file_t*file); diff --git a/lib/as3/assets.c b/lib/as3/assets.c index 3800bc8..8fbab47 100644 --- a/lib/as3/assets.c +++ b/lib/as3/assets.c @@ -3,43 +3,21 @@ #include "../rfxswf.h" #include "assets.h" -static void add_dependencies(asset_resolver_t*assets, abc_asset_t*asset, TAG*tag) +static void add_dependencies(asset_resolver_t*assets, abc_asset_t*asset, asset_tag_t*atag) { - int num = swf_GetNumUsedIDs(tag); - int*positions = malloc(sizeof(int)*num); + TAG*tag = atag->tag; + atag->num_deps = swf_GetNumUsedIDs(tag); + int*positions = malloc(sizeof(int)*atag->num_deps); + atag->deps = malloc(atag->num_deps*sizeof(atag->deps[0])); swf_GetUsedIDs(tag, positions); int t; - for(t=0;tnum_deps;t++) { + asset_dependency_t*d = &atag->deps[t]; + d->patch_pos = positions[t]; U16 id = GET16(&tag->data[positions[t]]); - - /* check whether we already processed this one */ - int s; - for(s=0;sdata[positions[s]])==id) break; //seen before - } - if(s!=t) continue; - - /* count number of occurences */ - int count=0; - for(s=t;sdata[positions[s]])==id) - count++; - } - - /* create dependency */ - NEW(asset_dependency_t,d); d->asset = assets->id2asset[id]; - d->patch = malloc(sizeof(int)*count); - d->patch_size = count; - count = 0; - for(s=t;sdata[positions[s]])==id) - d->patch[count++] = positions[s]; - } if(!d->asset) { fprintf(stderr, "Error: ID %d referenced, but not defined\n", id); - } else { - list_append(asset->dependencies, d); } } free(positions); @@ -55,7 +33,6 @@ asset_resolver_t* swf_ParseAssets(SWF*swf) while(tag) { if(swf_isDefiningTag(tag)) { NEW(abc_asset_t, asset); - list_append(asset->tags, tag); assets->id2asset[swf_GetDefineID(tag)] = asset; } tag = tag->next; @@ -66,12 +43,19 @@ asset_resolver_t* swf_ParseAssets(SWF*swf) if(swf_isDefiningTag(tag)) { abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; assert(asset); - add_dependencies(assets, asset, tag); + if(asset) { + NEW(asset_tag_t,t); + t->tag = tag; + list_append(asset->tags, t); + add_dependencies(assets, asset, t); + } } else if(swf_isPseudoDefiningTag(tag)) { abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; if(asset) { - list_append(asset->tags, tag); - add_dependencies(assets, asset, tag); + NEW(asset_tag_t,t); + t->tag = tag; + list_append(asset->tags, t); + add_dependencies(assets, asset, t); } } else if(tag->id == ST_SYMBOLCLASS) { int t, num = swf_GetU16(tag); @@ -114,19 +98,19 @@ void swf_ResolveAssets(asset_resolver_t*assets, abc_file_t*file) static void dump_asset(FILE*fo, abc_asset_t*a, const char*prefix) { - TAG_list_t*t = a->tags; + asset_tag_list_t*t = a->tags; while(t) { - TAG*tag = t->TAG; + TAG*tag = t->asset_tag->tag; fprintf(fo, "%s[tag] %s defines ID %d\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); + char*prefix2 = allocprintf("%s ", prefix); + int i; + for(i=0;iasset_tag->num_deps;i++) { + asset_dependency_t*d = &t->asset_tag->deps[i]; + dump_asset(fo, d->asset, prefix2); + } + free(prefix2); t = t->next; } - char*prefix2 = allocprintf("%s ", prefix); - asset_dependency_list_t*l = a->dependencies; - while(l) { - dump_asset(fo, l->asset_dependency->asset, prefix2); - l = l->next; - } - free(prefix2); } void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix) @@ -149,22 +133,18 @@ static TAG*write_asset(TAG*tag, abc_asset_t*a, dict_t*written, U16*currentid) if(!dict_contains(written, a)) { dict_put(written, a, 0); a->id = (*currentid)++; - TAG_list_t*tags = a->tags; - - asset_dependency_list_t*deps = a->dependencies; - while(deps) { - asset_dependency_t*dep = deps->asset_dependency; - tag = write_asset(tag, dep->asset, written, currentid); - int t; - for(t=0;tpatch_size;t++) { - PUT16(&tag->data[dep->patch[t]], dep->asset->id); - } - deps = deps->next; - } + asset_tag_list_t*tags = a->tags; while(tags) { - swf_SetDefineID(tags->TAG, a->id); - tag = write_tag(tag, tags->TAG); + asset_tag_t*t = tags->asset_tag; + int i; + for(i=0;inum_deps;i++) { + asset_dependency_t*dep = &t->deps[i]; + tag = write_asset(tag, dep->asset, written, currentid); + PUT16(&t->tag->data[dep->patch_pos], dep->asset->id); + } + swf_SetDefineID(t->tag, a->id); + tag = write_tag(tag, t->tag); tags = tags->next; } } @@ -187,7 +167,7 @@ void swf_WriteABCSymbols(TAG*tag, abc_file_t*file) abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); abc_asset_t*a = cls->asset; if(a && a->tags) { - U16 id = swf_GetDefineID(a->tags->TAG); + U16 id = swf_GetDefineID(a->tags->asset_tag->tag); char*fullname = abc_class_fullname(cls); swf_SetU16(tag, id); swf_SetString(tag, fullname); -- 1.7.10.4