📄 cfgbase.cpp
字号:
/* ======================================================================== *\
|
|
| JOYIT Communication Technology
| Copyright (C) 2003-2005, All Right Reserved.
|
| System: Programmable Signaling Gateway
| Sub-system:
| Filename: cfgbase.cpp
| Environment: LINUX -- Red Hat 7.2 & GNU C/C++ Compiler 2.96
| vxWorks -- Tornado 2.0 & vxWorks 5.4
| Function description: Decfine function of system config file I/O
| interface base class.
|
\* ======================================================================== */
#ifndef _CFGBASE_HPP
#include "cfgbase.hpp"
#endif
#ifndef _EXCEPTION_HPP
#include "exception.hpp"
#endif
extern "C"
{
#ifndef _STRING_H
#include <string.h>
#endif
};
ConfigBase::ConfigBase( ) : fp(NULL)
{
memset(filename, 0, MAX_LENGTH_CFG);
memset(m_sField, 0, MAX_LENGTH_CFG);
for (int i=0; i<MAX_TOKEN; ++i)
{
lineToken[i] = NULL;
}
}
ConfigBase::~ConfigBase( )
{
if (fp != NULL)
{
fclose(fp);
}
}
void ConfigBase::SetFileName(const char * const fn)
{
if (NULL == fn)
{
return;
}
int len = strlen(fn);
if (len >= MAX_LENGTH_CFG)
len = MAX_LENGTH_CFG - 1;
// memset(filename, 0, MAX_LENGTH_CFG);
memcpy(filename, fn, len);
filename[len] = '\0';
}
ERRCOD_T ConfigBase::OpenFile( )
{
if (fp != NULL)
{
rewind(fp);
return E_SUCC;
}
fp = fopen(filename, "rt"); // Open it with read-only-text mode.
if (NULL == fp)
{
xcpPtr->error(E_FILE_OPEN_FAILED, SF_CFGBASE, g_Errstr[E_FILE_OPEN_FAILED]);
}
return (NULL == fp) ? E_FILE_OPEN_FAILED : E_SUCC;
}
ERRCOD_T ConfigBase::Open4Write( )
{
ERRCOD_T r = E_SUCC;
if (fp != NULL)
{
r = CloseFile( );
}
if (E_SUCC == r)
{
fp = fopen(filename, "w+t"); // Open with write-read text mode
if (NULL == fp)
{
xcpPtr->error(E_FILE_OPEN_FAILED, SF_CFGBASE, g_Errstr[E_FILE_OPEN_FAILED]);
}
r = (NULL == fp) ? E_FILE_OPEN_FAILED : E_SUCC;
}
return r;
}
ERRCOD_T ConfigBase::CloseFile( )
{
if (fp != NULL)
{
// return (fclose(fp)) ? E_FILE_CLOSE_FAILED : E_SUCC;
if (fclose(fp))
{
xcpPtr->error(E_FILE_CLOSE_FAILED, SF_CFGBASE, g_Errstr[E_FILE_CLOSE_FAILED]);
return E_FILE_CLOSE_FAILED;
}
else
{
fp = NULL;
return E_SUCC;
}
}
else
{
return E_SUCC;
}
}
ERRCOD_T ConfigBase::ReOpenFile( )
{
if (fp != NULL)
{
ERRCOD_T r = CloseFile( );
if (E_SUCC == r)
{
return OpenFile( );
}
else
{
return r;
}
}
else // fp == null
{
return OpenFile( );
}
}
char * ConfigBase::GetLine(char *s, int size)
{
char *chptr;
chptr = fgets(s, size, fp);
if (NULL == chptr)
{
return chptr;
}
else
{
// Del the CR and NL character at the end of line.
int len = strlen(s);
while (len > 0)
{
if (s[len-1] == 0x0A || s[len-1] == 0x0D)
{
s[len-1] = '\0';
}
--len;
}
return s;
}
}
char * ConfigBase::GetConfigLine( )
{
static char buf[128];
static char stat=0;
char *ptr = NULL;
int buflen=128;
if (NULL == fp)
{
if (OpenFile( ) != E_SUCC)
{
return NULL;
}
}
while (GetLine(buf, buflen) != NULL)
{
ptr=buf;
if (0 == stat)
{
if (! strcmp(m_sField, ""))
{
stat=1;
}
else if (strstr(buf, m_sField))
{
stat=1;
continue;
}
}
if (0 == stat)
{
continue;
}
while (('\t' == *ptr) || (' ' == *ptr))
{ // Delete the pre space and tab.
++ptr;
}
if (*ptr == '[')
{ // This item end.
// r = E_CONFIG_MISS;
break;
}
if ((*ptr == '\0') ||
(*ptr == '\n') ||
(*ptr == '\r') ||
(*ptr == ';') ||
(*ptr == '#'))
{
continue;
}
else
{
return ptr;
}
}
CloseFile( );
stat = 0;
return NULL;
}
ERRCOD_T ConfigBase::Token(char * line)
{
int index;
int count;
char * ptr;
char tk[128];
char lineEnd;
index = 0;
ptr = line;
count = 0;
lineEnd = 0;
while (0 == lineEnd)
{
count = 0;
if (('\'' == *ptr) || ('\"' == *ptr))
{
char ch = *ptr;
++ptr;
// do // Modify 2005-11-16, by Wujianjin.
while (*ptr != ch)
{
if ((*ptr == '\0') || (count >= (MAX_LENGTH_CFG-1)))
{ // Exception handle
xcpPtr->error(E_CONFIG_MISS, SF_CFGBASE, g_Errstr[E_CONFIG_MISS]);
return E_CONFIG_MISS;
}
tk[count] = *ptr;
++count;
++ptr;
}
// } while (*ptr != ch);
++ptr;
}
else
{
do
{
tk[count] = *ptr;
++count;
++ptr;
}
while ((*ptr != ' ') &&
(*ptr != ',') &&
(*ptr != '\t') &&
(*ptr != '\0') &&
(*ptr != '\n') &&
(*ptr != '\r') &&
(*ptr != ';') &&
(*ptr != '#'));
}
tk[count] = '\0';
int realLen = (count > 0) ? (strlen(tk)+1) : 1; // Add 2005-11-16, by Wu jianjin.
// lineToken[index] = new char[strlen(tk)+1];
lineToken[index] = new char[realLen]; // Modify 2005-11-16, by Wu jianjin.
if (lineToken[index] != NULL)
{
strcpy(lineToken[index], tk);
++index;
}
else
{
// Exception handle
xcpPtr->error(E_OUT_OF_MEMORY, SF_CFGBASE, g_Errstr[E_OUT_OF_MEMORY]);
return E_OUT_OF_MEMORY;
}
while ((' ' == *ptr) ||
('\t'== *ptr) ||
(',' == *ptr))
{
++ptr;
}
if (('\0' == *ptr) ||
('\n' == *ptr) ||
('\r' == *ptr) ||
(';' == *ptr) ||
('#' == *ptr))
{ // Line end
lineEnd = 1;
}
} // End of while (0 == lineEnd)
return E_SUCC;
}
void ConfigBase::ReleaseToken( )
{
for (int i=0; i<MAX_TOKEN; ++i)
{
if (lineToken[i] != NULL)
{
delete lineToken[i];
lineToken[i] = NULL;
}
}
}
ERRCOD_T ConfigBase::Analysis( )
{ // Read in the config information and then analysis.
return E_SUCC;
}
ERRCOD_T ConfigBase::Write2( )
{
return E_SUCC;
}
ERRCOD_T ConfigBase::Modify( )
{
return E_SUCC;
}
char * ConfigBase::GetValue(const char * const val)
{
static char opBuf[256];
char *ptr=NULL;
char buf[128];
int buflen=128;
int stat=0;
if (NULL == val)
{ // Exception
xcpPtr->error(E_NULL_POINTER, SF_CFGBASE, g_Errstr[E_NULL_POINTER]);
return NULL;
}
if (ReOpenFile( ) != E_SUCC)
{
return NULL;
}
while (GetLine(buf, buflen) != NULL)
{
ptr=buf;
if (! strcmp(m_sField, ""))
stat=1;
else if (strstr(buf, m_sField))
{
stat=1;
continue;
}
if (stat == 0)
continue;
while (*ptr == '\t' || *ptr == ' ')
ptr++;
if (*ptr == '[')
break;
if ((*ptr == '\0') ||
(*ptr == '\n') ||
(*ptr == '\r') ||
(*ptr == ';') ||
(*ptr == '#'))
continue;
if (strncmp(ptr, val, strlen(val)) != 0)
continue;
ptr = strchr(ptr, '=');
if (ptr!=NULL)
{
while (*ptr == '\t' || *ptr == ' ')
++ptr;
++ptr;
if ((*ptr == '\0') ||
(*ptr == '\n') ||
(*ptr == '\r') ||
(*ptr == ';') ||
(*ptr == '#'))
{ // Exception handle
// printf("[%s] Missing value\n",val);
xcpPtr->error(E_CONFIG_MISS, SF_CFGBASE, g_Errstr[E_CONFIG_MISS]);
return NULL;
}
if ((*ptr == '\"') ||
(*ptr == '\''))
{
char ch = *ptr;
int len = 0;
++ptr; // Ignore the start delimitation char
do
{
if ((*ptr == '\0') || (len >= MAX_LENGTH_CFG))
{ // Exception handle
// opBuf[0] = '\0';
// break;
xcpPtr->error(E_CONFIG_ERROR, SF_CFGBASE, "Missing delimitation char \' or \".");
return NULL;
}
opBuf[len] = *ptr;
++len;
++ptr;
} while (*ptr != ch);
opBuf[len] = '\0';
}
else
{
int len = 0;
do
{
opBuf[len] = *ptr;
++len;
++ptr;
} while ((*ptr != ' ') &&
(*ptr != '\0') &&
(*ptr != '\n') &&
(*ptr != '\r') &&
(*ptr != '\t') &&
(*ptr != ';') &&
(*ptr != '#'));
opBuf[len] = '\0';
}
return opBuf;
}
// Exception handle
// printf("[%s] Missing value\n",val);
xcpPtr->error(E_CONFIG_MISS, SF_CFGBASE, "The option missing value.");
return NULL;
}
return NULL;
}
int ConfigBase::SetField(const char * const field)
{
if(field==NULL)
return 0;
strcpy(m_sField,field);
return 0;
}
// ------------------------------------------------------------------------
//
// Revision list.
// ==============
//
// 1.0, 2003-04-18, Wu jianjin
// Initial version.
// 1.0a, 2003-05-07, Liao chaosheng
// Delete the excrescent parameter "stream" in function GetLine(...),
// and use "fp" in fgets(...) instead of "stream".
// 1.1, 2003-05-19, Wu jianjin
// Ported to vxWorks.
// 1.2, 2003-06-03, Lu shengsheng
// Add SetField(...) and GetValue(...)
// 1.3, 2003-06-27, Wu jianjin
// Add Open4Write(...), GetConfigLine(...), Token(...) and
// ReleaseToken(...)
// 1.4, 2005-11-16, Wu jianjin
// Fix Token( ) exception when there is NULL string in config file,
// such as "".
// ------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -