Exemplo n.º 1
0
int main()
{
    float *x;
    *x = 31.2;

    printf( "x = [%2.1f]\n", *x );
    xchange( x );
    printf( "x = [%4.1f]\n", *x );

    return 0;
}
osc_data_t *
rpn_run(osc_data_t *buf, osc_data_t *end, Custom_Item *itm, RPN_Stack *stack)
{
	osc_data_t *buf_ptr = buf;
	RPN_VM *vm = &itm->vm;

	stack->ptr = stack->arr; // reset stack

	RPN_Instruction *inst;
	for(inst = vm->inst; *inst != RPN_TERMINATOR; inst++)
		switch(*inst)
		{
			case RPN_PUSH_VALUE:
			{
				push(stack, vm->val[inst - vm->inst]);
				break;
			}
			case RPN_POP_INT32:
			{
				volatile int32_t i = pop(stack);
				buf_ptr = osc_set_int32(buf_ptr, end, i);
				break;
			}
			case RPN_POP_FLOAT:
			{
				float f = pop(stack);
				buf_ptr = osc_set_float(buf_ptr, end, f);
				break;
			}
			case RPN_POP_MIDI:
			{
				uint8_t *m;
				buf_ptr = osc_set_midi_inline(buf_ptr, end, &m);
				if(buf_ptr)
				{
					m[3] = pop(stack);
					m[2] = pop(stack);
					m[1] = pop(stack);
					m[0] = pop(stack);
				}
				break;
			}

			case RPN_PUSH_FID:
			{
				push(stack, stack->fid);
				break;
			}
			case RPN_PUSH_SID:
			{
				push(stack, stack->sid);
				break;
			}
			case RPN_PUSH_GID:
			{
				push(stack, stack->gid);
				break;
			}
			case RPN_PUSH_PID:
			{
				push(stack, stack->pid);
				break;
			}
			case RPN_PUSH_X:
			{
				push(stack, stack->x);
				break;
			}
			case RPN_PUSH_Z:
			{
				push(stack, stack->z);
				break;
			}
			case RPN_PUSH_VX:
			{
				push(stack, stack->vx);
				break;
			}
			case RPN_PUSH_VZ:
			{
				push(stack, stack->vz);
				break;
			}
			case RPN_PUSH_N:
			{
				push(stack, SENSOR_N);
				break;
			}

			case RPN_PUSH_REG:
			{
				int32_t pos = pop(stack);
				float c = pop(stack);
				if(pos < RPN_REG_HEIGHT)
					stack->reg[pos] = c;
				else
				{
					; //TODO warn
				}
				break;
			}
			case RPN_POP_REG:
			{
				int32_t pos = pop(stack);
				if(pos < RPN_REG_HEIGHT)
					push(stack, stack->reg[pos]);
				else // TODO warn
					push(stack, NAN);
				break;
			}

			// standard operators
			case RPN_ADD:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a + b;
				push(stack, c);
				break;
			}
			case RPN_SUB:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a - b;
				push(stack, c);
				break;
			}
			case RPN_MUL:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a * b;
				push(stack, c);
				break;
			}
			case RPN_DIV:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a / b;
				push(stack, c);
				break;
			}
			case RPN_MOD:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = fmod(a, b);
				push(stack, c);
				break;
			}
			case RPN_POW:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = pow(a, b);
				push(stack, c);
				break;
			}
			case RPN_NEG:
			{
				float c = pop(stack);
				push(stack, -c);
				break;
			}
			case RPN_XCHANGE:
			{
				xchange(stack);
				break;
			}
			case RPN_DUPL_AT:
			{
				int32_t pos = pop(stack);
				if(pos > RPN_STACK_HEIGHT)
					pos = RPN_STACK_HEIGHT;
				else if(pos < 1)
					pos = 1;
				duplicate(stack, pos);
				break;
			}
			case RPN_DUPL_TOP:
			{
				duplicate(stack, 1);
				break;
			}
			case RPN_LSHIFT:
			{
				int32_t b = pop(stack);
				int32_t a = pop(stack);
				int32_t c = a << b;
				push(stack, c);
				break;
			}
			case RPN_RSHIFT:
			{
				int32_t b = pop(stack);
				int32_t a = pop(stack);
				int32_t c = a >> b;
				push(stack, c);
				break;
			}
			case RPN_LOGICAL_AND:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a && b;
				push(stack, c);
				break;
			}
			case RPN_BITWISE_AND:
			{
				int32_t b = pop(stack);
				int32_t a = pop(stack);
				int32_t c = a & b;
				push(stack, c);
				break;
			}
			case RPN_LOGICAL_OR:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a || b;
				push(stack, c);
				break;
			}
			case RPN_BITWISE_OR:
			{
				int32_t b = pop(stack);
				int32_t a = pop(stack);
				int32_t c = a | b;
				push(stack, c);
				break;
			}

			// conditionals
			case RPN_NOT:
			{
				float c = pop(stack);
				push(stack, !c);
				break;
			}
			case RPN_NOTEQ:
			{
				float a = pop(stack);
				float b = pop(stack);
				float c = a != b;
				push(stack, c);
				break;
			}
			case RPN_COND:
			{
				float c = pop(stack);
				if(!c)
					xchange(stack);
				pop(stack);
				break;
			}
			case RPN_LT:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a < b;
				push(stack, c);
				break;
			}
			case RPN_LEQ:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a <= b;
				push(stack, c);
				break;
			}
			case RPN_GT:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a > b;
				push(stack, c);
				break;
			}
			case RPN_GEQ:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a >= b;
				push(stack, c);
				break;
			}
			case RPN_EQ:
			{
				float b = pop(stack);
				float a = pop(stack);
				float c = a == b;
				push(stack, c);
				break;
			}
			case RPN_TERMINATOR:
				// never reached
				break;
		}
	
	return buf_ptr;
}
Exemplo n.º 3
0
static int doKN( char *id , char *pas , char *flag , char *process)
#endif
{
	char buffer[BUF_SIZE],idbuf[BUF_SIZE],pasbuf[BUF_SIZE],m[BUF_SIZE];
	char *ptr;
	int ret, x, baka;
	struct timeval tv;
	fd_set rfds;
	int iProcess;

	int length;

	if (zap) return(0);

	again:

	if (csd<=0) csd=TCPconnect(WGSAddress,WGSPort);

	if (csd<=0) { sleep(1); return(-1); }
	else {
		tv.tv_sec=0;
		tv.tv_usec=10000;
		FD_ZERO(&rfds);
		FD_SET(csd,&rfds);
		x=select(1024,&rfds,0,0,&tv);
		if (x<0) return(-100);
		if (x>0) {
			ret=read(csd,buffer,BUF_SIZE-8);
			
			if (ret<=0) { close(csd); sleep(1); csd=0; goto again; }
		}
		strcpy(idbuf,xchange(id));
		strcpy(pasbuf,xchange(pas));
		iProcess = atoi( process );

		switch (*flag) {
		case '1': // Login
		
#ifdef _FIX_MESSAGE                // WON ADD 修改封包內容		

#ifdef _ADD_AC_IP				 // WON ADD 加AC_IP至通訊協定中
			sprintf(buffer,"&;5;6;%s;%s;0;%s;",idbuf,pasbuf, AC_IP);
#else
			sprintf(buffer,"&;5;6;%s;%s;0;",idbuf,pasbuf);
#endif

#else
			sprintf(buffer,"&;9999;5;J;%s;%s;",idbuf,pasbuf);
#endif
			baka=90000+bakayaro(id);
			Log( buffer);
			break;
		case '4': // Delete

#ifdef _FIX_MESSAGE                // WON ADD 修改封包內容		

#ifdef _ADD_AC_IP				 // WON ADD 加AC_IP至通訊協定中
			sprintf(buffer,"&;5;6;%s;%s;0;%s;",idbuf,pasbuf, AC_IP);
#else
			sprintf(buffer,"&;5;6;%s;%s;0;",idbuf,pasbuf);
#endif

#else		
			sprintf(buffer,"&;9999;5;J;%s;%s;",idbuf,pasbuf);
#endif
			baka=90000+bakayaro(id);
			break;
		case '2': // Game Start
#ifdef _TIMEOUTKICK
		case '5': // recheck WGS deadline
#endif

#ifdef _FIX_MESSAGE                // WON ADD 修改封包內容		

#ifdef _ADD_AC_IP				 // WON ADD 加AC_IP至通訊協定中
			sprintf(buffer,"&;4;6;%s;%s;%s;",idbuf,pasbuf, AC_IP);
#else
			sprintf(buffer,"&;4;6;%s;%s;",idbuf,pasbuf);
#endif

#else				
			sprintf(buffer,"&;9999;6;6;%s;%s;%d;",idbuf,pasbuf,iProcess+additional_process);
#endif
			Log( buffer);
			baka=10000+bakayaro(id);			
			break;
		case '3': // Game End
		
#ifdef _FIX_MESSAGE                // WON ADD 修改封包內容		

#ifdef _ADD_AC_IP				 // WON ADD 加AC_IP至通訊協定中
			sprintf(buffer,"&;3;7;%s;%s;",idbuf, AC_IP);
#else
			sprintf(buffer,"&;3;7;%s;",idbuf);
#endif

#else				
			sprintf(buffer,"&;9999;5;7;%s;%d;",idbuf,iProcess+additional_process);
#endif
			Log( buffer);
			baka=20000+bakayaro(id);
			break;
		default:
			return(-100);
		}
		Log("<BW>");
		Log(buffer);
		ret=write(csd,buffer,strlen(buffer));
		Log("<AW>");

		// Write error
		if (ret<0) { close(csd); sleep(1); csd=0; goto again; }

		// Line busy
		if (ret==0) { sleep(1); return(-103); }

		tv.tv_sec=5;
		tv.tv_usec=0;
		FD_ZERO(&rfds);
		FD_SET(csd,&rfds);
		Log ("<BS>");
		x=select(1024,&rfds,0,0,&tv);
		Log ("<AS>");
		if (x<0) return(-101);
		if (x==0) return(0);
		Log ("<BR>");
		ret=read(csd,buffer,BUF_SIZE-8);
		Log ("<AR>");
		snprintf( m, sizeof(m), "ret: %d ", ret );
		Log( m );
		// Read error
		if (ret<=0) { close(csd); sleep(1); csd=0; return(-104); }
		buffer[ret]=0; 

		snprintf( m,sizeof(m) ," WGS: %s\n",buffer);
		Log( m );

		strtok(buffer,";"); // Get &
		length = atoi( strtok(0,";")); // Get length
		ptr=strtok(0,";"); // Get Flag

		if (ptr==0) return(-105);

		if (ptr[0]=='K') {

			int payType;

#ifndef _FIX_MESSAGE                // WON ADD 修改封包內容	
			if (atoi(ptr+1)!=baka){
				char buff1[256];
				sprintf( buff1, "%d != %d\n", atoi(ptr+1), baka);
				Log(buff1);
				return(-100);
			}
#endif

#ifdef _TIMEOUTKICK

			payType = atoi( strtok(0,";"));
			
			if( *flag == '1' || *flag == '4' ) { // GameLogin or Char Delete
				strtok(0,";"); // get Point
			}
			
			if( strcmp( strtok(0,";"), idbuf)) {  // get PlayerAccount
				//Log(" 回傳帳號不符! ");
				//return(-106);
			}

			switch( payType) {
			case 1: // 包月制
				strcpy( deadline ,"0");
				Log(" 包月 ");
				break;
			case 2: // 時段制
				//strtok(0,";"); // get PlayerAccount
				strcpy( deadline ,strtok(0,";"));
				Log(" 時段 ");
				break;
			case 0:
				strcpy( deadline ,"0");
				Log(" 結束 ");
				break;
			}

#endif

			switch (*flag) {
			case '1': // List
				Log("User Login\n");
				break;
			case '4': // Delete
				Log("User delete\n");
				break;
			case '2':
				Log("Game start\n");
				break;
			case '3':
				Log("Game end\n");	
				break;
#ifdef _TIMEOUTKICK
			case '5':
				Log("Deadline recheck\n");
				break;
#endif
			default:
				Log("Strange but passed\n");
				break;
			}
			return(0); // Authencation passed
		}

#ifdef _FIX_MESSAGE                // WON ADD 修改封包內容
		// 回傳錯誤碼
		else if (ptr[0]=='E'){
			char err_code[10];
			int i, err_num=0, login_star=-1;
#ifdef _TIMEOUTKICK
			if( length != 3 )
				strtok(0,";"); // Get 1
			if( *flag != '1' && *flag != '4') {
				if( strcmp( strtok(0,";"), idbuf)) {  // get PlayerAccount
					//Log(" 回傳帳號不符! ");
					//return(-106);
				}
			}
			strcpy( deadline ,"0");
#endif
			ptr=strtok(0,";"); 
			
			for(i=0; i<9; i++){
				if (ptr[i] == ' ' )	break;
				err_code[i]=ptr[i];			
			}

			err_num=atoi(err_code);

			if( err_num == 203 ){			// 203 不同星系
					login_star=atoi(ptr+i);
					Log("203");
					// 回傳已登入的星系代碼
					if(login_star != -1)
						return(login_star+2030);
			}
			else if( err_num == 204 ){		// 204 同星系	
					Log("204");
					if( *flag == '5')
						Log(" 時段未到 ");
					return(204);
			}else{
				char msg[256];
				sprintf( msg, "won test 1 ==> err_num(%d)", err_num);
				Log( msg );
				return(err_num);
			}

			
		}
#endif

		return(-106);
	}
}