懒得挂谷歌,就放在这里吧。
/*
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;
}