X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fpool.c;h=e9376f3e4ecd3bce85c9c2621f18d1631db18fd7;hb=31dd301f5134bb3d10dadd7cc1751724d5165e10;hp=7aa34acae828cf9e5574c4168bee7052447fedfc;hpb=5c2aa0563fd6e2196b74e60945d2cb7549af80eb;p=swftools.git diff --git a/lib/as3/pool.c b/lib/as3/pool.c index 7aa34ac..e9376f3 100644 --- a/lib/as3/pool.c +++ b/lib/as3/pool.c @@ -172,7 +172,7 @@ char*escape_string(const char*str) return newstr; } -char* namespace_to_string(namespace_t*ns) +char* namespace_tostring(namespace_t*ns) { if(!ns) return strdup("NULL"); @@ -211,6 +211,7 @@ namespace_t* namespace_fromstring(const char*name) if(!strcmp(a, "")) access=0x16; else if(!strcmp(a, "undefined")) access=0x08; // public?? else if(!strcmp(a, "package")) access=0x16; + else if(!strcmp(a, "public")) access=0x16; else if(!strcmp(a, "packageinternal")) access=0x17; else if(!strcmp(a, "protected")) access=0x18; else if(!strcmp(a, "explicit")) access=0x19; @@ -335,7 +336,7 @@ namespace_set_t* namespace_set_new() set->namespaces = list_new(); return set; } -char* namespace_set_to_string(namespace_set_t*set) +char* namespace_set_tostring(namespace_set_t*set) { if(!set) return strdup("NULL"); @@ -348,7 +349,7 @@ char* namespace_set_to_string(namespace_set_t*set) int l = 0; namespace_list_t*lns = set->namespaces; while(lns) { - char*s = namespace_to_string(lns->namespace); + char*s = namespace_tostring(lns->namespace); l += strlen(s)+1; free(s); lns = lns->next; @@ -357,7 +358,7 @@ char* namespace_set_to_string(namespace_set_t*set) strcpy(desc, "{"); lns = set->namespaces; while(lns) { - char*s = namespace_to_string(lns->namespace); + char*s = namespace_tostring(lns->namespace); strcat(desc, s); free(s); lns = lns->next; @@ -444,7 +445,11 @@ multiname_t* multiname_new(namespace_t*ns, const char*name) { NEW(multiname_t,m); m->type = QNAME; - m->ns = namespace_clone(ns); + if(!ns) { + m->ns = namespace_new_packageinternal(""); + } else { + m->ns = namespace_clone(ns); + } m->name = strdup(name); return m; } @@ -468,7 +473,7 @@ multiname_t* multiname_clone(multiname_t*other) char* access2str(int type) { if(type==0x08) return "access08"; - else if(type==0x16) return "package"; + else if(type==0x16) return "public"; else if(type==0x17) return "packageinternal"; else if(type==0x18) return "protected"; else if(type==0x19) return "explicit"; @@ -497,7 +502,7 @@ char multiname_late_name(multiname_t*m) m->type==MULTINAMEL || m->type==MULTINAMELA; } -char* multiname_to_string(multiname_t*m) +char* multiname_tostring(multiname_t*m) { char*mname = 0; if(!m) @@ -533,7 +538,7 @@ char* multiname_to_string(multiname_t*m) } else if(m->type==RTQNAMELA) { mname = strdup(""); } else if(m->type==MULTINAME || m->type==MULTINAMEA) { - char*s = namespace_set_to_string(m->namespace_set); + char*s = namespace_set_tostring(m->namespace_set); mname = malloc(strlen(s)+namelen+16); if(m->type == MULTINAME) strcpy(mname,""); @@ -544,7 +549,7 @@ char* multiname_to_string(multiname_t*m) strcat(mname, name); free(s); } else if(m->type==MULTINAMEL || m->type==MULTINAMELA) { - char*s = namespace_set_to_string(m->namespace_set); + char*s = namespace_set_tostring(m->namespace_set); mname = malloc(strlen(s)+16); if(m->type == MULTINAMEL) strcpy(mname,""); @@ -695,15 +700,15 @@ constant_t* constant_fromindex(pool_t*pool, int index, int type) NEW(constant_t,c); c->type = type; if(NS_TYPE(c->type)) { - c->ns = pool_lookup_namespace(pool, index); + c->ns = namespace_clone(pool_lookup_namespace(pool, index)); } else if(c->type == CONSTANT_INT) { - c->i = pool_lookup_int(pool, index); + c->i = pool_lookup_int(pool, index); } else if(c->type == CONSTANT_UINT) { - c->u = pool_lookup_uint(pool, index); + c->u = pool_lookup_uint(pool, index); } else if(c->type == CONSTANT_FLOAT) { - c->f = pool_lookup_float(pool, index); + c->f = pool_lookup_float(pool, index); } else if(c->type == CONSTANT_STRING) { - c->s = pool_lookup_string(pool, index); + c->s = strdup(pool_lookup_string(pool, index)); } else if(UNIQUE_CONSTANT(c->type)) { // ok } else { @@ -711,13 +716,13 @@ constant_t* constant_fromindex(pool_t*pool, int index, int type) } return c; } -char* constant_to_string(constant_t*c) +char* constant_tostring(constant_t*c) { if(!c) return 0; char buf[30]; if(NS_TYPE(c->type)) { - return namespace_to_string(c->ns); + return namespace_tostring(c->ns); } else if(c->type == CONSTANT_INT) { sprintf(buf, "%d", c->i); return strdup(buf); @@ -754,6 +759,9 @@ int constant_get_index(pool_t*pool, constant_t*c) return 0; if(NS_TYPE(c->type)) { assert(c->ns); + /*if(c->type!=c->ns->access) { + printf("%02x<->%02x\n", c->type, c->ns->access); + }*/ assert(c->type == c->ns->access); return pool_register_namespace(pool, c->ns); } else if(c->type == CONSTANT_INT) { @@ -877,7 +885,7 @@ int pool_find_namespace(pool_t*pool, namespace_t*ns) return 0; int i = array_find(pool->x_namespaces, ns); if(i<=0) { - char*s = namespace_to_string(ns); + char*s = namespace_tostring(ns); fprintf(stderr, "Couldn't find namespace \"%s\" %08x in constant pool\n", s, ns); free(s); return 0; @@ -890,7 +898,7 @@ int pool_find_namespace_set(pool_t*pool, namespace_set_t*set) return 0; int i = array_find(pool->x_namespace_sets, set); if(i<=0) { - char*s = namespace_set_to_string(set); + char*s = namespace_set_tostring(set); fprintf(stderr, "Couldn't find namespace_set \"%s\" in constant pool\n", s); free(s); return 0; @@ -914,7 +922,7 @@ int pool_find_multiname(pool_t*pool, multiname_t*name) return 0; int i = array_find(pool->x_multinames, name); if(i<=0) { - char*s = multiname_to_string(name); + char*s = multiname_tostring(name); fprintf(stderr, "Couldn't find multiname \"%s\" in constant pool\n", s); free(s); return 0; @@ -987,7 +995,7 @@ void pool_read(pool_t*pool, TAG*tag) DEBUG printf("%d ints\n", num_ints); int t; for(t=1;tx_ints, &v, 0); } @@ -995,7 +1003,7 @@ void pool_read(pool_t*pool, TAG*tag) int num_uints = swf_GetU30(tag); DEBUG printf("%d uints\n", num_uints); for(t=1;tx_uints, &v, 0); } @@ -1029,7 +1037,7 @@ void pool_read(pool_t*pool, TAG*tag) name = array_getkey(pool->x_strings, namenr); namespace_t*ns = namespace_new(type, name); array_append(pool->x_namespaces, ns, 0); - DEBUG printf("%d) %02x \"%s\"\n", t, type, namespace_to_string(ns)); + DEBUG printf("%d) %02x \"%s\"\n", t, type, namespace_tostring(ns)); namespace_destroy(ns); } int num_sets = swf_GetU30(tag); @@ -1047,7 +1055,7 @@ void pool_read(pool_t*pool, TAG*tag) list_append(nsset->namespaces, namespace_clone(ns)); } array_append(pool->x_namespace_sets, nsset, 0); - DEBUG printf("set %d) %s\n", t, namespace_set_to_string(nsset)); + DEBUG printf("set %d) %s\n", t, namespace_set_tostring(nsset)); namespace_set_destroy(nsset); } @@ -1080,7 +1088,7 @@ void pool_read(pool_t*pool, TAG*tag) } else { printf("can't parse type %d multinames yet\n", m.type); } - DEBUG printf("multiname %d) %s\n", t, multiname_to_string(&m)); + DEBUG printf("multiname %d) %s\n", t, multiname_tostring(&m)); array_append(pool->x_multinames, &m, 0); } } @@ -1129,11 +1137,11 @@ void pool_write(pool_t*pool, TAG*tag) swf_SetU30(tag, pool->x_ints->num>1?pool->x_ints->num:0); for(t=1;tx_ints->num;t++) { S32 val = *(int*)array_getkey(pool->x_ints, t); - swf_SetS30(tag, val); + swf_SetABCS32(tag, val); } swf_SetU30(tag, pool->x_uints->num>1?pool->x_uints->num:0); for(t=1;tx_uints->num;t++) { - swf_SetU30(tag, *(unsigned int*)array_getkey(pool->x_uints, t)); + swf_SetABCU32(tag, *(unsigned int*)array_getkey(pool->x_uints, t)); } swf_SetU30(tag, pool->x_floats->num>1?pool->x_floats->num:0); for(t=1;tx_floats->num;t++) {