📄 univar.cpp
字号:
// UniVar.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "UniVar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE UniVarDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("UNIVAR.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(UniVarDLL, hInstance))
return 0;
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.
new CDynLinkLibrary(UniVarDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("UNIVAR.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(UniVarDLL);
}
return 1; // ok
}
AFX_EXT_DATA UniVar UniVar::m_InValidValue=UniVar(DATA_TYPE_MAX+1,DATA_TYPE_MAX+1);
HANDLE UniVar::m_hCreate=NULL;
int UniVar::m_iHeapBlock=0;
UniVar TempVar("i love you");
inline void UniVar::ClearData()
{
try{
UniDelete();
}
catch(...){
}
};
void UniVar::UniDelete()
{
if(it==DATA_TYPE_STRING||it==DATA_TYPE_HANDLE){
if(dwCheckL&&uv.heap.handle&&UniVar::m_hCreate&&uv.heap.handle==uv.heap.pBuffer){
HANDLE hdl=uv.heap.handle;
uv.heap.handle=uv.heap.pBuffer=0;
dwCheckL=0;
if(HeapValidate(UniVar::m_hCreate,0,hdl)){
if(HeapFree(UniVar::m_hCreate,0,hdl)){
UniVar::m_iHeapBlock--;
if(!UniVar::m_iHeapBlock){
HANDLE pp=UniVar::m_hCreate;
UniVar::m_hCreate=NULL;
HeapDestroy(pp);
}
}
}
return;
}
}
uv.heap.handle=uv.heap.pBuffer=0;
dwCheckL=0;
}
void UniVar::Uninew(int size,int ite)
{
if(ite==DATA_TYPE_STRING||ite==DATA_TYPE_HANDLE){
ASSERT(size);
it=ite;
if(!UniVar::m_hCreate){
UniVar::m_hCreate=HeapCreate(0,0,0);
if(!UniVar::m_hCreate)return;
}
try{
uv.heap.pBuffer=HeapAlloc(UniVar::m_hCreate,0,size);
}
catch(...){
uv.heap.pBuffer=0;
}
if(uv.heap.pBuffer){
uv.heap.handle=uv.heap.pBuffer;
SetDataLength(size);
UniVar::m_iHeapBlock++;
}
else{
uv.heap.handle=NULL;
SetDataLength(0);
}
return;
}
else{
uv.heap.handle=uv.heap.pBuffer=0;
it=ite;
}
};
char * UniVar::NewBlock(int isize)
{
if(isize>0){
if(!UniVar::m_hCreate){
UniVar::m_hCreate=HeapCreate(0,0,0);
if(!UniVar::m_hCreate)return NULL;
}
return (char *)HeapAlloc(UniVar::m_hCreate,0,isize);
}
return NULL;
}
BOOL UniVar::DeleteBlock(void * p)
{
if(HeapValidate(UniVar::m_hCreate,0,p)){
if(HeapFree(UniVar::m_hCreate,0,p)){
return TRUE;
}
}
return FALSE;
}
void UniVar::SetData(PARAMEMTER * pm,UniVar & tv)
{
if(pm->tv.it==DATA_TYPE_HANDLE){
if(!pm->tv.GetDataLength()){
*this=tv;
}
else{
ClearData();
int j=pm->tv.GetDataLength();
Uninew(j,DATA_TYPE_HANDLE);
if(tv.GetDataLength()==j){
if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
}
else{
if(uv.bv)memset(uv.bv,0,j);
}
}
}
else if(pm->tv.it==tv.it)*this=tv;
else {
switch(pm->tv.it){
case DATA_TYPE_INT:*this=(int)tv;break;
case DATA_TYPE_FLOAT:*this=(double)tv;break;
case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
case DATA_TYPE_STRING:*this="";break;
}
}
};
void UniVar::SetData(int itp,int ilenp,UniVar & tv)
{
if(itp==DATA_TYPE_HANDLE){
if(!ilenp){
*this=tv;
}
else{
ClearData();
int j=ilenp;
Uninew(j,DATA_TYPE_HANDLE);
if(tv.GetDataLength()==j){
if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
}
else {
if(uv.bv)memset(uv.bv,0,j);
}
}
}
else if(itp==tv.it)*this=tv;
else {
switch(itp){
case DATA_TYPE_INT:*this=(int)tv;break;
case DATA_TYPE_FLOAT:*this=(double)tv;break;
case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
case DATA_TYPE_STRING:*this="";break;
}
}
}
UniVar::UniVar(int itp,int ilenp,UniVar & tv)
{
if(itp==DATA_TYPE_HANDLE){
if(!ilenp){
*this=tv;
}
else{
int j=ilenp;
Uninew(j,DATA_TYPE_HANDLE);
if(tv.GetDataLength()==j){
if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
}
else {
if(uv.bv)memset(uv.bv,0,j);
}
}
}
else if(itp==tv.it){
if(tv.GetDataLength()){
Uninew(tv.GetDataLength(),tv.it);
if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
}
else {
memcpy(this,&tv,sizeof(UniVar));
};
}
else {
memset(this,0,sizeof(UniVar));
switch(itp){
case DATA_TYPE_INT:*this=(int)tv;break;
case DATA_TYPE_FLOAT:*this=(double)tv;break;
case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
case DATA_TYPE_STRING:*this="";break;
}
}
}
UniVar::UniVar(PARAMEMTER * pm,UniVar & tv)
{
if(pm->tv.it==DATA_TYPE_HANDLE){
if(!pm->tv.GetDataLength()){
*this=tv;
}
else{
int j=pm->tv.GetDataLength();
Uninew(j,DATA_TYPE_HANDLE);
if(tv.GetDataLength()==j){
if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
}
else {
if(uv.bv)memset(uv.bv,0,j);
}
}
}
else if(pm->tv.it==tv.it){
if(tv.GetDataLength()){
Uninew(tv.GetDataLength(),tv.it);
if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
}
else {
memcpy(this,&tv,sizeof(UniVar));
};
}
else {
memset(this,0,sizeof(UniVar));
switch(pm->tv.it){
case DATA_TYPE_INT:*this=(int)tv;break;
case DATA_TYPE_FLOAT:*this=(double)tv;break;
case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
case DATA_TYPE_STRING:*this="";break;
}
}
};
//clanguage@163.net
//21cn.com
UniVar Calculate(const UniVar & tv3,const UniVar & tv4,int iFlag)
{
UniVar tv1;
UniVar tv2;
tv1=tv3;
tv2=tv4;
if(tv2.it>=DATA_TYPE_HANDLE||tv2.it<DATA_TYPE_INT)tv2=(0);
if(tv1.it>=DATA_TYPE_HANDLE||tv1.it<DATA_TYPE_INT)tv1=(0);
if(tv1.it!=tv2.it){
if(tv2.it==DATA_TYPE_STRING)tv2=(0);
if(tv1.it==DATA_TYPE_STRING)tv1=(0);
if(tv1.it==DATA_TYPE_FLOAT){
if(tv2.it==DATA_TYPE_INT)
tv2=((double)tv2.uv.iv);
else
tv2=((double)tv2.uv.pv);
}
else if(tv2.it==DATA_TYPE_FLOAT){
if(tv1.it==DATA_TYPE_INT)
tv1=((double)tv1.uv.iv);
else
tv1=((double)tv1.uv.pv);
}
else if(tv1.it==DATA_TYPE_DWORD){
tv2=((DWORD)tv2.uv.iv);
}
else {
tv1=((DWORD)tv1.uv.iv);
}
}
if(iFlag>1&&iFlag<8){
if(tv2.it==DATA_TYPE_STRING)tv2=(0);
if(tv1.it==DATA_TYPE_STRING)tv1=(0);
}
if(iFlag>4&&iFlag<8){
if(tv2.it==DATA_TYPE_STRING)tv2=((int)tv2.uv.dv);
if(tv1.it==DATA_TYPE_STRING)tv1=((int)tv1.uv.dv);
}
switch(iFlag){
case 0://+
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv+=tv2.uv.iv;
break;
case DATA_TYPE_FLOAT:
tv1.uv.dv+=tv2.uv.dv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv+=tv2.uv.pv;
break;
case DATA_TYPE_STRING:
{
CString cs=tv1.uv.cv;
cs+=tv2.uv.cv;
tv1=(LPSTR)(LPCTSTR)cs;
break;
}
}
break;
case 1://-
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv-=tv2.uv.iv;
break;
case DATA_TYPE_FLOAT:
tv1.uv.dv-=tv2.uv.dv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv-=tv2.uv.pv;
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv1.uv.cv,tv1.uv.cv));
break;
};
break;
case 2://*
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv*=tv2.uv.iv;
break;
case DATA_TYPE_FLOAT:
tv1.uv.dv*=tv2.uv.dv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv*=tv2.uv.pv;
break;
};
break;
case 3:// /
switch(tv1.it){
case DATA_TYPE_INT:
if(tv2.uv.iv)
tv1.uv.iv/=tv2.uv.iv;
else
tv1.uv.iv=0;
break;
case DATA_TYPE_FLOAT:
if(tv2.uv.dv)
tv1.uv.dv/=tv2.uv.dv;
else
tv1.uv.dv=0.0f;
break;
case DATA_TYPE_DWORD:
if(tv2.uv.pv)
tv1.uv.pv/=tv2.uv.pv;
else
tv1.uv.pv=0;
break;
};
break;
case 4://%
switch(tv1.it){
case DATA_TYPE_INT:
if(tv2.uv.iv)
tv1.uv.iv%=tv2.uv.iv;
else
tv1.uv.iv=0;
break;
case DATA_TYPE_FLOAT:
tv1.uv.dv=0.0f;
break;
case DATA_TYPE_DWORD:
if(tv2.uv.pv)
tv1.uv.pv%=tv2.uv.pv;
else
tv1.uv.pv=0;
break;
};
break;
case 5://^
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv^=tv2.uv.iv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv^=tv2.uv.pv;
break;
};
break;
case 6://&
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv&=tv2.uv.iv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv&=tv2.uv.pv;
break;
};
break;
case 7://|
switch(tv1.it){
case DATA_TYPE_INT:
tv1.uv.iv|=tv2.uv.iv;
break;
case DATA_TYPE_DWORD:
tv1.uv.pv|=tv2.uv.pv;
break;
};
break;
case 8://&&
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv&&tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv&&tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv&&tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(tv2.uv.cv&&tv1.uv.cv);
break;
};
break;
case 9://||
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv||tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv||tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv||tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(tv2.uv.cv||tv1.uv.cv);
break;
};
break;
case 10://>
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv>tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv>tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv>tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)>0);
break;
};
break;
case 11://>=
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv>=tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv>=tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv>=tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)>=0);
break;
};
break;
case 12://==
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv==tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv==tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv==tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv2.uv.cv,tv1.uv.cv)==0);
break;
};
break;
case 13://!=
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv!=tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv!=tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv!=tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv2.uv.cv,tv1.uv.cv)!=0);
break;
};
break;
case 14://<=
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv<=tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv<=tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv<=tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)<=0);
break;
};
break;
case 15://<
switch(tv1.it){
case DATA_TYPE_INT:
tv1=(tv1.uv.iv<tv2.uv.iv);
break;
case DATA_TYPE_FLOAT:
tv1=(tv1.uv.dv<tv2.uv.dv);
break;
case DATA_TYPE_DWORD:
tv1=(tv2.uv.pv<tv1.uv.pv);
break;
case DATA_TYPE_STRING:
tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)<0);
break;
};
break;
default:
tv1=(0);
break;
};
return tv1;
}
UniVar operator +(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,0);
}
UniVar operator -(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,1);
}
UniVar operator *(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,2);
}
UniVar operator /(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,3);
}
UniVar operator %(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,4);
}
UniVar operator ^(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,5);
}
UniVar operator |(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,6);
}
UniVar operator &(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,7);
}
UniVar operator &&(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,8);
}
UniVar operator ||(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,9);
}
UniVar operator >(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,10);
}
UniVar operator >=(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,11);
}
UniVar operator ==(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,12);
}
UniVar operator !=(const UniVar & tv1,const UniVar & tv2)
{
return Calculate(tv1,tv2,13);
}
UniVar operator <=(const UniVar & tv1,const UniVar & tv2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -