Quantcast
Channel: 日志 | Bangumi 番组计划
Viewing all articles
Browse latest Browse all 42576

【xMemoria System】开源【VarInfo部分】

$
0
0
懒得挂谷歌,就放在这里吧。

/*
xMemoria System OpenSource License
禁止商业用途,禁止修改运行汉化补丁。
Copyright (c) 2014-??? X'moe. All rights reserved.
xmoe.project@gmail.com
xMemoria System is powered by SDL2 SDL_mixer libvlc zlib
*/

//VarInfo.h
#ifndef __VARINFO_H__
#define __VARINFO_H__

#include <cstdio>
#include <windows.h>
#include <cstring>

//#include "UserType.h"

//VM里面每个变量都是这样维护的
//type:
//0 bool0
//1 bool1
struct VarInfo
{
        enum
        {
                BOOL0  = 0,
                BOOL1  = 1,
                pINT   = 2,
                pFLOAT = 3,
                STRING = 4,
                MMAP   = 5
        }            type;
        //变量是一个32位的寄存器 大概
        __int32      value;
        //如果是一个String,就改动这个指针就可以了。
        char*        str;
        //Setxx
        VarInfo &operator = (const VarInfo &var);
        bool     operator ==(const VarInfo &var);
        bool     operator >=(const VarInfo &var);
        bool     operator <=(const VarInfo &var);
        bool     operator !=(const VarInfo &var);
        bool     operator > (const VarInfo &var);
        bool     operator < (const VarInfo &var);
    //基本运算交给stack
    //要小心+对于string就是连接字符串
        //base
        VarInfo();
        ~VarInfo();
};

#endif

//VarInfo.cpp

#include "VarInfo.h"


//VarInfo也可以称为StackFrame
//毕竟Stack就是这样维护的

VarInfo::VarInfo()
{
        str = NULL;
        value = 0;
}

VarInfo::~VarInfo()
{
        if(str) delete[] str;
        value = 0;
}

VarInfo &VarInfo::operator = (const VarInfo &var)
{
        memcpy(this,&var,sizeof(VarInfo));
}

bool VarInfo::operator ==(const VarInfo &var)
{
        //push0 push1
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value == var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value == var.value) return true;
                else return false;
        }
        else if(type == STRING && var.type == STRING)
        {
                if (!strcmp(str,var.str)) return true;
                else return false;
        }
        //剩下的这几种我不确定是否会用上
        else
        {
                fprintf(stderr,"VMStack::CMP, Cannot Exec!\n");
                return false;
        }
}

bool VarInfo::operator >=(const VarInfo &var)
{
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value >= var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value >= var.value) return true;
                else return false;
        }
        //容错
        else return false;
}

bool VarInfo::operator <=(const VarInfo &var)
{
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value <= var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value <= var.value) return true;
                else return false;
        }
        //容错
        else return false;
}

bool VarInfo::operator > (const VarInfo &var)
{
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value > var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value > var.value) return true;
                else return false;
        }
        //容错
        else return false;
}

bool VarInfo::operator < (const VarInfo &var)
{
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value < var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value < var.value) return true;
                else return false;
        }
        //容错
        else return false;
}

bool VarInfo::operator !=(const VarInfo &var)
{
        if((type == BOOL0 || type == pINT) && (var.type == BOOL0 || var.type == pINT))
        {
                if(value != var.value) return true;
                else return false;
        }
        else if((type == BOOL1 || type == pINT) && (var.type == BOOL1 || var.type == pINT))
        {
                if(value != var.value) return true;
                else return false;
        }
        else if(type == STRING && var.type == STRING)
        {
                if(strcmp(str,var.str)) return true;
                else return false;
        }
        //容错
        else return false;
}

Viewing all articles
Browse latest Browse all 42576

Trending Articles