⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vsinterpreter.cpp

📁 基于dialogic语音卡的IVR系统源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -