⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucvm9.cpp

📁 绘制一元函数曲线的工具 输入C语言语法的函数公式, 即可绘制函数的二维曲线 采用内置编译器和虚拟机(这是调整OK的版本)
💻 CPP
📖 第 1 页 / 共 3 页
字号:

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -