⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfgbase.cpp

📁 ABis无线接口全套资料
💻 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 + -