📄 parse.c
字号:
OUT PTBX_UINT32 out_pun32TrunkNb);
TBX_RESULT TB640IsdnParseStackConfigurationLine(
IN const PTBX_CHAR in_pszLine,
IN const PTBX_CHAR in_pszOriginalLine,
IN TBX_UINT32 in_un32Line,
IN TBX_UINT32 in_un32Index,
IN TBX_UINT32 in_un32Adapter,
IN TBX_UINT32 in_un32TrunkNb);
TBX_RESULT TB640IsdnParseCTBusConfigurationLine(
IN const PTBX_CHAR in_pszLine,
IN const PTBX_CHAR in_pszOriginalLine,
IN TBX_UINT32 in_un32Line,
IN TBX_UINT32 in_un32Index,
IN PTBX_BOOL out_fCTBusConn);
TBX_RESULT
TB640IsdnParseDoConfigurationLine(
IN const PTBX_CHAR in_pszLine,
IN const PTBX_CHAR in_pszOriginalLine,
IN TBX_UINT32 in_un32Line,
IN TBX_UINT32 in_un32Index,
IN PTBX_BOOL out_pfDoConn);
TBX_RESULT TB640IsdnParseCallConfigurationLine(
IN const PTBX_CHAR in_pszLine,
IN const PTBX_CHAR in_pszOriginalLine,
IN TBX_UINT32 in_un32Line,
IN TBX_UINT32 in_un32Index,
IN TBX_UINT32 in_un32Adapter,
IN TBX_UINT32 in_un32TrunkNb);
/* Utility functions */
TBX_RESULT TB640IsdnParseToken(
IN const PTBX_CHAR in_pszLine,
OUT PTB640_ISDN_PARSING_TOKEN out_pTokenType,
OUT PTBX_CHAR * out_ppszToken,
OUT PTBX_CHAR * out_ppszArgument);
TBX_RESULT TB640IsdnCompareEntries(
IN const PTBX_CHAR in_pszLine,
IN PTB640_ISDN_PARSING_ENTRY in_paParsingEntries,
OUT PTBX_UINT32 out_pun32Value,
OUT PTBX_UINT32 out_pun32SizeOfEntry);
/*--------------------------------------------------------------------------------------------------------------------------------
| Implementation
*------------------------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------------------------
|
| TB640IsdnParseAndLoadConfiguration: This function parses the configuration file, validates its content and load the
| configuration value into our local structure. It does not allocate any resources nor
| stacks. This is done dynamically afterwards.
|
| in_pszFilename : Pointer to the filename to open
|
| Note : ~
|
| Return : TBX_RESULT_OK
| TBX_RESULT_NOT_FOUND
| TBX_RESULT_FAIL
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT
TB640IsdnParseAndLoadConfiguration(
IN PTBX_CHAR in_pszFilename)
{
FILE * pFileIn;
TBX_CHAR szLine [TB640_ISDN_MAX_CONFIGURATION_LINE_LENGTH];
TBX_UINT32 un32Line;
TBX_UINT32 un32Adapter;
TBX_UINT32 un32TrunkNb;
TBX_RESULT result;
TB640_ISDN_PARSING_TOKEN Token;
PTBX_CHAR pszLine;
PTBX_CHAR pszToken;
PTBX_CHAR pszArgument;
TBX_BOOL fUniqueIdPresent;
TBX_BOOL fLogFilenamePresent;
TBX_BOOL fLogFileLevelPresent;
TBX_BOOL fLogDisplayLevelPresent;
TBX_BOOL fParamGroup;
TBX_BOOL fTrunkGroup;
TBX_BOOL fAdapterGroup;
TBX_BOOL fTrunkConfigured;
TBX_BOOL fStackConfigured;
TBX_BOOL fCallConfigured;
TBX_BOOL fRefreshRateConfigured;
TBX_BOOL fCTBusConnConfigured;
TBX_BOOL fGatewayPortConfigured;
TBX_BOOL fDoConnConfigured;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pFileIn = NULL;
fParamGroup = TBX_FALSE;
fTrunkGroup = TBX_FALSE;
fAdapterGroup = TBX_FALSE;
fLogFilenamePresent = TBX_FALSE;
fLogFileLevelPresent = TBX_FALSE;
fLogDisplayLevelPresent = TBX_FALSE;
fUniqueIdPresent = TBX_FALSE;
fRefreshRateConfigured = TBX_FALSE;
fCTBusConnConfigured = TBX_FALSE;
un32Adapter = (TBX_UINT32)-1;
/* Try to open the configuration file in text mode */
pFileIn = fopen (in_pszFilename, "r");
if (pFileIn == NULL)
{
TBX_EXIT_ERROR(TBX_RESULT_NOT_FOUND, 0, "Unable to open configuration file");
}
/* Parse every line */
un32Line = 0;
while (!feof (pFileIn))
{
/* Read one line from the configuration file */
un32Line++;
szLine[0] = '\0';
pszLine = fgets (szLine, sizeof(szLine),pFileIn);
TbxStringRemoveBlanks( szLine );
/* Have we reached the end-of-file ? */
if (pszLine == NULL)
{
continue;
}
/* Convert to caps */
TB640IsdnToUpper (pszLine);
/* Parse the token */
TB640IsdnParseToken (pszLine, &Token, &pszToken, &pszArgument);
/* Decide what to do with this token */
switch (Token)
{
/* Comment processing */
case TB640_ISDN_PARSING_TOKEN_COMMENT:
/* Go to next line */
break;
/* Adapter group start */
case TB640_ISDN_PARSING_TOKEN_ADAPTER_GROUP_START:
if ((fAdapterGroup == TBX_FALSE) && (fParamGroup == TBX_FALSE))
{
if (++un32Adapter <= TB640_ISDN_MAX_SUPPORTED_ADAPTERS)
{
fAdapterGroup = TBX_TRUE;
g_AppContext->un32NbAdapter++;
strcpy (g_AppContext->ahAdapterInfo [un32Adapter].szAdapterName, pszArgument);
}
else
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Too many adapter group");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
}
else
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected .ADAPTER group start");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
break;
/* Param group start flag processing */
case TB640_ISDN_PARSING_TOKEN_PARAMS_GROUP_START:
if ((fParamGroup == TBX_FALSE) && (fTrunkGroup == TBX_FALSE) && (fAdapterGroup == TBX_FALSE))
fParamGroup = TBX_TRUE;
else
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected .PARAMS group start");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
break;
/* Trunk group start flag processing */
case TB640_ISDN_PARSING_TOKEN_TRUNK_GROUP_START:
if ((fParamGroup == TBX_FALSE) && (fTrunkGroup == TBX_FALSE) && (fAdapterGroup == TBX_TRUE))
{
g_AppContext->ahAdapterInfo [un32Adapter].un32NbTrunk++;
fTrunkGroup = TBX_TRUE;
fTrunkConfigured = TBX_FALSE;
fStackConfigured = TBX_FALSE;
fCallConfigured = TBX_FALSE;
}
else
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected .TRUNK group start");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
break;
/* Group end flag processing */
case TB640_ISDN_PARSING_TOKEN_GROUP_END:
if (fParamGroup != TBX_FALSE)
{
if(fCTBusConnConfigured == TBX_FALSE)
{
/* set default parameter */
g_AppContext->fCTBusConnection = TBX_FALSE;
}
if( fDoConnConfigured == TBX_FALSE )
{
/* set default parameter */
g_AppContext->fDoConnection = TBX_FALSE;
}
fParamGroup = TBX_FALSE;
}
else if (fTrunkGroup != TBX_FALSE)
{
if (fTrunkConfigured == TBX_FALSE)
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Missing trunk configuration in trunk group");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
if (fStackConfigured == TBX_FALSE)
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Missing stack configuration in trunk group");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
if (fCallConfigured == TBX_FALSE)
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Missing call configuration in trunk group");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
fTrunkGroup = TBX_FALSE;
}
else if (fAdapterGroup != TBX_FALSE)
fAdapterGroup = TBX_FALSE;
else
{
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected .END");
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
}
break;
/* Trunk configuration line processing */
case TB640_ISDN_PARSING_TOKEN_TRUNK_CONFIG:
TB640_ISDN_PARSE_TRUNK_LINE_VALIDATE (TB640_ISDN_PARSING_TOKEN_TRUNK_CONFIG);
/* Process the trunk configuration */
fTrunkConfigured = TBX_TRUE;
result = TB640IsdnParseTrunkConfigurationLine (pszArgument, pszLine, un32Line, (pszArgument-pszLine), un32Adapter, &un32TrunkNb);
if (TBX_RESULT_FAILURE (result))
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
break;
/* Stack configuration line processing */
case TB640_ISDN_PARSING_TOKEN_STACK_CONFIG:
TB640_ISDN_PARSE_TRUNK_LINE_VALIDATE (TB640_ISDN_PARSING_TOKEN_STACK_CONFIG);
/* Process the stack configuration */
fStackConfigured = TBX_TRUE;
result = TB640IsdnParseStackConfigurationLine (pszArgument, pszLine, un32Line, (pszArgument-pszLine), un32Adapter, un32TrunkNb);
if (TBX_RESULT_FAILURE (result))
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
break;
/* Call configuration line processing */
case TB640_ISDN_PARSING_TOKEN_CALL_CONFIG:
TB640_ISDN_PARSE_TRUNK_LINE_VALIDATE (TB640_ISDN_PARSING_TOKEN_CALL_CONFIG);
/* Process the call configuration */
fCallConfigured = TBX_TRUE;
result = TB640IsdnParseCallConfigurationLine (pszArgument, pszLine, un32Line, (pszArgument-pszLine), un32Adapter, un32TrunkNb);
if (TBX_RESULT_FAILURE (result))
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL);
break;
/* "Log filename" line processing */
case TB640_ISDN_PARSING_TOKEN_LOG_FILENAME:
{
TBX_CHAR szNewFilename [128];
time_t tTime;
struct tm * pTime;
TB640_ISDN_PARSE_PARAMS_LINE_VALIDATE();
/* Open the log file */
TB640IsdnToLower (pszArgument);
strncpy (g_AppContext->szFilename, pszArgument, sizeof (g_AppContext->szFilename));
g_AppContext->szFilename[ sizeof(g_AppContext->szFilename) - 1 ] = '\0';
/* Keep space for _%d at the end of filename */
g_AppContext->szFilename [sizeof (g_AppContext->szFilename)-8] = '\0';
sprintf (szNewFilename, "%s_%d", g_AppContext->szFilename, g_AppContext->un32LogNumber++ );
g_AppContext->pLogFile = fopen (szNewFilename, "w+");
if (NULL == g_AppContext->pLogFile)
{
TBX_EXIT_ERROR(TBX_RESULT_FAIL, 0, "Unable to open log file");
}
/* Get the time of day */
time (&tTime);
pTime = localtime( &tTime );
/* Print a string to the log file... */
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "ISDN sample application\n");
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "Copyright (c)2003 by Telcobridges inc.\n");
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "Application instance run on %s", asctime(pTime));
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "----------------------------------------------------------------\n\n");
fLogFilenamePresent = TBX_TRUE;
}
break;
/* Log file level processing */
case TB640_ISDN_PARSING_TOKEN_LOG_FILE_LEVEL:
g_AppContext->un32FileLogLevel = atoi (pszArgument);
fLogFileLevelPresent = TBX_TRUE;
break;
/* Log display level processing */
case TB640_ISDN_PARSING_TOKEN_LOG_DISPLAY_LEVEL:
g_AppContext->un32DisplayLogLevel = atoi (pszArgument);
fLogDisplayLevelPresent = TBX_TRUE;
break;
/* Application unique ID */
case TB640_ISDN_PARSING_TOKEN_APP_UNIQUE_ID:
g_AppContext->un64AppUniqueId = atoi (pszArgument);
fUniqueIdPresent = TBX_TRUE;
break;
/* Minimum refresh rate */
case TB640_ISDN_PARSING_TOKEN_MIN_REFRESH:
g_AppContext->un32MinRefreshDelayMsec = atoi (pszArgument);
fRefreshRateConfigured = TBX_TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -