decompile.c
来自「flash swf file player」· C语言 代码 · 共 1,406 行 · 第 1/3 页
C
1,406 行
/* put variable on left */ if(left->type == 's' || (right->type == 't' && right->data.tree->action == SWFACTION_GETVARIABLE)) { listItem(right, SWFACTION_LESSTHAN); if(negate == NEGATE) printf(" <= "); else printf(" > "); listItem(left, SWFACTION_LESSTHAN); } else { listItem(left, SWFACTION_LESSTHAN); if(negate == NEGATE) printf(" >= "); else printf(" < "); listItem(right, SWFACTION_LESSTHAN); }}static void listNot(Stack s, Action parent){ /* check for !<, !=, !! */ /* put variable on left */ if(s->type == 't') { Tree t = s->data.tree; if(t->action == SWFACTION_LESSTHAN) { listLessThan(s, NEGATE); return; } else if(t->action == SWFACTION_LOGICALNOT) { listItem(s->data.tree->left, parent); return; } else if(t->action == SWFACTION_EQUAL) { listItem(s->data.tree->left, SWFACTION_EQUAL); printf(" != "); listItem(s->data.tree->right, SWFACTION_EQUAL); return; } } printf("!"); listItem(s, SWFACTION_LOGICALNOT);}static void listAssign(Stack s){ /* check for ++a, a+=b */ Stack left = s->data.tree->left; Stack right = s->data.tree->right; if(right->type == 't' && right->data.tree->action >= SWFACTION_ADD && right->data.tree->action <= SWFACTION_DIVIDE) { Stack rleft = right->data.tree->left; Stack rright = right->data.tree->right; const char *op; if(right->data.tree->action == SWFACTION_ADD) op = " += "; else if(right->data.tree->action == SWFACTION_SUBTRACT) op = " -= "; else if(right->data.tree->action == SWFACTION_MULTIPLY) op = " -= "; else if(right->data.tree->action == SWFACTION_DIVIDE) op = " /= "; else error("Unexpected operation in listAssign!"); if(rleft->type == 't' && rleft->data.tree->action == SWFACTION_GETVARIABLE && rleft->data.tree->left->type == 's' && strcmp(rleft->data.tree->left->data.string, left->data.string) == 0) { if(rright->type == 's' && strcmp(rright->data.string, "1") == 0) { if(right->data.tree->action == SWFACTION_ADD) { printf("++"); listItem(left, SWFACTION_SETVARIABLE); return; } else if(right->data.tree->action == SWFACTION_SUBTRACT) { printf("--"); listItem(left, SWFACTION_SETVARIABLE); return; } } listItem(left, SWFACTION_SETVARIABLE); printf(op); listItem(rright, right->data.tree->action); return; } else if(rright->type == 't' && rright->data.tree->action == SWFACTION_GETVARIABLE && rright->data.tree->left->type == 's' && strcmp(rright->data.tree->left->data.string, left->data.string) == 0) { if(rleft->type == 's' && strcmp(rleft->data.string, "1") == 0) { if(right->data.tree->action == SWFACTION_ADD) { printf("++"); listItem(left, SWFACTION_SETVARIABLE); return; } else if(right->data.tree->action == SWFACTION_SUBTRACT) { printf("--"); listItem(left, SWFACTION_SETVARIABLE); return; } } listItem(left, SWFACTION_SETVARIABLE); printf(op); listItem(rleft, right->data.tree->action); return; } } listItem(left, SWFACTION_SETVARIABLE); printf(" = "); listItem(right, 0);}static void listArithmetic(Stack s, Action parent){ int isShort, parens = 0; const char *op; Tree t = s->data.tree; Stack left = t->left, right = t->right; /* leave out spaces around op if either side's just a constant or variable */ /* but not if op is divide and right side starts w/ '/' */ isShort = !(t->action == SWFACTION_DIVIDE && right->type == 't' && right->data.tree->action == SWFACTION_GETVARIABLE && right->data.tree->left->data.string[0] == '/') && (left->type == 's' || (left->type == 't' && left->data.tree->action == SWFACTION_GETVARIABLE) || right->type == 's' || (right->type == 't' && right->data.tree->action == SWFACTION_GETVARIABLE)); switch(t->action) { case SWFACTION_ADD: op = (isShort?"+":" + "); break; case SWFACTION_SUBTRACT: op = (isShort?"-":" - "); break; case SWFACTION_MULTIPLY: op = (isShort?"*":" * "); break; case SWFACTION_DIVIDE: op = (isShort?"/":" / "); break; case SWFACTION_EQUAL: op = " == "; break; case SWFACTION_LOGICALAND: op = " && "; break; case SWFACTION_LOGICALOR: op = " || "; break; case SWFACTION_STRINGEQ: op = " eq "; break; case SWFACTION_STRINGCONCAT: op = " & "; break; case SWFACTION_STRINGCOMPARE: op = " <=> "; break; default: op = " ??? "; break; } if(t->action == SWFACTION_MULTIPLY) { if(left->type == 's' && strcmp(left->data.string, "-1") == 0) { putchar('-'); listItem(right, SWFACTION_MULTIPLY); return; } else if(right->type == 's') { if(strcmp(right->data.string, "-1") == 0) { putchar('-'); listItem(left, SWFACTION_MULTIPLY); return; } else { /* put constant first: a*2 ==> 2*a */ Stack tmp = left; left = right; right = tmp; } } } /* parentesization rule */ parens = (precedence(parent) > precedence(t->action) || (t->action == SWFACTION_MULTIPLY && parent == SWFACTION_DIVIDE) || (t->action == SWFACTION_ADD && parent == SWFACTION_SUBTRACT)); if(parens) putchar('('); listItem(left, t->action); printf(op); listItem(right, t->action); if(parens) putchar(')');}static void listItem(Stack s, Action parent){ Tree t; if(s->type == 's') { if(parent == SWFACTION_GETVARIABLE || parent == SWFACTION_SETVARIABLE || parent == SWFACTION_GETPROPERTY || parent == SWFACTION_SETPROPERTY || parent == SWFACTION_DUPLICATECLIP || isNum(s->data.string)) printf(s->data.string); else { putchar('\''); printf(s->data.string); putchar('\''); } } else if(s->type == 'p') { listProperty(s->data.prop); } else if(s->type == 't') { t = s->data.tree; switch(t->action) { case SWFACTION_POP: /* ignore */ break; /* two args */ case SWFACTION_ADD: case SWFACTION_SUBTRACT: case SWFACTION_MULTIPLY: case SWFACTION_DIVIDE: case SWFACTION_EQUAL: case SWFACTION_LOGICALAND: case SWFACTION_LOGICALOR: case SWFACTION_STRINGEQ: case SWFACTION_STRINGCOMPARE: listArithmetic(s, parent); break; case SWFACTION_STRINGCONCAT: if(parent == SWFACTION_GETVARIABLE || parent == SWFACTION_GETPROPERTY) { printf("valueOf("); listArithmetic(s, parent); putchar(')'); } else listArithmetic(s, parent); break; case SWFACTION_SETVARIABLE: listAssign(s); break; case SWFACTION_LESSTHAN: listLessThan(s, NONEGATE); break; case SWFACTION_GETPROPERTY: if(t->left->type == 's' && t->left->data.string[0] == '\0') printf("this"); else listItem(t->left, SWFACTION_GETPROPERTY); putchar('.'); listItem(t->right, SWFACTION_GETPROPERTY); break; case SWFACTION_SETPROPERTY: if(t->left->type == 's' && t->left->data.string[0] == '\0') printf("this"); else listItem(t->left, SWFACTION_SETPROPERTY); putchar('.'); listItem(t->right, SWFACTION_SETPROPERTY); break; case SWFACTION_MBSUBSTRING: case SWFACTION_SUBSTRING: printf("substr("); listItem(t->left, t->action); printf(", "); listItem(t->right->data.tree->left, t->action); printf(", "); listItem(t->right->data.tree->right, t->action); putchar(')'); break; /* one-arg */ case SWFACTION_LOGICALNOT: listNot(t->left, SWFACTION_LOGICALNOT); break; case SWFACTION_STRINGLENGTH: printf("strlen("); listItem(t->left, SWFACTION_STRINGLENGTH); putchar(')'); break; case SWFACTION_INT: printf("int("); listItem(t->left, SWFACTION_INT); putchar(')'); break; case SWFACTION_RANDOM: printf("random("); listItem(t->left, SWFACTION_RANDOM); putchar(')'); break; case SWFACTION_MBLENGTH: printf("mbstrlen("); listItem(t->left, SWFACTION_MBLENGTH); putchar(')'); break; case SWFACTION_ORD: printf("ord("); listItem(t->left, SWFACTION_ORD); putchar(')'); break; case SWFACTION_CHR: printf("chr("); listItem(t->left, SWFACTION_CHR); putchar(')'); break; case SWFACTION_MBORD: printf("mbord("); listItem(t->left, SWFACTION_MBORD); putchar(')'); break; case SWFACTION_MBCHR: printf("mbchr("); listItem(t->left, SWFACTION_MBCHR); putchar(')'); break; case SWFACTION_GETVARIABLE: listItem(t->left, SWFACTION_GETVARIABLE); break; case SWFACTION_GETTIMER: printf("getTimer()"); break; /* statements */ case SWFACTION_DUPLICATECLIP: printf("duplicateClip("); listItem(t->left, SWFACTION_DUPLICATECLIP); printf(", "); listItem(t->right->data.tree->left, SWFACTION_DUPLICATECLIP); printf(", "); listItem(t->right->data.tree->right, SWFACTION_DUPLICATECLIP); putchar(')'); break; case SWFACTION_STARTDRAGMOVIE: printf("startDrag("); listItem(t->right->data.tree->right, SWFACTION_STARTDRAGMOVIE); printf(", "); listItem(t->right->data.tree->left, SWFACTION_STARTDRAGMOVIE); if(t->left->type == 't') { Tree root = t->left->data.tree; printf(", "); listItem(root->left->data.tree->left, SWFACTION_STARTDRAGMOVIE); printf(", "); listItem(root->right->data.tree->left, SWFACTION_STARTDRAGMOVIE); printf(", "); listItem(root->left->data.tree->right, SWFACTION_STARTDRAGMOVIE); printf(", "); listItem(root->right->data.tree->right, SWFACTION_STARTDRAGMOVIE); } putchar(')'); break; case SWFACTION_REMOVECLIP: printf("removeClip("); listItem(t->left, SWFACTION_REMOVECLIP); putchar(')'); break; case SWFACTION_TRACE: printf("trace("); listItem(t->left, SWFACTION_TRACE); putchar(')'); break; case SWFACTION_SETTARGETEXPRESSION: printf("setTarget("); listItem(t->left, SWFACTION_SETTARGETEXPRESSION); putchar(')'); break; case SWFACTION_STOPDRAGMOVIE: printf("stopDrag()"); break; case SWFACTION_NEXTFRAME: printf("nextFrame()"); break; case SWFACTION_PREVFRAME: printf("prevFrame()"); break; case SWFACTION_PLAY: printf("play()"); break; case SWFACTION_STOP: printf("stop()"); break; case SWFACTION_TOGGLEQUALITY: printf("toggleQuality()"); break; case SWFACTION_STOPSOUNDS: printf("stopSounds()"); break; case SWFACTION_GOTOFRAME: printf("gotoFrame(%i)", (int)t->left); break; case SWFACTION_GETURL: { printf("getURL('%s', '%s')", (char *)t->left, (char *)t->right); break; } case SWFACTION_WAITFORFRAMEEXPRESSION: printf("Wait For Frame Expression, skip %i", (int)t->left); break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?