u: url (string)
t: target (string)
l: label (string)
-C: constant pool header (byte)
+C: constant pool header (word)
c: constant pool entry (string)
s: skip (byte) (number of actions)
m: method (byte) swf_GetUrl2:(0=none, 1=get, 2=post)/GotoFrame2:(1=play)
U8*data;
while(op)
{
- action->next = (ActionTAG*)malloc(sizeof(ActionTAG));
- memset(action->next, 0, sizeof(ActionTAG));
+ action->next = (ActionTAG*)rfx_calloc(sizeof(ActionTAG));
action->next->prev = action;
action->next->next = 0;
action->next->parent = tmp.next;
length = swf_GetU16(tag);
if(length) {
- data = malloc(length);
+ data = rfx_alloc(length);
swf_GetBlock(tag, data, length);
} else {
data = 0;
while(action)
{
ActionTAG*tmp;
- if(action->data && action->data != action->tmp)
- free(action->data);
+ if(action->data && action->data != action->tmp) {
+ rfx_free(action->data);
+ action->data = 0;
+ }
+ action->len = 0;
tmp = action;
action=action->next;
- free(tmp);
+ rfx_free(tmp);
}
}
return 1+4; //float
} else if (type == 2) {
return 1+0; //NULL
+ } else if (type == 3) {
+ return 1+0; //Undefined
} else if (type == 4) {
return 1+1; //register
} else if (type == 5) {
return 1+4; //int
} else if (type == 8) {
return 1+1; //lookup
+ } else if (type == 9) {
+ return 1+2; //lookup 16
} else return 1;
break;
}
while(atag)
{
char*indent = &spaces[sizeof(spaces)-1-countpos*4];
- U8 poollen = 0;
+ U16 poollen = 0;
for(t=0;t<definedactions;t++)
if(actions[t].op == atag->op)
break;
#endif
} break;
case 'C': {
- poollen = *data;
+ poollen = data[0]+256*data[1];
entry = 0;
printf("(%d entries)", poollen);
} break;
num = (data[s++]); //num
num += (data[s++])*256;
for(t=0;t<num;t++) {
- printf("%s",data);
+ printf("%s",data+s); // 10/22/04 MD: added +s to
if(t<num-1)
printf(", ");
while(data[s++]); //param
printf(" Float:%f", *(float*)&f);
} else if (type == 2) {
printf(" NULL");
+ } else if (type == 3) {
+ printf(" Undefined");
} else if (type == 4) {
printf(" register:%d", *value);
} else if (type == 5) {
if (lookup[*value])
printf(" (\"%s\")",lookup[*value]);
#endif
+ } else if (type == 9) {
+ U32 offset = value[0]+(value[1]<<8);
+ printf(" Lookup16:%d", offset);
+#ifdef MAX_LOOKUP
+ if (lookup[offset])
+ printf(" (\"%s\")",lookup[offset]);
+#endif
} else {
printf(" UNKNOWN[%02x]",type);
}
}
#ifdef MAX_LOOKUP
- for (t=0;t<MAX_LOOKUP;t++) if (lookup[t]) free(lookup[t]);
+ for (t=0;t<MAX_LOOKUP;t++) if (lookup[t]) rfx_free(lookup[t]);
#endif
}
int count = 0;
while(atag)
{
- U8 poollen = 0;
+ U16 poollen = 0;
for(t=0;t<definedactions;t++)
if(actions[t].op == atag->op)
break;
}
} break;
case 'C': {
- poollen = (*data);
+ poollen = (data[0]+256*data[1]);
} break;
case 'o': {
} break;
if(replacement)
{
int newlen = strlen(replacement);
- char * newdata = malloc(atag->len - replacelen + newlen);
+ char * newdata = rfx_alloc(atag->len - replacelen + newlen);
int rpos = replacepos - atag->data;
memcpy(newdata, atag->data, rpos);
memcpy(&newdata[rpos], replacement, newlen);
memcpy(&newdata[rpos+newlen], &replacepos[replacelen],
&data[atag->len] - &replacepos[replacelen]);
- free(atag->data);
+ rfx_free(atag->data);
atag->data = newdata;
data = &atag->data[rpos+newlen+1];
}
/*static ActionTAG* swf_ActionStart()
{
ActionTAG*atag;
- atag = (ActionTAG*)malloc(sizeof(ActionTAG));
+ atag = (ActionTAG*)rfx_alloc(sizeof(ActionTAG));
atag->prev = 0;
atag->next = 0;
atag->parent = 0;
}
last->prev->next = 0;
- free(last);
+ rfx_free(last);
}*/
static ActionTAG*lastATAG(ActionTAG*atag)
ActionTAG* swf_AddActionTAG(ActionTAG*atag, U8 op, U8*data, U16 len)
{
ActionTAG*tmp;
- tmp = (ActionTAG*)malloc(sizeof(ActionTAG));
+ tmp = (ActionTAG*)rfx_alloc(sizeof(ActionTAG));
tmp->next = 0;
if(atag) {
tmp->prev = atag;
tmp->prev = 0;
tmp->parent = tmp;
}
- if(data || !len)
+ if(data || !len) {
tmp->data = data;
- else
+ } else {
tmp->data = tmp->tmp;
+ }
tmp->len = len;
tmp->op = op;
*(U8*)atag->tmp = 2; //NULL
return atag;
}
+ActionTAG* action_PushUndefined(ActionTAG*atag)
+{
+ atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 1);
+ *(U8*)atag->tmp = 3; //Undefined
+ return atag;
+}
ActionTAG* action_PushBoolean(ActionTAG*atag, char c)
{
atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2);
*(U8*)&atag->tmp[1] = index;
return atag;
}
+ActionTAG* action_PushLookup16(ActionTAG*atag, U16 index)
+{
+ atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 3);
+ *(U8*)atag->tmp = 9; //lookup
+ *(U8*)&atag->tmp[1] = index;
+ *(U8*)&atag->tmp[2] = index>>8;
+ return atag;
+}
ActionTAG* action_PushString(ActionTAG*atag, char*str)
{
int l = strlen(str);
- char*ptr = (char*)malloc(l+2);
+ char*ptr = (char*)rfx_alloc(l+2);
ptr[0] = 0; // string
strcpy(&ptr[1], str);
return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, l+2);
}
ActionTAG* action_PushFloat(ActionTAG*atag, float f)
{
- char*ptr = (char*)malloc(5);
+ char*ptr = (char*)rfx_alloc(5);
U32 fd = *(U32*)&f;
ptr[0] = 1; //float
ptr[1] = fd;
}
ActionTAG* action_PushDouble(ActionTAG*atag, double d)
{
- char*ptr = (char*)malloc(9);
+ char*ptr = (char*)rfx_alloc(9);
U8*dd = (U8*)&d;
ptr[0] = 6; //double
#ifdef WORDS_BIGENDIAN
ActionTAG* action_PushInt(ActionTAG*atag, int i)
{
atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 5);
- *(U8*)atag->tmp = 7; //int
+ atag->tmp[0] = 7; //int
atag->tmp[1] = i;
atag->tmp[2] = i>>8;
atag->tmp[3] = i>>16;
{
int l1= strlen(url);
int l2= strlen(label);
- char*ptr = malloc(l1+l2+2);
+ char*ptr = rfx_alloc(l1+l2+2);
strcpy(ptr, url);
strcpy(&ptr[l1+1], label);
return swf_AddActionTAG(atag, ACTION_GETURL, ptr, l1+l2+2);
swf_SetBlock(tag, buffer, len);
swf_SetU8(tag, 0);
- free(buffer);
+ rfx_free(buffer);
a = swf_ActionGet(tag);
swf_DeleteTag(tag);