📄 parse.c
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
|
| Project: VoiceLink TB640 sample (ISDN)
|
| Filename: parse.c
|
| Copyright: TelcoBridges 2002-2003, All Rights Reserved
|
| Description: This file contains the configuration script parsing
|
| Notes: Tabs = 4
|
*-------------------------------------------------------------------------------------------------------------------------------
|
| Revision: $Revision: 1.27.2.1 $
|
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Includes
*------------------------------------------------------------------------------------------------------------------------------*/
/* System includes */
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
/* Local includes */
#include "tbx_ostypes.h"
#include "tbx_id.h"
#include "tbx_result.h"
#include "tbx_msg.h"
#include "tbx_std.h"
#include "tbx_api.h"
#include "tbx_featmgr.h"
#include "tb640_id.h"
#include "tb640_handle.h"
#include "tb640_adpmgr.h"
#include "tb640_trkmgr.h"
#include "tb640_isdnmgr.h"
#include "tbx_os_wrapper.h"
#include "tbx_hash.h"
#include "tbx_pool_of_buffers.h"
#include "tbx_timer.h"
#include "tbxasync.h"
#include "tbx_cli.h"
#include "isdn.h"
#include "prototypes.h"
#include "macros.h"
/*--------------------------------------------------------------------------------------------------------------------------------
| Forward declarations
*------------------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------------------
| Defines
*------------------------------------------------------------------------------------------------------------------------------*/
#define TB640_ISDN_PARSING_DELIMITERS " \t\n\r"
#define TB640_ISDN_LINE_PARSING_DELIMITERS ", \t\n\r"
/*--------------------------------------------------------------------------------------------------------------------------------
| Types
*------------------------------------------------------------------------------------------------------------------------------*/
/*
| The following enumeration describes the different types of token that can be read from the configuration file
*/
typedef enum _TB640_ISDN_PARSING_TOKEN
{
TB640_ISDN_PARSING_TOKEN_COMMENT = 0,
TB640_ISDN_PARSING_TOKEN_PARAMS_GROUP_START = 1,
TB640_ISDN_PARSING_TOKEN_TRUNK_GROUP_START = 2,
TB640_ISDN_PARSING_TOKEN_GROUP_END = 3,
TB640_ISDN_PARSING_TOKEN_TRUNK_CONFIG = 4,
TB640_ISDN_PARSING_TOKEN_STACK_CONFIG = 5,
TB640_ISDN_PARSING_TOKEN_CALL_CONFIG = 6,
TB640_ISDN_PARSING_TOKEN_LOG_FILENAME = 7,
TB640_ISDN_PARSING_TOKEN_LOG_FILE_LEVEL = 8,
TB640_ISDN_PARSING_TOKEN_LOG_DISPLAY_LEVEL = 9,
TB640_ISDN_PARSING_TOKEN_ADAPTER_GROUP_START = 10,
TB640_ISDN_PARSING_TOKEN_APP_UNIQUE_ID = 11,
TB640_ISDN_PARSING_TOKEN_MIN_REFRESH = 12,
TB640_ISDN_PARSING_TOKEN_CTBUS_CONNECTION = 13,
TB640_ISDN_PARSING_TOKEN_DO_CONNECTION = 14,
TB640_ISDN_PARSING_TOKEN_GATEWAY_PORT = 15,
TB640_ISDN_PARSING_TOKEN_UNKNOWN = 16
} TB640_ISDN_PARSING_TOKEN, *PTB640_ISDN_PARSING_TOKEN;
/*--------------------------------------------------------------------------------------------------------------------------------
| Versioning
*------------------------------------------------------------------------------------------------------------------------------*/
#ifdef WIN32
/*@unused@*/ static char g_szFileVersion [] = "$Revision: 1.27.2.1 $";
#endif
/*--------------------------------------------------------------------------------------------------------------------------------
| Global variables
*------------------------------------------------------------------------------------------------------------------------------*/
static TB640_ISDN_PARSING_ENTRY g_aParseMainConfigItems [] = {
{ ".PARAMS", TB640_ISDN_PARSING_TOKEN_PARAMS_GROUP_START},
{ ".TRUNK", TB640_ISDN_PARSING_TOKEN_TRUNK_GROUP_START},
{ ".END", TB640_ISDN_PARSING_TOKEN_GROUP_END},
{ "TRUNK_CFG=", TB640_ISDN_PARSING_TOKEN_TRUNK_CONFIG},
{ "STACK_CFG=", TB640_ISDN_PARSING_TOKEN_STACK_CONFIG},
{ "CALL_CFG=", TB640_ISDN_PARSING_TOKEN_CALL_CONFIG},
{ "LOG_FILENAME=", TB640_ISDN_PARSING_TOKEN_LOG_FILENAME},
{ "LOG_FILE_LEVEL=", TB640_ISDN_PARSING_TOKEN_LOG_FILE_LEVEL},
{ "LOG_DISPLAY_LEVEL=", TB640_ISDN_PARSING_TOKEN_LOG_DISPLAY_LEVEL},
{ "APP_UNIQUE_ID=", TB640_ISDN_PARSING_TOKEN_APP_UNIQUE_ID},
{ ".ADAPTER=", TB640_ISDN_PARSING_TOKEN_ADAPTER_GROUP_START},
{ "MIN_REFRESH=", TB640_ISDN_PARSING_TOKEN_MIN_REFRESH},
{ "CTBUS_CONNECTION=", TB640_ISDN_PARSING_TOKEN_CTBUS_CONNECTION},
{ "DO_CONNECTION=", TB640_ISDN_PARSING_TOKEN_DO_CONNECTION},
{ "TBX_GW_PORT=", TB640_ISDN_PARSING_TOKEN_GATEWAY_PORT},
{ NULL, 0}
};
static TB640_ISDN_PARSING_ENTRY g_aParseBoolean [] = {
{ "TRUE", TBX_TRUE},
{ "1", TBX_TRUE},
{ "Y", TBX_TRUE},
{ "FALSE", TBX_FALSE},
{ "0", TBX_FALSE},
{ "N", TBX_FALSE},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkTypes [] = {
{ "E1", TB640_TRUNK_TYPE_E1},
{ "T1", TB640_TRUNK_TYPE_T1},
{ "J1", TB640_TRUNK_TYPE_J1},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkE1Framing [] = {
{ "DFRAME", TB640_E1_FRAMING_DFRAME_NOCRC4},
{ "MFRAME", TB640_E1_FRAMING_MFRAME_CRC4},
{ "AUTO", TB640_E1_FRAMING_AUTO},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkE1Encoding [] = {
{ "HDB3", TB640_E1_LINE_ENCODING_HDB3},
{ "AMI", TB640_E1_LINE_ENCODING_AMI},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkE1Termination [] = {
{ "SHORT", TB640_E1_LINE_TERMINATION_SHORT},
{ "LONG", TB640_E1_LINE_TERMINATION_LONG},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkT1Framing [] = {
{ "SF", TB640_T1_FRAMING_SF},
{ "ESF", TB640_T1_FRAMING_ESF},
{ "SLC96", TB640_T1_FRAMING_SLC96},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkT1Encoding [] = {
{ "B8ZS", TB640_T1_LINE_ENCODING_B8ZS},
{ "AMI", TB640_T1_LINE_ENCODING_AMI},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkT1Termination [] = {
{ "SHORT", TB640_T1_LINE_TERMINATION_SHORT},
{ "LONG", TB640_T1_LINE_TERMINATION_LONG},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkJ1Framing [] = {
{ "SF", TB640_J1_FRAMING_SF},
{ "ESF", TB640_J1_FRAMING_ESF},
{ "SLC96", TB640_J1_FRAMING_SLC96},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkJ1Encoding [] = {
{ "B8ZS", TB640_J1_LINE_ENCODING_B8ZS},
{ "AMI", TB640_J1_LINE_ENCODING_AMI},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseTrunkJ1Termination [] = {
{ "SHORT", TB640_J1_LINE_TERMINATION_SHORT},
{ "LONG", TB640_J1_LINE_TERMINATION_LONG},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseStackVariant [] = {
{ "4ESS", TB640_ISDN_VARIANT_4ESS},
{ "AUS", TB640_ISDN_VARIANT_AUS_PRI},
{ "5ESS", TB640_ISDN_VARIANT_5ESS_PRI},
{ "NET5", TB640_ISDN_VARIANT_NET5},
{ "DMS", TB640_ISDN_VARIANT_DMS_PRI},
{ "NI2", TB640_ISDN_VARIANT_US_NI2_PRI},
{ "HK", TB640_ISDN_VARIANT_HONG_KONG_PRI},
{ "INS", TB640_ISDN_VARIANT_JAPAN_INS},
{ NULL, 0}
};
TB640_ISDN_PARSING_ENTRY g_aParseStackSide [] = {
{ "USER", TB640_PROTOCOL_SIDE_USER},
{ "NETWORK", TB640_PROTOCOL_SIDE_NETWORK},
{ NULL, 0}
};
/*--------------------------------------------------------------------------------------------------------------------------------
| Macros
*------------------------------------------------------------------------------------------------------------------------------*/
#define TB640_ISDN_PARSE_ERROR_DISPLAY(__Line__,__Index__,__pOriginalString__,__pErrorDescriptionString__) \
{ \
TBX_UINT32 un32Count; \
TBX_CHAR szPrintLine [TB640_ISDN_MAX_CONFIGURATION_LINE_LENGTH]; \
\
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "Error in configuration file at line %d\n", (__Line__)); \
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, "\t%s\n", (__pOriginalString__)); \
szPrintLine [0] = '\t'; \
for (un32Count=0; un32Count<(TBX_UINT32)(__Index__);un32Count++) \
{ \
szPrintLine [un32Count+1] = ' '; \
} \
szPrintLine [un32Count+1] = 0; \
sprintf (&(szPrintLine [un32Count+1]), "^ %s\n", (__pErrorDescriptionString__)); \
TB640_ISDN_LOG (TRACE_LEVEL_ALWAYS, szPrintLine); \
}
#define TB640_ISDN_PARSE_TRUNK_LINE_VALIDATE(__TokenTrunk__) \
{ \
if (fTrunkGroup == TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected configuration line (must be within a trunk group)"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
if (TB640_ISDN_PARSING_TOKEN_TRUNK_CONFIG == (__TokenTrunk__)) \
{ \
if (fTrunkConfigured != TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Trunk already configured in the group"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
} \
else if (TB640_ISDN_PARSING_TOKEN_STACK_CONFIG == (__TokenTrunk__)) \
{ \
if (fStackConfigured != TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Stack already configured in the group"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
if (fTrunkConfigured == TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Trunk configuration needs to be specified before stack configuration"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
} \
else if (TB640_ISDN_PARSING_TOKEN_CALL_CONFIG == (__TokenTrunk__)) \
{ \
if (fCallConfigured != TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Call already configured in the group"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
if (fStackConfigured == TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Stack configuration needs to be specified before call configuration"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
if (fTrunkConfigured == TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Trunk configuration needs to be specified before call configuration"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
} \
else \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected trunk token"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
}
#define TB640_ISDN_PARSE_PARAMS_LINE_VALIDATE() \
{ \
if (fParamGroup == TBX_FALSE) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (un32Line, (pszToken-pszLine), pszLine, "Unexpected configuration line (must be within a param group)"); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
}
#define TB640_ISDN_PARSE_GET_PARAMETER(__aParseEntries__,__pun32Value__,__pErrorString__) \
{ \
*(__pun32Value__) = (TBX_UINT32)-1; \
TB640IsdnCompareEntries (pArg, (__aParseEntries__), (PTBX_UINT32)(__pun32Value__), &un32SizeOfEntry); \
if ((TBX_UINT32)-1 == *(__pun32Value__)) \
{ \
TB640_ISDN_PARSE_ERROR_DISPLAY (in_un32Line, (pArg-szLine+in_un32Index), in_pszOriginalLine, (__pErrorString__)); \
TBX_EXIT_SUCCESS(TBX_RESULT_FAIL); \
} \
}
#define TB640_ISDN_PARSE_GET_TRUNK_PARAMETER(__variable__,__aParseE1Entries__,__pE1ErrorString,__aParseT1Entries__,__pT1ErrorString,__aParseJ1Entries__,__pJ1ErrorString) \
{ \
if (pTrunkCfg->Type == TB640_TRUNK_TYPE_E1) \
{ \
/* Get the E1 framing type */ \
TB640_ISDN_PARSE_GET_PARAMETER ((__aParseE1Entries__), &(pTrunkCfg->Cfg.E1.__variable__), (__pE1ErrorString)); \
} \
else if (pTrunkCfg->Type == TB640_TRUNK_TYPE_T1) \
{ \
/* Get the T1 framing type */ \
TB640_ISDN_PARSE_GET_PARAMETER ((__aParseT1Entries__), &(pTrunkCfg->Cfg.T1.__variable__), (__pT1ErrorString)); \
} \
else \
{ \
/* Get the J1 framing type */ \
TB640_ISDN_PARSE_GET_PARAMETER ((__aParseJ1Entries__), &(pTrunkCfg->Cfg.J1.__variable__), (__pJ1ErrorString)); \
} \
}
/*--------------------------------------------------------------------------------------------------------------------------------
| Function Prototypes
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT TB640IsdnParseTrunkConfigurationLine(
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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -