248 lines
7.9 KiB
C
248 lines
7.9 KiB
C
|
#include "getcfg.h"
|
|||
|
#include "string.h"
|
|||
|
|
|||
|
typedef char PARAMBUF[MAX_LEN_BYTES_OF_LINE+1];
|
|||
|
/*
|
|||
|
return first visible char pointer from a string.
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef MIN
|
|||
|
#define MIN(a,b) a<b?a:b
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
char pLine[MAX_LEN_BYTES_OF_LINE+1], pOneSectionName[MAX_LEN_BYTES_OF_LINE+1];//<2F><><EFBFBD><EFBFBD>ΪʲôҪ<C3B4><D2AA>1
|
|||
|
int i,j,nIsMatch;
|
|||
|
char *pLineHead = NULL, *pValueHead = NULL,
|
|||
|
*pSectionNameHead = NULL, *pSectionTail = NULL, *pEquelMark = NULL;//<2F>Ⱥ<EFBFBD>=
|
|||
|
char QuotationMark;//<2F><><EFBFBD><EFBFBD>[]
|
|||
|
unsigned long nRetIndex, dwRet = R_USE_DEFAULT;
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
ConfigurationTokens g_DefaultConfigurationTokens = DEFAULT_CONFIG_TOKENS;
|
|||
|
|
|||
|
static ConfigurationTokens g_ConfigurationTokens = DEFAULT_CONFIG_TOKENS;
|
|||
|
|
|||
|
void SetConfigTokens( const ConfigurationTokens * pTokens )
|
|||
|
{
|
|||
|
g_ConfigurationTokens = *pTokens;
|
|||
|
}
|
|||
|
void SetConfigTokensDefault( ConfigurationTokens * pTokens )
|
|||
|
{
|
|||
|
*pTokens = g_DefaultConfigurationTokens;
|
|||
|
}
|
|||
|
char * FirstVisibleBYTE( char* pStr)
|
|||
|
{
|
|||
|
while( pStr )
|
|||
|
{
|
|||
|
switch( *pStr )
|
|||
|
{
|
|||
|
case '\t' : break;
|
|||
|
case ' ' : break;
|
|||
|
default : return pStr;
|
|||
|
}
|
|||
|
++pStr;
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
***ret : Return value
|
|||
|
***buffer : Source
|
|||
|
***line_token : Posible token of a line. token-<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
***return : Position next search should be
|
|||
|
******************************************************************************/
|
|||
|
|
|||
|
const char * ReadLnFromBuf(char *ret, int maxlen, const char *buffer, const char *line_token)
|
|||
|
{ //ReadLnFromBuf( pLine, MAX_LEN_BYTES_OF_LINE, pBuffer, g_ConfigurationTokens.LineEnd )
|
|||
|
char * sz;
|
|||
|
int i=0;
|
|||
|
|
|||
|
sz = ret;
|
|||
|
for( i=0; (i<maxlen) && (*buffer); i++, sz++, buffer++ )
|
|||
|
{
|
|||
|
if( strchr( line_token, *buffer )) /* The char is a token <20><><EFBFBD><EFBFBD>line_token<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buffer<65>е<EFBFBD>λ<EFBFBD><CEBB>*/
|
|||
|
{
|
|||
|
for(;strchr( line_token, *buffer );buffer++);/* Skip tocken char */
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
*sz = *buffer;
|
|||
|
}
|
|||
|
*sz = '\0';
|
|||
|
return buffer;
|
|||
|
}
|
|||
|
|
|||
|
/*****************************************************************************
|
|||
|
***GetConfiguration: Get configuration value from buffer
|
|||
|
***success: return 0
|
|||
|
***get failed, use default value: return R_USE_DEFAULT
|
|||
|
*****************************************************************************/
|
|||
|
/* ret = GetConfigFromBuf("local", //section<6F><6E><EFBFBD><EFBFBD>
|
|||
|
"ip", //key
|
|||
|
"172.16.17.14",
|
|||
|
(char *)g_device_local_ip,
|
|||
|
sizeof(g_device_local_ip),
|
|||
|
(char *)config_buff*/
|
|||
|
unsigned long GetConfigFromBuf( const char *pSectionName, // section name
|
|||
|
const char *pKeyName, // key name
|
|||
|
const char *pDefault, // default string
|
|||
|
char *pReturnedString, // destination buffer
|
|||
|
unsigned long nSize, // size of destination buffer
|
|||
|
const char *pBuffer // Source configuration data buffer
|
|||
|
)
|
|||
|
{
|
|||
|
#if 1
|
|||
|
static char pLine[MAX_LEN_BYTES_OF_LINE+1], pOneSectionName[MAX_LEN_BYTES_OF_LINE+1];//<2F><><EFBFBD><EFBFBD>ΪʲôҪ<C3B4><D2AA>1
|
|||
|
int i,j,nIsMatch;
|
|||
|
char *pLineHead = NULL, *pValueHead = NULL,
|
|||
|
*pSectionNameHead = NULL, *pSectionTail = NULL, *pEquelMark = NULL;//<2F>Ⱥ<EFBFBD>=
|
|||
|
char QuotationMark;//<2F><><EFBFBD><EFBFBD>[]
|
|||
|
unsigned long nRetIndex, dwRet = R_USE_DEFAULT;
|
|||
|
#endif
|
|||
|
memset( pLine, 0, MAX_LEN_BYTES_OF_LINE+1 );//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|||
|
memset( pOneSectionName, 0, MAX_LEN_BYTES_OF_LINE+1 );
|
|||
|
memset( pReturnedString, 0, nSize );
|
|||
|
|
|||
|
if( ( pSectionName ) && ( *pSectionName ) ) /*Want find section*/
|
|||
|
{
|
|||
|
while( pBuffer && (*pBuffer) )
|
|||
|
{//===1
|
|||
|
//ȡһ<C8A1>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
pBuffer = ReadLnFromBuf( pLine, MAX_LEN_BYTES_OF_LINE, pBuffer, g_ConfigurationTokens.LineEnd );
|
|||
|
//һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵĵ<DDB5>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
|||
|
pLineHead = FirstVisibleBYTE( pLine );
|
|||
|
//<2F><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>0
|
|||
|
if( !pLineHead )
|
|||
|
continue;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD> ִ<><D6B4>while<6C>ж<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>#<23><>
|
|||
|
if( strchr( g_ConfigurationTokens.CommentLineBegin, *pLineHead ) )
|
|||
|
continue; /*Comment line*/
|
|||
|
//<2F><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ֽڲ<D6BD><DAB2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>[<5B><>
|
|||
|
if( !strchr( g_ConfigurationTokens.SectionBegin, *pLineHead ) )/* Not a section head*[]*/
|
|||
|
continue;
|
|||
|
//<2F>ж<EFBFBD>section<6F>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>շ<EFBFBD><D5B7><EFBFBD>section<6F><6E><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
pSectionNameHead = FirstVisibleBYTE( pLineHead + 1 );/*Parse one section name*parse: <20><><EFBFBD><EFBFBD>*/
|
|||
|
if( !pSectionNameHead )
|
|||
|
continue;
|
|||
|
|
|||
|
i = 0;
|
|||
|
nIsMatch = 1;
|
|||
|
|
|||
|
while( pSectionNameHead[i] && ( !strchr( g_ConfigurationTokens.SectionEnd, *pSectionTail) )
|
|||
|
&& pSectionName[i])
|
|||
|
{
|
|||
|
//<2F>ж<EFBFBD><D0B6><EFBFBD>ȡ<EFBFBD><C8A1>section<6F><6E><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( pSectionNameHead[i] != pSectionName[i] )
|
|||
|
{
|
|||
|
nIsMatch = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
i++;
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>section<6F><6E><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( !nIsMatch )
|
|||
|
continue;
|
|||
|
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>section<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2>ǿգ<C7BF><D5A3><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>section<6F><6E><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>section<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ıȽ<C4B1>
|
|||
|
if( pSectionName[i] != '\0' ) /*Not full match*/
|
|||
|
continue;
|
|||
|
//<2F>ж<EFBFBD>ĩβ<C4A9>Dz<EFBFBD><C7B2>ǡ<EFBFBD>]<5D><><EFBFBD><EFBFBD>β
|
|||
|
pSectionTail = FirstVisibleBYTE( &pSectionNameHead[i] );//tail:β<><CEB2>
|
|||
|
if( ! pSectionTail )
|
|||
|
continue;
|
|||
|
if( !strchr( g_ConfigurationTokens.SectionEnd, *pSectionTail) ) /*This char is not section end char*/
|
|||
|
continue;
|
|||
|
else
|
|||
|
break;
|
|||
|
}//===1
|
|||
|
}
|
|||
|
|
|||
|
while( pBuffer && (*pBuffer) ) /*Want find key*/
|
|||
|
{
|
|||
|
pBuffer = ReadLnFromBuf( pLine, MAX_LEN_BYTES_OF_LINE, pBuffer, g_ConfigurationTokens.LineEnd );
|
|||
|
pLineHead = FirstVisibleBYTE( pLine );
|
|||
|
if( !pLineHead ) continue;
|
|||
|
if( strchr( g_ConfigurationTokens.CommentLineBegin, *pLineHead ) ) continue; /*Comment line*/
|
|||
|
if( ( pSectionName ) && ( *pSectionName ) )
|
|||
|
if( strchr( g_ConfigurationTokens.SectionBegin, *pLineHead ) ) break; /* Next section */
|
|||
|
|
|||
|
i=0;
|
|||
|
nIsMatch = 1;
|
|||
|
while( pLineHead[i] && pKeyName[i] )
|
|||
|
{
|
|||
|
if( pLineHead[i] != pKeyName[i] )
|
|||
|
{
|
|||
|
nIsMatch = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
i++;
|
|||
|
}
|
|||
|
if( !nIsMatch )
|
|||
|
continue;
|
|||
|
pEquelMark = FirstVisibleBYTE( &pLineHead[i] );
|
|||
|
if( !pEquelMark )
|
|||
|
continue;
|
|||
|
if( (*pEquelMark) != '=' ) /*Not full match key name*/
|
|||
|
continue;
|
|||
|
|
|||
|
/*Key name found and founded char '='*/
|
|||
|
pValueHead = FirstVisibleBYTE( pEquelMark+1 ); /*Get value addr*/
|
|||
|
nRetIndex = 0;
|
|||
|
if( ! pValueHead ) /*Empty value*/
|
|||
|
{
|
|||
|
*pReturnedString = '\0';
|
|||
|
dwRet = 0;
|
|||
|
goto end;
|
|||
|
}
|
|||
|
|
|||
|
if( pValueHead[0] == '\'' || pValueHead[0] == '\"' ) /* Format "****" or '****' */
|
|||
|
{
|
|||
|
QuotationMark = pValueHead[0];
|
|||
|
j = 1;
|
|||
|
while( pValueHead[j] && ( nRetIndex < nSize)
|
|||
|
&& ( pValueHead[j] != QuotationMark ) )
|
|||
|
{
|
|||
|
if( pValueHead[j] == '\\' )
|
|||
|
{
|
|||
|
switch( pValueHead[j+1] )
|
|||
|
{
|
|||
|
case '\'' :pReturnedString[nRetIndex] = '\'';break;
|
|||
|
case 't' :pReturnedString[nRetIndex] = '\t';break;
|
|||
|
case 'n' :pReturnedString[nRetIndex] = '\n';break;
|
|||
|
case 'r' :pReturnedString[nRetIndex] = '\r';break;
|
|||
|
case '\"' :pReturnedString[nRetIndex] = '\"';break;
|
|||
|
case '\\' :pReturnedString[nRetIndex] = '\\';break;
|
|||
|
case '\0' :pReturnedString[nRetIndex] = '\0';break;
|
|||
|
default :pReturnedString[nRetIndex] = pValueHead[j+1];break;
|
|||
|
}
|
|||
|
j+=2;nRetIndex++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pReturnedString[nRetIndex] = pValueHead[j];
|
|||
|
j++; nRetIndex++;
|
|||
|
}
|
|||
|
}
|
|||
|
dwRet = 0;
|
|||
|
goto end;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
strncpy( pReturnedString, pValueHead, nSize );//copy
|
|||
|
dwRet = 0;
|
|||
|
goto end;
|
|||
|
}
|
|||
|
}
|
|||
|
end:
|
|||
|
if( dwRet != 0 )
|
|||
|
if( pDefault )
|
|||
|
strncpy( pReturnedString, pDefault, nSize );//strncpy char * strncpy(char *s1,char *s2,size_t n);
|
|||
|
//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>s2<73><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>s1<73>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>s1<73><31>ָ<EFBFBD><D6B8>
|
|||
|
return dwRet;
|
|||
|
}
|
|||
|
|
|||
|
|