📄 vsinterpreter.cpp
字号:
if(i < pcurrentState->m_universalVariableList_Integer.nCount)
{//已存在于通用变量表中, 直接赋值
if(bOverride)
{
*(int *)(pGlobalVariable->pVariable) = iValue;
pGlobalVariable->nSize = sizeof(int);
pGlobalVariable->iType = DATATYPE_INTEGER;
}
return 0;
}
pcurrentState->m_universalVariableList_Integer.nCount ++;
iCount = pcurrentState->m_universalVariableList_Integer.nCount;
pcurrentState->m_universalVariableList_Integer.Global = (struct GlobalVariable *)realloc(pcurrentState->m_universalVariableList_Integer.Global, iCount * sizeof(struct GlobalVariable));
iIndex = iCount - 1;
pGlobalVariable = pcurrentState->m_universalVariableList_Integer.Global + iIndex;
pGlobalVariable->pVariable = (int *)malloc(sizeof(int));
*(int *)(pGlobalVariable->pVariable) = iValue;
pGlobalVariable->szName = (char *)malloc(strlen(szName) + 1);
strcpy(pGlobalVariable->szName, szName);
pGlobalVariable->nSize = sizeof(int);
pGlobalVariable->iType = DATATYPE_INTEGER; //浮点类型
return(0);
}
int CVSInterpreter::AddUniversal_String(struct CurrentState *pcurrentState, char *szName, char *szValue, BOOL bOverride)
{
int iCount;
struct GlobalVariable *pGlobalVariable;
int iIndex;
//检查是否已存在于全局变量表中
int i;
for(i = 0; i < pcurrentState->m_universalVariableList_String.nCount; i ++)
{
pGlobalVariable = pcurrentState->m_universalVariableList_String.Global + i;
if(stricmp(pGlobalVariable->szName, szName) == 0)
break;
}
if(i < pcurrentState->m_universalVariableList_String.nCount)
{//已存在于全局变量表中, 直接赋值
if(bOverride)
{
if(szValue == NULL)
{
pGlobalVariable->pVariable = NULL;
pGlobalVariable->nSize = 0;
}
else
{
pGlobalVariable->pVariable = realloc(pGlobalVariable->pVariable, strlen(szValue) + 1);
strcpy((char *)(pGlobalVariable->pVariable), szValue);
pGlobalVariable->nSize = strlen(szValue) + 1;
}
pGlobalVariable->iType = DATATYPE_STRING;
}
return 0;
}
//新变量
pcurrentState->m_universalVariableList_String.nCount ++;
iCount = pcurrentState->m_universalVariableList_String.nCount;
pcurrentState->m_universalVariableList_String.Global = (struct GlobalVariable *)realloc(pcurrentState->m_universalVariableList_String.Global, iCount * sizeof(struct GlobalVariable));
iIndex = iCount - 1;
pGlobalVariable = pcurrentState->m_universalVariableList_String.Global + iIndex;
if(szValue == NULL)
{
pGlobalVariable->pVariable = NULL;
pGlobalVariable->nSize = 0;
}
else
{
pGlobalVariable->pVariable = (char *)malloc(strlen(szValue) + 1);
strcpy((char *)pGlobalVariable->pVariable, szValue);
pGlobalVariable->nSize = strlen(szValue) + 1;
}
pGlobalVariable->szName = (char *)malloc(strlen(szName) + 1);
strcpy(pGlobalVariable->szName, szName);
pGlobalVariable->iType = DATATYPE_STRING;
return(0);
}
int CVSInterpreter::AddUniversal_Float(struct CurrentState *pcurrentState, char *szName, float fValue, BOOL bOverride)
{
int iCount;
struct GlobalVariable *pGlobalVariable;
int iIndex;
//检查是否已存在于全局变量表中
int i;
for(i = 0; i < pcurrentState->m_universalVariableList_Float.nCount; i ++)
{
pGlobalVariable = pcurrentState->m_universalVariableList_Float.Global + i;
if(stricmp(pGlobalVariable->szName, szName) == 0)
break;
}
if(i < pcurrentState->m_universalVariableList_Float.nCount)
{//已存在于全局变量表中, 直接赋值
if(bOverride)
{
*(float *)(pGlobalVariable->pVariable) = fValue;
pGlobalVariable->nSize = sizeof(float);
pGlobalVariable->iType = DATATYPE_FLOAT;
}
return 0;
}
pcurrentState->m_universalVariableList_Float.nCount ++;
iCount = pcurrentState->m_universalVariableList_Float.nCount;
pcurrentState->m_universalVariableList_Float.Global = (struct GlobalVariable *)realloc(pcurrentState->m_universalVariableList_Float.Global, iCount * sizeof(struct GlobalVariable));
iIndex = iCount - 1;
pGlobalVariable = pcurrentState->m_universalVariableList_Float.Global + iIndex;
pGlobalVariable->pVariable = (float *)malloc(sizeof(float));
*(float *)(pGlobalVariable->pVariable) = fValue;
pGlobalVariable->szName = (char *)malloc(strlen(szName) + 1);
strcpy(pGlobalVariable->szName, szName);
pGlobalVariable->nSize = sizeof(float);
pGlobalVariable->iType = DATATYPE_FLOAT; //浮点类型
return(0);
}
int CVSInterpreter::ClearCurrentState(struct CurrentState *pcurrentState)
{
/*****************************************************
清空pcurrentState结构中的用户数据, 和其他数据
*****************************************************/
/*改为下面一种方式,才能继续保留脚本中定义的初值
int i;
int iCount;
iCount = pcurrentState->m_globalVariableList_Integer.nCount;
for(i = 0; i < iCount; i ++)
{
//空间固定,不需释放
*(int *)((pcurrentState->m_globalVariableList_Integer.Global + i)->pVariable) = 0;
}
iCount = pcurrentState->m_globalVariableList_String.nCount;
for(i = 0; i < iCount; i ++)
{
free((pcurrentState->m_globalVariableList_String.Global + i)->pVariable);
(pcurrentState->m_globalVariableList_String.Global + i)->pVariable = NULL;
}
iCount = pcurrentState->m_globalVariableList_Float.nCount;
for(i = 0; i < iCount; i ++)
{
//空间固定,不需释放
*(float *)((pcurrentState->m_globalVariableList_Float.Global + i)->pVariable) = 0;
}
*/
//为各通道初始化SCRIPT中定义的全局变量
if(InitializeGlobal_Integer(pcurrentState) == -1)
return(-1);
if(InitializeGlobal_String(pcurrentState) == -1)
return(-1);
if(InitializeGlobal_Float(pcurrentState) == -1)
return(-1);
//为各通道初始化SCRIPT中定义的通用变量
if(InitializeUniversalVariable(pcurrentState) != 0)
return -1;
return(0);
}
int CVSInterpreter::FreeCurrentState(struct CurrentState *pcurrentState)
{
/*****************************************************
释放CURRENTSTATE, 和它的如下成员
m_globalVariableList_Integer.Global
m_globalVariableList_String.Global
m_globalVariableList_Float.Global
*****************************************************/
int i;
for(i = 0; i < pcurrentState->m_globalVariableList_Integer.nCount; i ++)
{
free((pcurrentState->m_globalVariableList_Integer.Global)[i].pVariable);
free((pcurrentState->m_globalVariableList_Integer.Global)[i].szName);
}
free(pcurrentState->m_globalVariableList_Integer.Global);
for(i = 0; i < pcurrentState->m_globalVariableList_String.nCount; i ++)
{
free((pcurrentState->m_globalVariableList_String.Global)[i].pVariable);
free((pcurrentState->m_globalVariableList_String.Global)[i].szName);
}
free(pcurrentState->m_globalVariableList_String.Global);
for(i = 0; i < pcurrentState->m_globalVariableList_Float.nCount; i ++)
{
free((pcurrentState->m_globalVariableList_Float.Global)[i].pVariable);
free((pcurrentState->m_globalVariableList_Float.Global)[i].szName);
}
free(pcurrentState->m_globalVariableList_Float.Global);
free(pcurrentState);
return 0;
}
int CVSInterpreter::InitializeGlobal_Integer(struct CurrentState *pcurrentState)
{
/*****************************************************
取得[PREDEFINE]中的全局变量,并初始化GlobalVariableList
*****************************************************/
char pTempBuf[MAX_LEN] = "\0", pTempBuf2[MAX_LEN] = "\0"; //假设全部变量的字符串长度不超过MAX_LEN
char *pTempBuf3;
char *szTempSection;
int iIndex = 0;
int iCount = 0;
//初始化全局变量
if(GetSection3(pcurrentState->aszInstructionFile, "predefine_integer", pTempBuf, sizeof(pTempBuf)) == -1)
{
AfxMessageBox("getsection(predefine) failed");
return(-1);
}
if(strlen(pTempBuf) == 0) //没有定义全局变量
return(0);
//首先初始化内部整形变量(ResultSet_RowCount, ResultSet_ColCount)
//和LastIID
if(AddGlobal_Integer(pcurrentState, RESULTSET_ROWCOUNT, 0) == -1
|| AddGlobal_Integer(pcurrentState, RESULTSET_COLCOUNT, 0) == -1)
{
AfxMessageBox("error addglobal(resultset_???count");
return(-1);
}
//逐个取出[PREDEFINE]中定义的全局变量
szTempSection = pTempBuf;
while(1)
{
if(szTempSection[0] == 0)
break;
strcpy(pTempBuf2, szTempSection);
szTempSection += strlen(pTempBuf2) + 1; //移动pTempBuf的指针
int iOriginValue;
if((pTempBuf3 = strstr(pTempBuf2, "=")) != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
//先不理会"="后面的初值
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
//取初值
iOriginValue = atoi(pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
iOriginValue = 0;
}
//找到一个变量名,对其初始化
if(AddGlobal_Integer(pcurrentState, pTempBuf2, iOriginValue) == -1)
{
AfxMessageBox("error AddGlobal_Integer()");
return(-1);
}
}
return(0);
}
int CVSInterpreter::InitializeGlobal_String(struct CurrentState *pcurrentState)
{
/*****************************************************
取得[PREDEFINE_STRING]中的全局变量,并初始化GlobalVariableList
*****************************************************/
char pTempBuf[MAX_LEN] = "\0", pTempBuf2[MAX_LEN] = "\0"; //假设全部变量的字符串长度不超过MAX_LEN
char *pTempBuf3;
char *szTempSection;
int iIndex = 0;
//初始化全局变量
if(GetSection3(pcurrentState->aszInstructionFile, "predefine_string", pTempBuf, sizeof(pTempBuf)) == -1)
{
AfxMessageBox("getsection(predefine) failed");
return(-1);
}
if(strlen(pTempBuf) == 0) //没有定义全局变量
return(0);
/*没有用,LASTIID实际上是在PVSI中的ASZLASTIID中保存,参见GETGLOBALVALUE_STRING中的解释
//首先初始化内部字符串型变量LastIID和szVoiceList和VoiceList
if(AddGlobal_String(pcurrentState, LASTIID, 0) == -1)
{
AfxMessageBox("error addglobal(LastIID)");
return(-1);
}
*/
//逐个取出[PREDEFINE]中定义的全局变量
szTempSection = pTempBuf;
char aszOriginValue[MAX_LEN];
while(1)
{
if(szTempSection[0] == 0)
break;
strcpy(pTempBuf2, szTempSection);
szTempSection += strlen(pTempBuf2) + 1; //移动pTempBuf的指针
if((pTempBuf3 = strstr(pTempBuf2, "=")) != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
//先不理会"="后面的初值
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
strcpy(aszOriginValue, pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
aszOriginValue[0] = 0;
}
//找到一个变量名,对其初始化,有初值才申请变量指针空间,无初值的话在以后需要用到时才申请
if(AddGlobal_String(pcurrentState, pTempBuf2, aszOriginValue) == -1)
{
AfxMessageBox("error AddGlobal_String()");
return(-1);
}
}
return(0);
}
int CVSInterpreter::InitializeGlobal_Float(struct CurrentState *pcurrentState)
{
/*****************************************************
取得[PREDEFINE]中的全局变量,并初始化GlobalVariableList
*****************************************************/
char pTempBuf[MAX_LEN] = "\0", pTempBuf2[MAX_LEN] = "\0"; //假设全部变量的字符串长度不超过MAX_LEN
char *pTempBuf3;
char *szTempSection;
int iIndex = 0;
int iCount = 0;
//初始化全局变量
if(GetSection3(pcurrentState->aszInstructionFile, "predefine_float", pTempBuf, sizeof(pTempBuf)) == -1)
{
AfxMessageBox("getsection(predefine_float) failed");
return(-1);
}
if(strlen(pTempBuf) == 0) //没有定义全局变量
return(0);
//逐个取出[PREDEFINE_FLOAT]中定义的全局变量
szTempSection = pTempBuf;
while(1)
{
if(szTempSection[0] == 0)
break;
strcpy(pTempBuf2, szTempSection);
szTempSection += strlen(pTempBuf2) + 1; //移动pTempBuf的指针
float fOriginValue;
if((pTempBuf3 = strstr(pTempBuf2, "=")) != NULL)
{//取出来的一行包含"=",将它和以后字符串去掉后的字符当作变量名
//先不理会"="后面的初值
pTempBuf2[pTempBuf3 - pTempBuf2] = 0; //'='置为0
fOriginValue = (float)atof(pTempBuf3 + 1);
}
else
{//取出来的一行不包含"=",将整行字符当作变量名
fOriginValue = 0;
}
//找到一个变量名,对其初始化为0
if(AddGlobal_Float(pcurrentState, pTempBuf2, fOriginValue) == -1)
{
AfxMessageBox("error AddGlobal_Float()");
return(-1);
}
}
return(0);
}
int CVSInterpreter::InitializeUniversalVariable(struct CurrentState *pcurrentState, BOOL bOverride)
{
/**************************************************************
初始化通用变量(包括整数,字符串,浮点)
可以在脚本中不定义通用变量
通用变量:在所有脚本中都有效,无论是否JUMP到其他脚本中执行
(如果JUMP到的其他脚本中有此变量,则保留原有值)
参数: bOverride 表明如果在m_universalVariableList中已有此变量,是否要按照脚本中定义的初值赋值
**************************************************************/
char pTempBuf[MAX_LEN] = "\0", pTempBuf2[MAX_LEN] = "\0"; //假设全部变量的字符串长度不超过MAX_LEN
char *pTempBuf3;
char *szTempSection;
int iIndex = 0;
int iCount = 0;
int i;
char ppSectionName[3][100] = {"UniversalVariable_Integer",
"UniversalVariable_String",
"UniversalVariable_Float"};
for(i = 0; i < 3; i ++)
{
//初始化整型的通用变量
if(GetSection3(pcurrentState->aszInstructionFile, ppSectionName[i], pTempBuf, sizeof(pTempBuf)) == -1)
{
continue;
}
if(strlen(pTempBuf) == 0) //没有定义通用变量
continue;
//逐个取出[UniversalVariable]中定义的通用变量
szTempSection = pTempBuf;
while(1)
{
if(szTempSection[0] == 0)
break;
strcpy(pTempBuf2, szTempSection);
szTempSection += strlen(pTempBuf2) + 1; //移动pTempBuf的指针
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -