⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compile.c

📁 flash swf file player
💻 C
📖 第 1 页 / 共 2 页
字号:
int bufferWriteInt(Buffer out, int i){	int len = 0;	unsigned char *p = (unsigned char *)&i;	if(out->pushloc == NULL || SWF_versionNum < 5)	{		len = 3;		bufferWritePushOp(out);		bufferWriteS16(out, 5);	}	else		bufferPatchPushLength(out, 5);	bufferWriteU8(out, PUSH_INT);	if(byteorder == SWF_LITTLE_ENDIAN)	{		bufferWriteU8(out, p[0]);		bufferWriteU8(out, p[1]);		bufferWriteU8(out, p[2]);		bufferWriteU8(out, p[3]);	}	else	{		bufferWriteU8(out, p[3]);		bufferWriteU8(out, p[2]);		bufferWriteU8(out, p[1]);		bufferWriteU8(out, p[0]);	}	return len + 5;}int bufferWriteDouble(Buffer out, double d){	int len = 0;	unsigned char *p = (unsigned char *)&d;	if(out->pushloc == NULL || SWF_versionNum < 5)	{		len = 3;		bufferWritePushOp(out);		bufferWriteS16(out, 9);	}	else		bufferPatchPushLength(out, 5);	bufferWriteU8(out, PUSH_DOUBLE);	if(byteorder == SWF_LITTLE_ENDIAN)	{		bufferWriteU8(out, p[4]);		bufferWriteU8(out, p[5]);		bufferWriteU8(out, p[6]);		bufferWriteU8(out, p[7]);		bufferWriteU8(out, p[0]);		bufferWriteU8(out, p[1]);		bufferWriteU8(out, p[2]);		bufferWriteU8(out, p[3]);	}	else	{		bufferWriteU8(out, p[3]);		bufferWriteU8(out, p[2]);		bufferWriteU8(out, p[1]);		bufferWriteU8(out, p[0]);		bufferWriteU8(out, p[7]);		bufferWriteU8(out, p[6]);		bufferWriteU8(out, p[5]);		bufferWriteU8(out, p[4]);	}	return len + 9;}int bufferWriteNull(Buffer out){	int len = 0;	if(out->pushloc == NULL || SWF_versionNum < 5)	{		len = 3;		bufferWritePushOp(out);		bufferWriteS16(out, 1);	}	else		bufferPatchPushLength(out, 1);	bufferWriteU8(out, PUSH_NULL);	return len + 1;}int bufferWriteBoolean(Buffer out, int val){	int len = 0;	if(out->pushloc == NULL || SWF_versionNum < 5)	{		len = 3;		bufferWritePushOp(out);		bufferWriteS16(out, 2);	}	else		bufferPatchPushLength(out, 2);	bufferWriteU8(out, PUSH_BOOLEAN);	bufferWriteU8(out, val ? 1 : 0);	return len + 2;}int bufferWriteRegister(Buffer out, int num){	int len = 0;	if(out->pushloc == NULL || SWF_versionNum < 5)	{		len = 3;		bufferWritePushOp(out);		bufferWriteS16(out, 2);	}	else		bufferPatchPushLength(out, 2);	bufferWriteU8(out, PUSH_REGISTER);	bufferWriteU8(out, num);	return len + 2;}int bufferWriteSetRegister(Buffer out, int num){	bufferWriteU8(out, SWFACTION_SETREGISTER);	bufferWriteS16(out, 1);	bufferWriteU8(out, num);	return 4;}void lower(char *s){	while(*s)	{		*s = tolower(*s);		++s;	}}/* this code will eventually help to pop extra values off the stack and make sure that continue and break address the proper context */static enum ctx *ctx_stack = {0};static int ctx_count = {0}, ctx_len = {0};void addctx(enum ctx val){	if(ctx_count >= ctx_len)		ctx_stack = (enum ctx*) realloc(ctx_stack, (ctx_len += 10) * sizeof(enum ctx));	ctx_stack[ctx_count++] = val;}void delctx(enum ctx val){	if(ctx_count <= 0 || ctx_stack[--ctx_count] != val)		SWF_error("consistency check in delctx");}int chkctx(enum ctx val){	int n, ret = 0;	switch(val)	{	case CTX_FUNCTION:			for(n = ctx_count ; --n >= 0 ; )				switch(ctx_stack[n])				{	case CTX_SWITCH:					case CTX_FOR_IN:						ret++;						break;					case CTX_FUNCTION:						return ret;					default: ; /* computers are stupid */				}			return -1;		case CTX_BREAK:			for(n = ctx_count ; --n >= 0 ; )				switch(ctx_stack[n])				{	case CTX_SWITCH:					case CTX_LOOP:						return 0;					case CTX_FOR_IN:						return 1;					case CTX_FUNCTION:						return -1;					default: ; /* computers are stupid */				}		case CTX_CONTINUE:			for(n = ctx_count ; --n >= 0 ; )				switch(ctx_stack[n])				{	case CTX_LOOP:					case CTX_FOR_IN:						return 0;					case CTX_FUNCTION:						return -1;					default: ; /* computers are stupid */				}		default: ; /* computers are stupid */	}	return 0;}/* replace MAGIC_CONTINUE_NUMBER and MAGIC_BREAK_NUMBER with jumps to	 head or tail, respectively *//* jump offset is relative to end of jump instruction *//* I can't believe this actually worked */void bufferResolveJumps(Buffer out){	byte *p = out->buffer;	int l, target;	while(p < out->pos)	{		if(*p & 0x80) /* then it's a multibyte instruction */		{			if(*p == SWFACTION_BRANCHALWAYS)			{	p += 3; /* plus instruction plus two-byte length */	if(*p == MAGIC_CONTINUE_NUMBER_LO &&		 *(p+1) == MAGIC_CONTINUE_NUMBER_HI)	{		target = out->buffer - (p+2);		*p = target & 0xff;		*(p+1) = (target>>8) & 0xff;	}	else if(*p == MAGIC_BREAK_NUMBER_LO &&		*(p+1) == MAGIC_BREAK_NUMBER_HI)	{		target = out->pos - (p+2);		*p = target & 0xff;		*(p+1) = (target>>8) & 0xff;	}	p += 2;			}			else			{	++p;	l = *p;	++p;	l += *p<<8;	++p;	p += l;			}		}		else			++p;	}}// handle SWITCH statementvoid bufferResolveSwitch(Buffer buffer, struct switchcases *slp){	struct switchcase *scp;	int n, len;	unsigned char *output;				len = bufferLength(buffer);	for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++)	{	scp->actlen = bufferLength(scp->action);		if((n < slp->count-1))			scp->actlen += 5;		if(scp->cond)		{	scp->condlen = bufferLength(scp->cond) + 8;			bufferWriteOp(buffer, SWFACTION_DUP);			bufferConcat(buffer, scp->cond);			bufferWriteOp(buffer, SWFACTION_NEWEQUALS);			bufferWriteOp(buffer, SWFACTION_LOGICALNOT);			bufferWriteOp(buffer, SWFACTION_BRANCHIFTRUE);			bufferWriteS16(buffer, 2);			bufferWriteS16(buffer, scp->actlen);		}		else			scp->condlen = 0;		bufferConcat(buffer, scp->action);		bufferWriteOp(buffer, SWFACTION_BRANCHALWAYS);		bufferWriteS16(buffer, 2);		bufferWriteS16(buffer, scp->isbreak ? MAGIC_BREAK_NUMBER : 0);		if(!scp->cond)		{	slp->count = n+1;			break;		}	}	for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++)	{	len += scp->condlen;		output = buffer->buffer + len;		if((n < slp->count-1) && !scp->isbreak)		{	output[scp->actlen-2] = (scp+1)->condlen & 0xff;			output[scp->actlen-1] = (scp+1)->condlen >> 8;		}		len += scp->actlen;	}}	int lookupSetProperty(char *string){	lower(string);	if(strcmp(string,"x")==0)		return 0x0000;	if(strcmp(string,"y")==0)		return 0x3f80;	if(strcmp(string,"xscale")==0)	return 0x4000;	if(strcmp(string,"yscale")==0)	return 0x4040;	if(strcmp(string,"alpha")==0)		return 0x40c0;	if(strcmp(string,"visible")==0)	return 0x40e0;	if(strcmp(string,"rotation")==0)	return 0x4120;	if(strcmp(string,"name")==0)		return 0x4140;	if(strcmp(string,"quality")==0)	return 0x4180;	if(strcmp(string,"focusrect")==0)	return 0x4188;	if(strcmp(string,"soundbuftime")==0)	return 0x4190;	SWF_error("No such property: %s\n", string);	return -1;}int bufferWriteSetProperty(Buffer out, char *string){	int property = lookupSetProperty(string);	bufferWriteU8(out, SWFACTION_PUSHDATA);	bufferWriteS16(out, 5);	bufferWriteU8(out, PUSH_PROPERTY);	bufferWriteS16(out, 0);	bufferWriteS16(out, property);	return 8;}int bufferWriteWTHITProperty(Buffer out){	bufferWriteU8(out, SWFACTION_PUSHDATA);	bufferWriteS16(out, 5);	bufferWriteU8(out, PUSH_PROPERTY);	bufferWriteS16(out, 0);	bufferWriteS16(out, 0x4680);	return 8;}const char *lookupGetProperty(char *string){	lower(string);	if(strcmp(string,"x")==0)		return "0";	if(strcmp(string,"y")==0)		return "1";	if(strcmp(string,"xscale")==0)	return "2";	if(strcmp(string,"yscale")==0)	return "3";	if(strcmp(string,"currentframe")==0)	return "4";	if(strcmp(string,"totalframes")==0)	return "5";	if(strcmp(string,"alpha")==0)		return "6";	if(strcmp(string,"visible")==0)	return "7";	if(strcmp(string,"width")==0)		return "8";	if(strcmp(string,"height")==0)	return "9";	if(strcmp(string,"rotation")==0)	return "10";	if(strcmp(string,"target")==0)	return "11";	if(strcmp(string,"framesloaded")==0)	return "12";	if(strcmp(string,"name")==0)		return "13";	if(strcmp(string,"droptarget")==0)	return "14";	if(strcmp(string,"url")==0)		return "15";	if(strcmp(string,"quality")==0)	return "16";	if(strcmp(string,"focusrect")==0)	return "17";	if(strcmp(string,"soundbuftime")==0)	return "18";	SWF_error("No such property: %s\n", string);	return "";}int bufferWriteGetProperty(Buffer out, char *string){	const char *property = lookupGetProperty(string);	bufferWriteU8(out, SWFACTION_PUSHDATA);	bufferWriteS16(out, strlen(property)+2);	bufferWriteU8(out, PUSH_STRING);	return 4 + bufferWriteData(out, (byte*) property, strlen(property)+1);}/* * Local variables: * tab-width: 2 * c-basic-offset: 2 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -