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

📄 vsinterpreter.cpp

📁 基于dialogic语音卡的IVR系统源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			//找到一个变量名,对其初始化
			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 + -