};
static int definedactions = sizeof(actions)/sizeof(struct Action);
-ActionTAG* swf_GetActions(TAG*tag)
+ActionTAG* swf_ActionGet(TAG*tag)
{
U8 op = 1;
int length;
length = swf_GetU16(tag);
if(length) {
- int t;
data = malloc(length);
- for(t=0;t<length;t++)
- data[t] = swf_GetU8(tag);
+ swf_GetBlock(tag, data, length);
} else {
data = 0;
}
return tmp.next;
}
-void swf_SetActions(TAG*tag, ActionTAG*action)
+void swf_ActionFree(ActionTAG*action)
+{
+ while(action)
+ {
+ ActionTAG*tmp;
+ if(action->data && action->data != action->tmp)
+ free(action->data);
+ tmp = action;
+ action=action->next;
+ free(tmp);
+ }
+}
+
+void swf_ActionSet(TAG*tag, ActionTAG*action)
{
while(action)
{
if(type == 0) {
printf(" String:\"%s\"", value);
} else if (type == 1) {
- printf(" Float:\"%f\"", *(float*)value);
+ printf(" Float:%f", *(float*)value);
} else if (type == 2) {
printf(" NULL");
} else if (type == 4) {
printf(" register:%d", *value);
} else if (type == 5) {
- printf(" %s", *value?"true":"false");
+ printf(" bool:%s", *value?"true":"false");
} else if (type == 6) {
- printf(" %f", *(double*)value);
+ printf(" float:%f", *(double*)value);
} else if (type == 7) {
- printf(" %d", *(int*)value);
+ printf(" int:%d", *(int*)value);
} else if (type == 8) {
printf(" Lookup:%d", *value);
+ } else {
+ printf(" UNKNOWN[%02x]",type);
}
} break;
}
data += OpAdvance(*cp, data);
- if(*cp!='c' || !poollen)
+ if((*cp!='c' || !poollen) &&
+ (*cp!='p' || !(data<&atag->data[atag->len])))
cp++;
if(poollen)
poollen--;
{
int nl = ((atag->data+atag->len)-data);
int t;
- printf(" remainder of %d bytes:\"", nl);
+ printf(" (remainder of %d bytes:\"", nl);
for(t=0;t<nl;t++) {
if(data[t]<32)
printf("\\%d",data[t]);
else
printf("%c", data[t]);
}
- printf("\"");
+ printf("\")");
}
printf("\n");
atag = atag->next;
currentatag = currentatag->next;
}
+ActionMarker action_setMarker()
+{
+ ActionMarker m;
+ m.atag = currentatag;
+ return m;
+}
+
+int inline ActionTagSize(ActionTAG*atag)
+{
+ return (atag->op&0x80)?3+(atag->len):1+0;
+}
+
+
#define ACTION_END 0x00
#define ACTION_NEXTFRAME 0x04
#define ACTION_PREVIOUSFRAME 0x05
#define ACTION_CALL 0x9e
#define ACTION_GOTOFRAME2 0x9f
+void action_fixjump(ActionMarker m1, ActionMarker m2)
+{
+ ActionTAG* a1 = m1.atag;
+ ActionTAG* a2 = m2.atag;
+ ActionTAG* a;
+ int len = 0;
+ int oplen = 0;
+ a = a1;
+
+ a = a->next; //first one is free
+ while(a && a!=a2)
+ {
+ len += ActionTagSize(a);
+ oplen ++;
+ a = a->next;
+ }
+ if(!a)
+ { len = 0;
+ oplen = 0;
+ a = a2;
+ while(a && a!=a1) {
+ len -= ActionTagSize(a);
+ oplen --;
+ a = a->next;
+ }
+ if(!a) {
+ fprintf(stderr, "action_fixjump: couldn't find second tag\n");
+ return;
+ }
+ len -= ActionTagSize(a);
+ oplen --;
+ }
+
+ if (a1->op == ACTION_IF || a1->op == ACTION_JUMP)
+ {
+ *(U16*)(a1->data) = len;
+ }
+ else if(a1->op == ACTION_WAITFORFRAME)
+ {
+ ((U8*)(a1->data))[2] = oplen;
+ }
+ else if(a1->op == ACTION_WAITFORFRAME2)
+ {
+ ((U8*)(a1->data))[0] = oplen;
+ }
+
+}
+
+
void action_NextFrame() {swf_AddActionTAG(ACTION_NEXTFRAME, 0, 0);}
void action_PreviousFrame() {swf_AddActionTAG(ACTION_PREVIOUSFRAME, 0, 0);}
void action_Play() {swf_AddActionTAG(ACTION_PLAY, 0, 0);}
void action_PushInt(int i)
{
*(U8*)currentatag->tmp = 7; //int
- *(U8*)¤tatag->tmp[1] = i;
+ *(U32*)¤tatag->tmp[1] = i;
swf_AddActionTAG(ACTION_PUSH, (U8*)currentatag->tmp, 5);
}
void action_GotoLabel(char* label)
int l2= strlen(label);
char*ptr = malloc(l1+l2+2);
strcpy(ptr, url);
- strcat(&ptr[l2+1], label);
- swf_AddActionTAG(ACTION_GETURL, ptr, strlen(ptr));
+ strcpy(&ptr[l1+1], label);
+ swf_AddActionTAG(ACTION_GETURL, ptr, l1+l2+2);
}
//TODO:
void action_DefineFunction(U8*data, int len) {}
void action_Constantpool(char* constantpool) {}
void action_With(char*object) {}
+
+/*
+ Properties:
+
+ _X 0
+ _Y 1
+ _xscale 2
+ _yscale 3
+ _currentframe 4
+ _totalframes 5
+ _alpha 6
+ _visible 7
+ _width 8
+ _height 9
+ _rotation 10
+ _target 11
+ _framesloaded 12
+ _name 13
+ _droptarget 14
+ _url 15
+ _highquality 16
+ _focusrect 17
+ _soundbuftime 18
+ _quality* 19
+ _xmouse* 20
+ _ymouse* 21
+*/