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 + -
显示快捷键?