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; }
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); } }