void c4_SaveContext::CommitSequence(c4_HandlerSeq &seq_, bool selfDesc_) { StoreValue(0); // sias prefix if (selfDesc_) { c4_String desc = seq_.Description(); int k = desc.GetLength(); StoreValue(k); Write((const char*)desc, k); } StoreValue(seq_.NumRows()); if (seq_.NumRows() > 0) for (int i = 0; i < seq_.NumFields(); ++i) seq_.NthHandler(i).Commit(*this); }
void InterpretUnaryAssign(int object_id,local_var_type *local_vars,opcode_type opcode) { char info; int dest,source; val_type source_data; info = get_byte(); dest = get_int(); source = get_int(); source_data = RetrieveValue(object_id,local_vars,opcode.source1,source); switch (info) { case NOT : if (source_data.v.tag != TAG_INT) { bprintf("InterpretUnaryAssign can't not non-int %i,%i\n", source_data.v.tag,source_data.v.data); break; } source_data.v.data = !source_data.v.data; break; case NEGATE : if (source_data.v.tag != TAG_INT) { bprintf("InterpretUnaryAssign can't negate non-int %i,%i\n", source_data.v.tag,source_data.v.data); break; } source_data.v.data = -source_data.v.data; break; case NONE : break; case BITWISE_NOT : if (source_data.v.tag != TAG_INT) { bprintf("InterpretUnaryAssign can't bitwise not non-int %i,%i\n", source_data.v.tag,source_data.v.data); break; } source_data.v.data = ~source_data.v.data; break; default : bprintf("InterpretUnaryAssign can't perform unary op %i\n",info); break; } StoreValue(object_id,local_vars,opcode.dest,dest,source_data); }
bool c4_SaveContext::CommitColumn(c4_Column &col_) { bool changed = col_.IsDirty() || _fullScan; t4_i32 sz = col_.ColSize(); StoreValue(sz); if (sz > 0) { t4_i32 pos = col_.Position(); if (_differ) { if (changed) { int n = pos < 0 ? ~pos: _differ->NewDiffID(); _differ->CreateDiff(n, col_); d4_assert(n >= 0); pos = ~n; } } else if (_preflight) { if (changed) pos = _space->Allocate(sz); _nextSpace->Occupy(pos, sz); _newPositions.Add(pos); } else { pos = _newPositions.GetAt(_nextPosIndex++); if (changed) col_.SaveNow(_strategy, pos); if (!_fullScan) col_.SetLocation(pos, sz); } StoreValue(pos); } return changed; }
void StartCalibration(CalibrationState myCalibrationState, SwitchDefine * mySwitch) { myCalibrationState = XMaxState; while(myCalibrationState != CalibrationDone) { IndicateLED(myCalibrationState); //LED stuff WaitLowButton(mySwitch); WaitHighButton(mySwitch); StoreValue(myCalibrationState); myCalibrationState = GetNextCalibrationState(myCalibrationState); } //turn off all leds when done LightLED(0x00); CalculateZeros(); }
const double CMemory::ProcessQuery(const char * pquery, CEvalInfoFunction **logCallingFunction, int *e) { if (memcmp(pquery,"me_st_", 6)==0) { *e = SUCCESS; StoreValue(pquery, logCallingFunction, e); return 0.0; } if (memcmp(pquery,"me_re_", 6)==0) { *e = SUCCESS; return RetrieveValue(pquery, e); } *e = ERR_INVALID_SYM; return 0.0; }
void InterpretBinaryAssign(int object_id,local_var_type *local_vars,opcode_type opcode) { char info; int dest,source1,source2; val_type source1_data,source2_data; info = get_byte(); dest = get_int(); source1 = get_int(); source2 = get_int(); source1_data = RetrieveValue(object_id,local_vars,opcode.source1,source1); source2_data = RetrieveValue(object_id,local_vars,opcode.source2,source2); /* if (source1_data.v.tag != source2_data.v.tag) bprintf("InterpretBinaryAssign is operating on 2 diff types!\n"); */ switch (info) { case ADD : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't add 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data += source2_data.v.data; break; case SUBTRACT : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't sub 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data -= source2_data.v.data; break; case MULTIPLY : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't mult 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data *= source2_data.v.data; break; case DIV : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't div 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } if (source2_data.v.data == 0) { bprintf("InterpretBinaryAssign can't div by 0\n"); break; } source1_data.v.data /= source2_data.v.data; break; case MOD : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't mod 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } if (source2_data.v.data == 0) { bprintf("InterpretBinaryAssign can't mod 0\n"); break; } source1_data.v.data = abs(source1_data.v.data % source2_data.v.data); break; case AND : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't and 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data && source2_data.v.data; break; case OR : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't or 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data || source2_data.v.data; break; case EQUAL : #if 0 // disabled: used to be only TAG_NIL vs TAG_X, or TAG_X vs TAG_X is legal // now: TAG_X vs TAG_Y is legal, and returns FALSE for equal if (source1_data.v.tag != source2_data.v.tag && source1_data.v.tag != TAG_NIL && source2_data.v.tag != TAG_NIL) { bprintf("InterpretBinaryAssign can't = 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } #endif if (source1_data.v.tag != source2_data.v.tag) source1_data.v.data = False; else source1_data.v.data = source1_data.v.data == source2_data.v.data; source1_data.v.tag = TAG_INT; break; case NOT_EQUAL : #if 0 // disabled: used to be only TAG_NIL vs TAG_X, or TAG_X vs TAG_X is legal // now: TAG_X vs TAG_Y is legal, and returns TRUE for not equal if (source1_data.v.tag != source2_data.v.tag && source1_data.v.tag != TAG_NIL && source2_data.v.tag != TAG_NIL) { bprintf("InterpretBinaryAssign can't <> 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } #endif if (source1_data.v.tag != source2_data.v.tag) source1_data.v.data = True; else source1_data.v.data = source1_data.v.data != source2_data.v.data; source1_data.v.tag = TAG_INT; break; case LESS_THAN : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't < 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data < source2_data.v.data; break; case GREATER_THAN : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't > 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data > source2_data.v.data; break; case LESS_EQUAL : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't <= 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data <= source2_data.v.data; break; case GREATER_EQUAL : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't >= 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data >= source2_data.v.data; break; case BITWISE_AND : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't and 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data & source2_data.v.data; break; case BITWISE_OR : if (source1_data.v.tag != TAG_INT || source2_data.v.tag != TAG_INT) { bprintf("InterpretBinaryAssign can't or 2 vars %i,%i and %i,%i\n", source1_data.v.tag,source1_data.v.data, source2_data.v.tag,source2_data.v.data); break; } source1_data.v.data = source1_data.v.data | source2_data.v.data; break; default : bprintf("InterpretBinaryAssign can't perform binary op %i\n",info); break; } StoreValue(object_id,local_vars,opcode.dest,dest,source1_data); }
void InterpretCall(int object_id,local_var_type *local_vars,opcode_type opcode) { parm_node normal_parm_array[MAX_C_PARMS],name_parm_array[MAX_NAME_PARMS]; unsigned char info,num_normal_parms,num_name_parms,initial_type; int initial_value; val_type call_return; val_type name_val; int assign_index; int i; info = get_byte(); /* get function id */ switch(opcode.source1) { case CALL_NO_ASSIGN : break; case CALL_ASSIGN_LOCAL_VAR : case CALL_ASSIGN_PROPERTY : assign_index = get_int(); break; } num_normal_parms = get_byte(); if (num_normal_parms > MAX_C_PARMS) { bprintf("InterpretCall found a call w/ more than %i parms, DEATH\n", MAX_C_PARMS); FlushDefaultChannels(); num_normal_parms = MAX_C_PARMS; } for (i=0;i<num_normal_parms;i++) { normal_parm_array[i].type = get_byte(); normal_parm_array[i].value = get_int(); } num_name_parms = get_byte(); if (num_name_parms > MAX_NAME_PARMS) { bprintf("InterpretCall found a call w/ more than %i name parms, DEATH\n", MAX_NAME_PARMS); FlushDefaultChannels(); num_name_parms = MAX_NAME_PARMS; } for (i=0;i<num_name_parms;i++) { name_parm_array[i].name_id = get_int(); initial_type = get_byte(); initial_value = get_int(); /* translate to literal now, because won't have local vars if nested call to sendmessage again */ /* maybe only need to do this in call to sendmessage and postmessage? */ name_val = RetrieveValue(object_id,local_vars,initial_type,initial_value); name_parm_array[i].value = name_val.int_val; } /* increment count of the c function, for profiling info */ kod_stat.c_count[info]++; call_return.int_val = ccall_table[info](object_id,local_vars,num_normal_parms, normal_parm_array,num_name_parms, name_parm_array); switch(opcode.source1) { case CALL_NO_ASSIGN : break; case CALL_ASSIGN_LOCAL_VAR : case CALL_ASSIGN_PROPERTY : StoreValue(object_id,local_vars,opcode.source1,assign_index,call_return); break; } }