📄 vsinterpreter.cpp
字号:
//找到一个变量名,对其初始化
pTempBuf3 = strstr(pTempBuf2, "=");
switch(i)
{
case 0:
int iOriginValue;
if(pTempBuf3 != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
//取初值
iOriginValue = atoi(pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
iOriginValue = 0;
}
if(AddUniversal_Integer(pcurrentState, pTempBuf2, iOriginValue) == -1)
{
AfxMessageBox("error AddUniversal_Integer()");
return(-1);
}
break;
case 1:
char aszOriginValue[MAX_LEN];
if(pTempBuf3 != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
strcpy(aszOriginValue, pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
aszOriginValue[0] = 0;
}
if(AddUniversal_String(pcurrentState, pTempBuf2, aszOriginValue) == -1)
{
AfxMessageBox("error AddUniversal_String()");
return(-1);
}
break;
case 2:
float fOriginValue;
if(pTempBuf3 != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
fOriginValue = (float)atof(pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
fOriginValue = 0;
}
if(AddUniversal_Float(pcurrentState, pTempBuf2, fOriginValue) == -1)
{
AfxMessageBox("error AddUniversal_Float()");
return(-1);
}
break;
default:
break;
}//end of switch(i)
}//end of while
}//en of for(i = 0; i < 3; i ++)
return 0;
}
int CVSInterpreter::InitializeParamList(struct CurrentState *pcurrentState)
{/*
int i;
int iInParamCount = 0;
int iOutParamCount = 0;
pcurrentState->m_inParamList.nCount = iInParamCount;
pcurrentState->m_inParamList.paramlist = (struct Param *)malloc(iInParamCount * sizeof(struct Param));
pcurrentState->m_outParamList.nCount = iOutParamCount;
pcurrentState->m_outParamList.paramlist = (struct Param *)malloc(iOutParamCount * sizeof(struct Param));
for(i = 0; i < iInParamCount; i ++)
{
pcurrentState->m_inParamList.paramlist->iSize = 0;
}
for(i = 0; i < iOutParamCount; i ++)
{
pcurrentState->m_outParamList.paramlist->iSize = 0;
}
*/
return(0);
}
int CVSInterpreter::GetString(char *szInstructionFileName, char *szSectionName, char *szKeyName, char *szReturnedString, int iSize)
{
/*****************************************************
得到由传入参数决定的KEY的字符串
(in)szFileName, szSectionName, szKeyName: 决定参数;
(out)szReturnedString: 传出的字符串, 需要调用者预先分配空间;
(in)iSize: 传出字符串预先分配空间的大小
*****************************************************/
/*
int len;
//注意如果KEY值的首尾都是引号,这个函数会把引号去掉,保留引号的办法是在右边的引号后跟一个,
len = GetPrivateProfileString(szSectionName, szKeyName, DEFAULT_STRING, szReturnedString, iSize, szInstructionFileName);
if(strcmp(szReturnedString, DEFAULT_STRING) == 0)
{
return(-1);
}
if(len >= iSize - 2)
{
return(-1);
}
//若SCRIPT中对应的KEY后面是空值,GETPRIVATEPROFILESTRING()会将szReturnedString[0]置0
*/
//为解决以上问题
char aszTemp[MAX_LEN];
char *szTemp, *szTemp2;
if(GetSection3(szInstructionFileName, szSectionName, aszTemp, sizeof(aszTemp)) == -1)
{
return(-1);
}
//GETSECTION得到的是各单位以0隔开,并以00结束的串,使用STRSTR()时会有问题,将0换成'\r'
int i = 0;
for(i = 0; ; i ++)
{
if(aszTemp[i] == 0 && aszTemp[i + 1] != 0)
aszTemp[i] = '\r';
if(aszTemp[i] == 0 && aszTemp[i + 1] == 0)
{
aszTemp[i] = '\r';
aszTemp[i + 1] = 0;
break; //到尾
}
}
//寻找SZKEYNAME
if((szTemp = strstr(aszTemp, szKeyName)) == NULL)
{
return(-1);
}
//指针移到等号后面
if((szTemp = strstr(szTemp, "=")) == NULL)
{
return(-1);
}
szTemp ++;
//提取STRING
if((szTemp2 = strstr(szTemp, "\r")) == NULL)
{
strcpy(szReturnedString, szTemp);
}
else
{
memcpy(szReturnedString, szTemp, szTemp2 - szTemp);
szReturnedString[szTemp2 - szTemp] = 0;
}
return(0);
}
int CVSInterpreter::GetInstruction(struct CurrentState *pcurrentState, char *IID, char *LastIID, struct VSInstruction *pvsi)
{
/*****************************************************
得到由IID指定的指令
调用方法: vsInstruction vsi; GetInstruction(1, 0, &vsi);
LastIID这个参数实际上没用,考虑去掉(20000709)
(in)IID: 指令ID;
(out)pvsi: 传出的指令结构指针,需要由调用者来申请空间,但结构的成员要由本函数申请空间;
*****************************************************/
char szSection[100] = "\0";
char pTempBuf[MAX_LEN];
memset(pTempBuf, 0, MAX_LEN);
strcpy(szSection, IID);
//**************************************
/*
if(LastIID != NULL)
strcpy(pvsi->Last_IID, LastIID);
else
pvsi->Last_IID[0] = 0;
*/
strcpy(pvsi->Last_IID, pvsi->IID);
//**************************************
strcpy(pvsi->IID, IID);
//得到ACTION
if(GetString(pcurrentState->aszInstructionFile, szSection, KEY_ACTION, pTempBuf, sizeof(pTempBuf)) == -1)
{
wprintf_err2(pcurrentState, "Getinstruction(Action, Section=%s) failed", szSection);
DbgMessageBox("getinstruction(action) failed");
return(-1);
}
pvsi->szAction = (char *)realloc(pvsi->szAction, strlen(pTempBuf) + 1);
strcpy(pvsi->szAction, pTempBuf);
//得到INPARAM
if(GetString(pcurrentState->aszInstructionFile, szSection, KEY_INPARAM, pTempBuf, sizeof(pTempBuf)) == -1)
{
wprintf_err2(pcurrentState, "Getinstruction(InParam, Section=%s) failed", szSection);
DbgMessageBox("getinstruction(Inparam) failed");
return(-1);
}
pvsi->szInParam = (char *)realloc(pvsi->szInParam, strlen(pTempBuf) + 1);
strcpy(pvsi->szInParam, pTempBuf);
//得到NEXT
if(GetString(pcurrentState->aszInstructionFile, szSection, KEY_NEXT, pTempBuf, sizeof(pTempBuf)) == -1)
{
wprintf_err2(pcurrentState, "Getinstruction(Next, Section=%s) failed", szSection);
DbgMessageBox("getinstruction(next) failed");
return(-1);
}
pvsi->szNext = (char *)realloc(pvsi->szNext, strlen(pTempBuf) + 1);
strcpy(pvsi->szNext, pTempBuf);
//得到OUTPARAM
if(GetString(pcurrentState->aszInstructionFile, szSection, KEY_OUTPARAM, pTempBuf, sizeof(pTempBuf)) == -1)
{
wprintf_err2(pcurrentState, "Getinstruction(OutParam, Section=%s) failed", szSection);
DbgMessageBox("getinstruction(outparam) failed");
return(-1);
}
pvsi->szOutParam = (char *)realloc(pvsi->szOutParam, strlen(pTempBuf) + 1);
strcpy(pvsi->szOutParam, pTempBuf);
//得到ONERROR
if(GetString(pcurrentState->aszInstructionFile, szSection, KEY_ONERROR, pTempBuf, sizeof(pTempBuf)) == -1)
{
wprintf_err2(pcurrentState, "Getinstruction(OnError, Section=%s) failed", szSection);
DbgMessageBox("getinstruction(onerror) failed");
return(-1);
}
pvsi->szOnError = (char *)realloc(pvsi->szOnError, strlen(pTempBuf) + 1);
strcpy(pvsi->szOnError, pTempBuf);
return(0);
}
int CVSInterpreter::GetFirstIntruction(struct CurrentState *pcurrentState, struct VSInstruction *pvsi)
{
/*****************************************************
得到SCRIPT中第一个执行的指令,是由"[INITIALIZE]FIRSTINSTRUCTION="指令定义
调用方法: vsInstruction vsi; GetInstruction(&vsi);
*****************************************************/
char pTempBuf[MAX_LEN] = "\0";
int len;
//int iFirstInstructionID;
len = GetPrivateProfileString(SECTION_INITIALIZE, "FirstInstruction", DEFAULT_STRING, pTempBuf, 100, pcurrentState->aszInstructionFile);
if(strcmp(pTempBuf, DEFAULT_STRING) == 0)
{
AfxMessageBox("find(firstinstruction) failed");
return(-1);
}
if(len >= sizeof(pTempBuf) - 2)
{
AfxMessageBox("find(firstinstruction) failed");
return(-1);
}
// iFirstInstructionID = atoi(pTempBuf);
if(GetInstruction(pcurrentState, pTempBuf, NULL, pvsi) == -1)
{
AfxMessageBox("find(firstinstruction) failed");
return(-1);
}
return(0);
}
int CVSInterpreter::GetSection(char *szInstructionFileName, char *szSectionName, char *szSectionString, int nSize)
{
/*****************************************************
得到SCRIPT文件中由szSectionName指定的SECTION的所有内容
(in)szSectionName: 指定的SECTION名;
(out)szSectionString: 取出内容的存放空间, 需要调用者来事先分配空间;
(in)nSize: 存放空间的大小
*****************************************************/
int len;
szSectionString[0] = 0;
len = GetPrivateProfileSection(szSectionName, szSectionString, nSize, szInstructionFileName);
if(strlen(szSectionString) == 0)
{
wprintf_err1("Getsection(SectionName=%s) failed", szSectionName);
DbgMessageBox("getsection() failed");
return(-1);
}
if(len >= nSize - 2)
{
wprintf_err1("Getsection(SectionName=%s) failed", szSectionName);
DbgMessageBox("getsection() failed");
return(-1);
}
return(0);
}
char *szSection_Integer = NULL, *szSection_String = NULL, *szSection_Float = NULL;
int iSectionLen_Integer = 0, iSectionLen_String = 0, iSectionLen_Float = 0;
int CVSInterpreter::GetSection2(char *szInstructionFileName, char *szSectionName, char *szSectionString, int nSize)
{
/*****************************************************
得到SCRIPT文件中由szSectionName指定的SECTION的所有内容
(in)szSectionName: 指定的SECTION名;
(out)szSectionString: 取出内容的存放空间, 需要调用者来事先分配空间;
(in)nSize: 存放空间的大小
*****************************************************/
int len;
szSectionString[0] = 0;
if(szSection_Integer == NULL
|| szSection_String == NULL
|| szSection_Float == NULL)
{
len = GetPrivateProfileSection(szSectionName, szSectionString, nSize, szInstructionFileName);
if(strlen(szSectionString) == 0)
{
AfxMessageBox("getsection() failed");
return(-1);
}
if(len >= nSize - 2)
{
AfxMessageBox("getsection() failed");
return(-1);
}
if(stricmp(szSectionName, "predefine_integer") == 0)
{
iSectionLen_Integer = len + 1;
szSection_Integer = (char *)malloc(iSectionLen_Integer);
memcpy(szSection_Integer, szSectionString, iSectionLen_Integer);
}
if(stricmp(szSectionName, "predefine_string") == 0)
{
iSectionLen_String = len + 1;
szSection_String = (char *)malloc(iSectionLen_String);
memcpy(szSection_String, szSectionString, iSectionLen_String);
}
if(stricmp(szSectionName, "predefine_float") == 0)
{
iSectionLen_Float = len + 1;
szSection_Float = (char *)malloc(iSectionLen_Float);
memcpy(szSection_Float, szSectionString, iSectionLen_Float);
}
}
else
{
if(stricmp(szSectionName, "predefine_integer") == 0)
{
memcpy(szSectionString, szSection_Integer, iSectionLen_Integer);
}
if(stricmp(szSectionName, "predefine_string") == 0)
{
memcpy(szSectionString, szSection_String, iSectionLen_String);
}
if(stricmp(szSectionName, "predefine_float") == 0)
{
memcpy(szSectionString, szSection_Float, iSectionLen_Float);
}
}
return(0);
}
int CVSInterpreter::GetSection3(char *szInstructionFileName, char *szSectionName, char *szSectionString, int nSize)
{
/*****************************************************
得到SCRIPT文件中由szSectionName指定的SECTION的所有内容
不使用WINDOWS API--GetPrivateProfileSection(),而是扫描事先读入内存的INI文件
处理的时候不读入被";"注释掉的部分(";"前可以是制表符)
另外,以后要增加可以在KEYSTRING中出现"[]"的功能
(in)szSectionName: 指定的SECTION名;
(out)szSectionString: 取出内容的存放空间, 需要调用者来事先分配空间;
(in)nSize: 存放空间的大小
*****************************************************/
int i;
//找到对应脚本的缓冲
for(i = 0; i < m_vsFileBufList.iCount; i ++)
{
if(stricmp((m_vsFileBufList.vsFileBuf)[i].aszVSFileName, szInstructionFileName) == 0)
break;
}
if(i >= m_vsFileBufList.iCount)
return -1;
//寻找缓冲对应的SECTION
char *szFileBuf = (m_vsFileBufList.vsFileBuf)[i].szFileBuf;
char aszSectionName[100] = "\0";
if(strlen(szSectionName) > sizeof(aszSectionName) - 3)
return -1;
sprintf(aszSectionName, "[%s]", szSectionName);
char *szTemp = szFileBuf;
while(1)
{
szTemp = strstr(szTemp, aszSectionName);
if(szTemp == szFileBuf)
break;
if(szTemp == NULL)
return -1;
if((szTemp - 1)[0] != '\r' && (szTemp - 1)[0] != '\n')
{
szTemp ++;
continue;
}
else
brea
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -