MW22-02A/BSP/Driver/getcfg/getcfg.c

248 lines
7.9 KiB
C
Raw Normal View History

2025-05-21 01:55:40 +00:00
#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;
}