void ring_vm_equal ( VM *pVM ) { String *cStr1,*cStr2 ; double nNum1,nNum2 ; char cStr3[100] ; if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new(RING_VM_STACK_READC); RING_VM_STACK_POP ; if ( RING_VM_STACK_ISSTRING ) { cStr2 = ring_string_new(RING_VM_STACK_READC); if ( strcmp(ring_string_get(cStr1),ring_string_get(cStr2)) == 0 ) { RING_VM_STACK_TRUE ; } else { RING_VM_STACK_FALSE ; } ring_string_delete(cStr2); } else if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; ring_vm_numtostring(pVM,nNum1,cStr3); if ( strcmp(ring_string_get(cStr1),cStr3) == 0 ) { RING_VM_STACK_TRUE ; } else { RING_VM_STACK_FALSE ; } } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,"=",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; if ( nNum1 == nNum2 ) { RING_VM_STACK_TRUE ; } else { RING_VM_STACK_FALSE ; } } else if ( RING_VM_STACK_ISSTRING ) { if ( ring_vm_stringtonum(pVM,RING_VM_STACK_READC) == nNum1 ) { RING_VM_STACK_TRUE ; } else { RING_VM_STACK_FALSE ; } } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,"=",nNum1); return ; } } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,"="); } }
void ring_vm_mod ( VM *pVM ) { double nNum1=0,nNum2=0 ; String *cStr1 ; char cStr2[100] ; char cStr3[100] ; if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( nNum1 == 0 ) { ring_vm_error(pVM,RING_VM_ERROR_DIVIDEBYZERO); return ; } if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,"%",nNum1); return ; } } else if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new2(RING_VM_STACK_READC,RING_VM_STACK_STRINGSIZE) ; nNum1 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_POP ; if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,"%",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,"%"); return ; } /* Check Overflow */ if ( ( strlen(ring_vm_numtostring(pVM,nNum1,cStr2)) >= 15 ) || (strlen(ring_vm_numtostring(pVM,nNum2,cStr3)) >= 15 ) ) { ring_vm_error(pVM,RING_VM_ERROR_NUMERICOVERFLOW); return ; } RING_VM_STACK_SETNVALUE(fmod(nNum2 , nNum1)); }
RING_API void ring_string_add2_gc ( void *pState,String *pString,const char *str,int nStrSize ) { int x ; int x2 ; char *cStr ; assert(pString != NULL); x2 = nStrSize+ring_string_size(pString) ; cStr = pString->cStr ; pString->cStr = (char *) ring_state_malloc(pState,x2+1); if ( pString->cStr == NULL ) { printf( RING_OOM ) ; exit(0); } /* Copy String */ for ( x = 0 ; x < ring_string_size(pString) ; x++ ) { pString->cStr[x] = cStr[x] ; } for ( x = 0 ; x < nStrSize ; x++ ) { pString->cStr[x+ring_string_size(pString)] = str[x] ; } pString->cStr[x2] = '\0' ; pString->nSize = x2 ; ring_state_free(pState,cStr); }
void ring_vm_greaterequal ( VM *pVM ) { double nNum1=0,nNum2=0 ; String *cStr1 ; if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,">=",nNum1); return ; } } else if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new(RING_VM_STACK_READC); nNum1 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_POP ; if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,">=",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,">="); return ; } /* Compare */ if ( nNum2 >= nNum1 ) { RING_VM_STACK_TRUE ; } else { RING_VM_STACK_FALSE ; } }
void ring_vm_bitshl ( VM *pVM ) { double nNum1,nNum2 ; String *cStr1 ; if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { RING_VM_STACK_SETNVALUE(( (int) (RING_VM_STACK_READN) << (int) nNum1 )); } else if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_SETNVALUE(((int) nNum2 << (int) nNum1)); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,"<<",nNum1); return ; } } else if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new(RING_VM_STACK_READC); nNum1 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { RING_VM_STACK_SETNVALUE(( (int) (RING_VM_STACK_READN) << (int) nNum1 )); } else if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_SETNVALUE(((int) nNum2 << (int) nNum1)); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,"<<",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,"<<"); } }
void ring_vm_sub ( VM *pVM ) { double nNum1=0,nNum2=0 ; String *cStr1 ; if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,"-",nNum1); return ; } } else if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new2(RING_VM_STACK_READC,RING_VM_STACK_STRINGSIZE) ; nNum1 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); RING_VM_STACK_POP ; if ( RING_VM_STACK_ISSTRING ) { nNum2 = ring_vm_stringtonum(pVM,RING_VM_STACK_READC); } else if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,"-",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,"-"); return ; } RING_VM_STACK_SETNVALUE(nNum2-nNum1); }
void ring_vm_sum ( VM *pVM ) { String *cStr1,*cStr2 ; double nNum1,nNum2 ; char cStr3[100] ; /* ** Description ** We can sum string + number ---> string , number + string ---> number ** string/number + nl ---> string ** list + string/number ---> add item to the list ** list1 + list2 ---> add list2 items to list 1 */ if ( RING_VM_STACK_ISSTRING ) { cStr1 = ring_string_new2(RING_VM_STACK_READC,RING_VM_STACK_STRINGSIZE) ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISSTRING ) { cStr2 = ring_string_new2(RING_VM_STACK_READC,RING_VM_STACK_STRINGSIZE) ; ring_string_add2(cStr2,ring_string_get(cStr1),ring_string_size(cStr1)); RING_VM_STACK_SETCVALUE2(ring_string_get(cStr2),ring_string_size(cStr2)); ring_string_delete(cStr2); } else if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; if ( strcmp(ring_string_get(cStr1),"\n") == 0 ) { cStr2 = ring_string_new("") ; ring_string_add(cStr2,ring_vm_numtostring(pVM,nNum2,cStr3)); ring_string_add(cStr2,ring_string_get(cStr1)); RING_VM_STACK_SETCVALUE(ring_string_get(cStr2)); ring_string_delete(cStr2); } else { RING_VM_STACK_SETNVALUE(nNum2 + ring_vm_stringtonum(pVM,ring_string_get(cStr1))); } } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_spoo(pVM,"+",ring_string_get(cStr1),ring_string_size(cStr1)); ring_string_delete(cStr1); return ; } ring_string_delete(cStr1); } else if ( RING_VM_STACK_ISNUMBER ) { nNum1 = RING_VM_STACK_READN ; RING_VM_STACK_POP ; if ( RING_VM_STACK_ISNUMBER ) { nNum2 = RING_VM_STACK_READN ; RING_VM_STACK_SETNVALUE(nNum1+nNum2); } else if ( RING_VM_STACK_ISSTRING ) { cStr2 = ring_string_new(RING_VM_STACK_READC) ; ring_vm_numtostring(pVM,nNum1,cStr3); ring_string_add(cStr2,cStr3); RING_VM_STACK_SETCVALUE(ring_string_get(cStr2)); ring_string_delete(cStr2); } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_npoo(pVM,"+",nNum1); return ; } } else if ( RING_VM_STACK_ISPOINTER ) { ring_vm_expr_ppoo(pVM,"+"); return ; } else { ring_vm_error(pVM,RING_VM_ERROR_BADVALUES); return ; } }