www.pudn.com > FUN_2V.rar > ucvm9.cpp
#ifndef UCVM9_CPP
#define UCVM9_CPP
//---------------------------------------------------------------------------
TUCVM9::TUCVM9()
{
m_var_count = 0;
m_fun_count = 0;
m_ins_count = 0;
}
TUCVM9::~TUCVM9()
{
cln_var();
cln_fun();
}
//---------------------------------------------------------------------------
int TUCVM9::load_asm_file(char *file_name)
{
FILE *fp;
if((fp = fopen(file_name, "r+")) != NULL)
{
char buf_a[1024];
char str_a[1024];
char str_b[1024];
int i;
for(i = 0; i < 512; i ++)
{
if(fgets(buf_a, 1022, fp) == NULL)
break;
str_a[0] = 0;
str_b[0] = 0;
sscanf(buf_a, "%s %s", str_a, str_b);
if(strcmp("push_c", str_a) == 0)
{
m_ins_array[i].ins_code = 0x01;
m_ins_array[i].ins_data = new char[1];
*(char *)(m_ins_array[i].ins_data) = str_b[0];
}
else
if(strcmp("push_i", str_a) == 0)
{
m_ins_array[i].ins_code = 0x02;
m_ins_array[i].ins_data = new long[1];
*(long *)(m_ins_array[i].ins_data) = atoi(str_b);
}
else
if(strcmp("push_r", str_a) == 0)
{
m_ins_array[i].ins_code = 0x03;
m_ins_array[i].ins_data = new REAL[1];
*(REAL *)(m_ins_array[i].ins_data) = atof(str_b);
}
else
if(strcmp("push_s", str_a) == 0)
{
m_ins_array[i].ins_code = 0x04;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("push_v", str_a) == 0)
{
m_ins_array[i].ins_code = 0x05;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("pop_lo", str_a) == 0)
{
m_ins_array[i].ins_code = 0x06;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("add_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x07;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("sub_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x08;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("mul_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x09;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("div_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0a;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("rem_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0b;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("umi_nb", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0c;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("and_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0d;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("xor_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0e;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("oor_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x0f;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("shl_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x10;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("shr_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x11;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("not_bt", str_a) == 0)
{
m_ins_array[i].ins_code = 0x12;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("and_lg", str_a) == 0)
{
m_ins_array[i].ins_code = 0x13;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("oor_lg", str_a) == 0)
{
m_ins_array[i].ins_code = 0x14;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("not_lg", str_a) == 0)
{
m_ins_array[i].ins_code = 0x15;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("assign", str_a) == 0)
{
m_ins_array[i].ins_code = 0x16;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("add_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x17;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("sub_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x18;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("mul_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x19;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("div_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1a;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("rem_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1b;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("and_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1c;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("xor_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1d;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("oor_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1e;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("shl_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x1f;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("shr_as", str_a) == 0)
{
m_ins_array[i].ins_code = 0x20;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("cmp_ne", str_a) == 0)
{
m_ins_array[i].ins_code = 0x21;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("cmp_eq", str_a) == 0)
{
m_ins_array[i].ins_code = 0x22;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("cmp_le", str_a) == 0)
{
m_ins_array[i].ins_code = 0x23;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("cmp_ge", str_a) == 0)
{
m_ins_array[i].ins_code = 0x24;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("cmp_ll", str_a) == 0)
{
m_ins_array[i].ins_code = 0x25;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("cmp_gg", str_a) == 0)
{
m_ins_array[i].ins_code = 0x26;
m_ins_array[i].ins_data = 0;
}
else
if(strcmp("jmp_ez", str_a) == 0)
{
m_ins_array[i].ins_code = 0x27;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_nz", str_a) == 0)
{
m_ins_array[i].ins_code = 0x28;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_to", str_a) == 0)
{
m_ins_array[i].ins_code = 0x29;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_ne", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2a;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_eq", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2b;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_le", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2c;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_ge", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2d;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_ll", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2e;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("jmp_gg", str_a) == 0)
{
m_ins_array[i].ins_code = 0x2f;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
if(strcmp("inc_af", str_a) == 0)
{
m_ins_array[i].ins_code = 0x30;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("inc_bf", str_a) == 0)
{
m_ins_array[i].ins_code = 0x31;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("dec_af", str_a) == 0)
{
m_ins_array[i].ins_code = 0x32;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("dec_bf", str_a) == 0)
{
m_ins_array[i].ins_code = 0x33;
m_ins_array[i].ins_data = search_var(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("call_f", str_a) == 0)
{
m_ins_array[i].ins_code = 0x34;
m_ins_array[i].ins_data = search_fun(str_b);
if(m_ins_array[i].ins_data == NULL)
return(-2);
}
else
if(strcmp("label:", str_a) == 0)
{
m_ins_array[i].ins_code = 0x35;
m_ins_array[i].ins_data = cclone_str(str_b);
}
else
{
fclose(fp);
return(-1);
}
}
m_ins_count = i;
for(i = 0; i < m_ins_count; i ++)
{
if(m_ins_array[i].ins_code >= 0x27
&& m_ins_array[i].ins_code <= 0x2f)
{
m_ins_array[i].ins_data = search_lab((char *)
m_ins_array[i].ins_data);
}
}
for(i = 0; i < m_ins_count; i ++)
{
if(m_ins_array[i].ins_code == 0x35)
{
delete [] ((char *)(m_ins_array[i].ins_data));
m_ins_array[i].ins_code = 0;
m_ins_array[i].ins_data = 0;
}
}
fclose(fp);
return( 1);
}
return(0);
}
//---------------------------------------------------------------------------
int TUCVM9::save_ins_file(char *file_name)
{
return(0);
}
//---------------------------------------------------------------------------
int TUCVM9::reg_var(char *var_name, int var_type, void *var_addr)
{
if(m_var_count < 256)
{
if(search_var(var_name) == NULL)
{
m_var_array[m_var_count].var_name = cclone_str(var_name);
m_var_array[m_var_count].var_type = var_type;
m_var_array[m_var_count].var_addr = var_addr;
m_var_count ++;
return(1);
}
}
return(0);
}
//---------------------------------------------------------------------------
int TUCVM9::reg_fun(char *fun_name, int fun_type, FUNC fun_addr)
{
if(m_fun_count < 256)
{
if(search_fun(fun_name) == NULL)
{
m_fun_array[m_fun_count].fun_name = cclone_str(fun_name);
m_fun_array[m_fun_count].fun_type = fun_type;
m_fun_array[m_fun_count].fun_addr = fun_addr;
m_fun_count ++;
return(1);
}
}
return(0);
}
//---------------------------------------------------------------------------
int TUCVM9::cln_var()
{
int i;
for(i = 0; i < m_var_count; i ++)
{
delete [] ((char *)(m_var_array[i].var_name));
}
m_var_count = 0;
return(1);
}
//---------------------------------------------------------------------------
int TUCVM9::cln_fun()
{
int i;
for(i = 0; i < m_fun_count; i ++)
{
delete [] ((char *)(m_fun_array[i].fun_name));
}
m_fun_count = 0;
return(1);
}
//---------------------------------------------------------------------------
int TUCVM9::exe_fun()
{
memset(m_dat_stack, m_dat_point = 0, sizeof(m_dat_stack));
int i;
for(i = 0; i < m_ins_count; i += 1)
{
switch(m_ins_array[i].ins_code)
{
case 0x00:
break;
case 0x01:
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_CHR;
m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data;
break;
case 0x02:
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_INT;
m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data;
break;
case 0x03://push_r;
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_FLT;
m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data;
break;
case 0x04:
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_STR;
m_dat_stack[m_dat_point].dat_addr = m_ins_array[i].ins_data;
break;
case 0x05://push_v;
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type =
((T_VAR *)(m_ins_array[i].ins_data))->var_type;
m_dat_stack[m_dat_point].dat_addr =
((T_VAR *)(m_ins_array[i].ins_data))->var_addr;
break;
case 0x06://pop_lo;
if(m_dat_stack[m_dat_point].dat_free != NULL)
{
delete [] m_dat_stack[m_dat_point].dat_free;
m_dat_stack[m_dat_point].dat_free = NULL;
}
m_dat_point --;
break;
case 0x07://add_nb;
pop_rparame();
pop_lparame();
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT
|| m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
push_flt(lparame_to_flt() + rparame_to_flt());
else
push_int(lparame_to_int() + rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x08://sub_nb;
pop_rparame();
pop_lparame();
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT
|| m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
push_flt(lparame_to_flt() - rparame_to_flt());
else
push_int(lparame_to_int() - rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x09://mul_nb;
pop_rparame();
pop_lparame();
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT
|| m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
push_flt(lparame_to_flt() * rparame_to_flt());
else
push_int(lparame_to_int() * rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x0a://div_nb;
pop_rparame();
pop_lparame();
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT
|| m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
push_flt(lparame_to_flt() / rparame_to_flt());
else
push_int(lparame_to_int() / rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x0b://rem_nb;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() % rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x0c://umi_nb;
pop_rparame();
if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
push_flt(- *((REAL *)(m_dat_rparame->dat_addr)));
else
if(m_dat_rparame->dat_type == UCVM9_TYPE_INT)
push_int(- *((long *)(m_dat_rparame->dat_addr)));
else
push_chr(- *((char *)(m_dat_rparame->dat_addr)));
free_rparame();
break;
case 0x0d://and_bt;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() & rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x0e://xor_bt;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() ^ rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x0f://oor_bt;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() | rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x10://shl_bt;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() << rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x11://shr_bt;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() >> rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x12://not_bt;
pop_rparame();
push_int(~ rparame_to_int());
free_rparame();
break;
case 0x13://and_lg;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() && rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x14://oor_lg;
pop_rparame();
pop_lparame();
push_int(lparame_to_int() || rparame_to_int());
free_rparame();
free_lparame();
break;
case 0x15://not_lg;
pop_rparame();
push_int(! rparame_to_int());
free_rparame();
break;
case 0x16://assign;
pop_rparame();
switch(((T_VAR *)(m_ins_array[i].ins_data))->var_type)
{
case UCVM9_TYPE_CHR:
*(char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_chr();
break;
case UCVM9_TYPE_STR:
if(NULL != (char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr))
delete [] (char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr);
(char *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_str();
break;
case UCVM9_TYPE_INT:
*(long *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_int();
break;
case UCVM9_TYPE_FLT:
*(REAL *)(((T_VAR *)(m_ins_array[i].ins_data))->var_addr) = rparame_to_flt();
break;
}
free_rparame();
break;
case 0x17://add_as;
break;
case 0x18://sub_as;
break;
case 0x19://mul_as;
break;
case 0x1a://div_as;
break;
case 0x1b://rem_as;
break;
case 0x1c://and_as;
break;
case 0x1d://xor_as;
break;
case 0x1e://oor_as;
break;
case 0x1f://shl_as;
break;
case 0x20://shr_as;
break;
case 0x21://cmp_ne;
break;
case 0x22://cmp_eq;
break;
case 0x23://cmp_le;
break;
case 0x24://cmp_ge;
break;
case 0x25://cmp_ll;
break;
case 0x26://cmp_gg;
break;
case 0x27://jmp_ez;
break;
case 0x28://jmp_nz;
break;
case 0x29://jmp_to;
break;
case 0x2a://jmp_ne;
break;
case 0x2b://jmp_eq;
break;
case 0x2c://jmp_le;
break;
case 0x2d://jmp_ge;
break;
case 0x2e://jmp_ll;
break;
case 0x2f://jmp_gg;
break;
case 0x30://inc_af;
break;
case 0x31://inc_bf;
break;
case 0x32://dec_af;
break;
case 0x33://dec_bf;
break;
case 0x34://call_f;
{
T_FUN *func;
long nmbr;
void *addr;
char type;
func = (T_FUN *)(m_ins_array[i].ins_data);
nmbr = *(long *)(m_dat_stack[m_dat_point --].dat_addr);
type = func->fun_type;
addr = func->fun_addr(nmbr, m_dat_stack + m_dat_point);
while(nmbr -- > 0)
{
if(m_dat_stack[m_dat_point].dat_free != NULL)
{
delete [] m_dat_stack[m_dat_point].dat_free;
m_dat_stack[m_dat_point].dat_free = NULL;
}
m_dat_point --;
};
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = type;
m_dat_stack[m_dat_point].dat_addr =
m_dat_stack[m_dat_point].dat_free = (char *)addr;
}
break;
}
}
}
//---------------------------------------------------------------------------
void * TUCVM9::search_fun(char *fun_name)
{
int i;
for(i = 0; i < m_fun_count; i ++)
{
if(strcmp(fun_name, (const char *)m_fun_array[i].fun_name) == 0)
{
return(m_fun_array + i);
}
}
return(0);
}
//---------------------------------------------------------------------------
void * TUCVM9::search_var(char *var_name)
{
int i;
for(i = 0; i < m_var_count; i ++)
{
if(strcmp(var_name, (const char *)m_var_array[i].var_name) == 0)
{
return(m_var_array + i);
}
}
return(0);
}
//---------------------------------------------------------------------------
void * TUCVM9::search_lab(char *lab_name)
{
int i;
for(i = 0; i < m_ins_count; i ++)
{
if(m_ins_array[i].ins_code == 0x35)
{
if(strcmp(lab_name, (const char *)m_ins_array[i].ins_data) == 0)
{
delete [] lab_name;
return(m_ins_array + i);
}
}
}
delete [] lab_name;
return(0);
}
//---------------------------------------------------------------------------
char * TUCVM9::cclone_str(char *str_data)
{
char *result;
result = new char[strlen(str_data) + 1];
strcpy(result, str_data);
return(result);
}
//---------------------------------------------------------------------------
void TUCVM9::pop_rparame()
{
m_dat_rparame->dat_type = m_dat_stack[m_dat_point].dat_type;
m_dat_rparame->dat_addr = m_dat_stack[m_dat_point].dat_addr;
m_dat_rparame->dat_free = m_dat_stack[m_dat_point].dat_free;
m_dat_stack[m_dat_point].dat_free = NULL;
m_dat_point --;
}
//---------------------------------------------------------------------------
void TUCVM9::pop_lparame()
{
m_dat_lparame->dat_type = m_dat_stack[m_dat_point].dat_type;
m_dat_lparame->dat_addr = m_dat_stack[m_dat_point].dat_addr;
m_dat_lparame->dat_free = m_dat_stack[m_dat_point].dat_free;
m_dat_stack[m_dat_point].dat_free = NULL;
m_dat_point --;
}
//---------------------------------------------------------------------------
void TUCVM9::free_rparame()
{
if(m_dat_rparame->dat_free != NULL)
delete [] m_dat_rparame->dat_free;
}
//---------------------------------------------------------------------------
void TUCVM9::free_lparame()
{
if(m_dat_lparame->dat_free != NULL)
delete [] m_dat_lparame->dat_free;
}
//---------------------------------------------------------------------------
void TUCVM9::push_chr(char vchr)
{
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_CHR;
m_dat_stack[m_dat_point].dat_addr =
m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(char)];
*(char *)(m_dat_stack[m_dat_point].dat_free) = vchr;
}
//---------------------------------------------------------------------------
void TUCVM9::push_int(long vint)
{
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_INT;
m_dat_stack[m_dat_point].dat_addr =
m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(long)];
*(long *)(m_dat_stack[m_dat_point].dat_free) = vint;
}
//---------------------------------------------------------------------------
void TUCVM9::push_flt(REAL vflt)
{
m_dat_point ++;
m_dat_stack[m_dat_point].dat_type = UCVM9_TYPE_FLT;
m_dat_stack[m_dat_point].dat_addr =
m_dat_stack[m_dat_point].dat_free = (char *)new char[sizeof(REAL)];
*(REAL *)(m_dat_stack[m_dat_point].dat_free) = vflt;
}
//---------------------------------------------------------------------------
char TUCVM9::rparame_to_chr()
{
if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_rparame->dat_addr);
else
if(m_dat_rparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_rparame->dat_addr);
else
return(*(char *)m_dat_rparame->dat_addr);
}
//---------------------------------------------------------------------------
char TUCVM9::lparame_to_chr()
{
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_lparame->dat_addr);
else
if(m_dat_lparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_lparame->dat_addr);
else
return(*(char *)m_dat_lparame->dat_addr);
}
//---------------------------------------------------------------------------
long TUCVM9::rparame_to_int()
{
if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_rparame->dat_addr);
else
if(m_dat_rparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_rparame->dat_addr);
else
return(*(char *)m_dat_rparame->dat_addr);
}
//---------------------------------------------------------------------------
long TUCVM9::lparame_to_int()
{
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_lparame->dat_addr);
else
if(m_dat_lparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_lparame->dat_addr);
else
return(*(char *)m_dat_lparame->dat_addr);
}
//---------------------------------------------------------------------------
REAL TUCVM9::rparame_to_flt()
{
if(m_dat_rparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_rparame->dat_addr);
else
if(m_dat_rparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_rparame->dat_addr);
else
return(*(char *)m_dat_rparame->dat_addr);
}
//---------------------------------------------------------------------------
REAL TUCVM9::lparame_to_flt()
{
if(m_dat_lparame->dat_type == UCVM9_TYPE_FLT)
return(*(REAL *)m_dat_lparame->dat_addr);
else
if(m_dat_lparame->dat_type == UCVM9_TYPE_INT)
return(*(long *)m_dat_lparame->dat_addr);
else
return(*(char *)m_dat_lparame->dat_addr);
}
//---------------------------------------------------------------------------
char * TUCVM9::rparame_to_str()
{
if(m_dat_rparame->dat_type == UCVM9_TYPE_STR)
return(cclone_str((char *)m_dat_rparame->dat_addr));
else
return(cclone_str(""));
}
//---------------------------------------------------------------------------
char * TUCVM9::lparame_to_str()
{
if(m_dat_lparame->dat_type == UCVM9_TYPE_STR)
return(cclone_str((char *)m_dat_lparame->dat_addr));
else
return(cclone_str(""));
}
//---------------------------------------------------------------------------
#endif//UCVM9_CPP