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)
while(op)
{
action->next = (ActionTAG*)malloc(sizeof(ActionTAG));
+ memset(action->next, 0, sizeof(ActionTAG));
action->next->prev = action;
action->next->next = 0;
+ action->next->parent = tmp.next;
action = action->next;
op = swf_GetU8(tag);
void swf_ActionFree(ActionTAG*action)
{
+ if(!action) {
+ fprintf(stderr, "Warning: freeing zero action");
+ return;
+ }
+ action = action->parent;
+ if(!action) {
+ fprintf(stderr, "Warning: freeing zero action (no parent)");
+ return;
+ }
+
while(action)
{
ActionTAG*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 = *(U16*)data;
entry = 0;
printf("(%d entries)", poollen);
} break;
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);
}
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 = (*(U16*)data);
} break;
case 'o': {
} break;
*(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);
ActionTAG* action_Constantpool(ActionTAG*atag, char* constantpool) {return atag;}
ActionTAG* action_With(ActionTAG*atag, char*object) {return atag;}
+#include "../action/actioncompiler.h"
+
+ActionTAG* swf_ActionCompile(const char* source, int version)
+{
+ TAG* tag;
+ ActionTAG* a = 0;
+ void*buffer = 0;
+ int len = 0;
+ int ret;
+
+ tag = swf_InsertTag(NULL, ST_DOACTION);
+ ret = compileSWFActionCode(source, version, &buffer, &len);
+ if(!ret || buffer==0 || len == 0)
+ return 0;
+
+ swf_SetBlock(tag, buffer, len);
+ swf_SetU8(tag, 0);
+
+ free(buffer);
+
+ a = swf_ActionGet(tag);
+ swf_DeleteTag(tag);
+ return a;
+}
+
+
/*
Properties: