int j = swf_GetS24(tag);
data = (void*)(ptroff_t)j;
} else if(*p == 's') { // string
- data = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag)));
+ string_t s = pool_lookup_string2(pool, swf_GetU30(tag));
+ data = string_dup3(&s);
} else if(*p == 'D') { // debug
/*type, usually 1*/
U8 type = swf_GetU8(tag);
skip = (c->branch->pos) - c->pos - 4;
len += swf_SetS24(tag, skip);
} else if(*p == 's') { // string
- int index = pool_register_string(pool, data);
+ int index = pool_register_string2(pool, (string_t*)data);
len += swf_SetU30(tag, index);
} else if(*p == 'D') { // debug statement
if(tag)
else
fprintf(fo, "%08x", c->branch);
} else if(*p == 's') {
- fprintf(fo, "\"%s\"", data);
+ char*s = string_escape((string_t*)data);
+ fprintf(fo, "\"%s\"", s);
+ free(s);
} else if(*p == 'D') {
fprintf(fo, "[register %02x=%s]", (ptroff_t)c->data[1], (char*)c->data[0]);
} else if(*p == 'S') {
lookupswitch_t*lookupswitch_dup(lookupswitch_t*l)
{
lookupswitch_t*n = malloc(sizeof(lookupswitch_t));
- fprintf(stderr, "lookupswitch dupping not supported yet\n");
+ fprintf(stderr, "Error: lookupswitch dupping not supported yet\n");
n->targets = list_clone(l->targets);
return 0;
}
code_t*code_dup(code_t*c)
{
- /* misses branch relocation */
- fprintf(stderr, "dupping not supported yet\n");
- return 0;
if(!c) return 0;
while(c->prev) c = c->prev;
memcpy(n, c, sizeof(code_t));
opcode_t*op = opcode_get(c->opcode);
+ if(c->branch) {
+ fprintf(stderr, "Error: Can't duplicate branching code\n");
+ return 0;
+ }
char*p = op?op->params:"";
int pos=0;
while(*p) {
if(*p == '2') { //multiname
c->data[pos] = multiname_clone(c->data[pos]);
- } else if(*p == 's' || *p == 'D') {
+ } else if(*p == 's') {
+ c->data[pos] = string_dup3(c->data[pos]);
+ } else if(*p == 'D') {
c->data[pos] = strdup(c->data[pos]);
} else if(*p == 'f') {
double old = *(double*)c->data[pos];
code_t*code_cutlast(code_t*c)
{
+ if(!c) return c;
assert(!c->next);
code_t*prev = c->prev;
c->prev = 0;
- prev->next=0;
+ if(prev)
+ prev->next=0;
code_free(c);
return prev;
}