Example #1
0
File: persist.cpp Project: aosm/tcl
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);
}
Example #2
0
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);
}
Example #3
0
File: persist.cpp Project: aosm/tcl
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;
}
Example #4
0
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();
}
Example #5
0
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;
}
Example #6
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);
}
Example #7
0
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;
	}
}