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

📄 iniparser.cpp

📁 不需移植
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*************************************************
	Copyright (C)
	File name:		iniparser.c
	Author:			N.Devillard,ndevilla
	Version:  		5.0
	Date: 			2005-09-19
	Description:	ini配置文件操作
	Others:			
	History:
*************************************************/

#include "iniparser.h"
#include "strlib.h"

#define ASCIILINESZ         256
#define INI_INVALID_KEY     ((char*)-1)

namespace INI {
/*************************************************
  Function:			iniparser_add_entry
  Description:		add an entry to the dictionary 
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			
  Output:
  Return:			
  Others:
*************************************************/
static void iniparser_add_entry(
								dictionary * d,
								char * sec,
								char * key,
								char * val)
{
	char longkey[2*ASCIILINESZ+1];

	/* Make a key as section:keyword */
	if (key!=NULL)
	{
		sprintf(longkey, "%s:%s", sec, key);
	} 
	else
	{
		strcpy(longkey, sec);
	}
	
	/* Add (key,val) to dictionary */
	dictionary_set(d, longkey, val);
	return ;
}

int iniparser_getnkey(dictionary * d, char *sect)
{		
	int colon_pos;
	int i ;
	int nkey ;

	if (d==NULL || sect==NULL)
	{
		return -1 ;
	}

	nkey=0 ;
	for (i=0 ; i<d->size ; i++)
	{
		if (d->key[i]==NULL)
		{	
			continue ;
		}
		
		colon_pos = strlen(sect) - 1;		
		if (memcmp(d->key[i], sect, colon_pos) == 0
			&& d->key[i][colon_pos+1] == ':')			
		{			
			nkey ++;
		}		
	}
	return nkey ;
}

/*************************************************
  Function:			iniparser_getnsec
  Description:		Get number of sections in a dictionary
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			Dictionary to examine
  Output:
  Return:			Number of sections found in dictionary
  Others:			This function returns the number of sections found in a dictionary.
					The test to recognize sections is done on the string stored in the
					dictionary: a section name is given as "section" whereas a key is
					stored as "section:key", thus the test looks for entries that do not
					contain a colon.

					This clearly fails in the case a section name contains a colon, but
					this should simply be avoided.

					This function returns -1 in case of error.
*************************************************/
int iniparser_getnsec(dictionary * d)
{
	int i ;
	int nsec ;

	if (d==NULL)
	{
		return -1 ;
	}

	nsec=0 ;
	for (i=0 ; i<d->size ; i++)
	{
		if (d->key[i]==NULL)
		{	
			continue ;
		}
		if (strchr(d->key[i], ':')==NULL) 
		{
			nsec ++ ;
		}
	}
	return nsec ;
}

char * iniparser_getkeyname(dictionary * d, char * sect, int n)
{
	int i ;
	int foundsec ;
	int colon_pos;

	if (d==NULL || n<0)
	{
		return NULL ;
	}

	foundsec=0 ;
	for (i=0 ; i<d->size ; i++)
	{
		if (d->key[i]==NULL)
		{
			continue ;
		}

		colon_pos = strlen(sect) - 1;		
		if (memcmp(d->key[i], sect, colon_pos) == 0
			&& d->key[i][colon_pos+1] == ':')			
		{			
			foundsec ++;
			if (foundsec > n)
			{
				break;
			}
		}		
	}

	if (foundsec<=n)
	{
		return NULL ;
	}
	return &d->key[i][colon_pos+2] ;
}

/*************************************************
  Function:			iniparser_getsecname
  Description:		Get name for section n in a dictionary.
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			Dictionary to examine,Section number (from 0 to nsec-1).
  Output:
  Return:			Pointer to char string
  Others:			This function locates the n-th section in a dictionary and returns
					its name as a pointer to a string statically allocated inside the
					dictionary. Do not free or modify the returned string!

					This function returns NULL in case of error.
*************************************************/
char * iniparser_getsecname(dictionary * d, int n)
{
	int i ;
	int foundsec ;

	if (d==NULL || n<0)
	{
		return NULL ;
	}

	foundsec=0 ;
	for (i=0 ; i<d->size ; i++)
	{
		if (d->key[i]==NULL)
		{
			continue ;
		}

		if (strchr(d->key[i], ':')==NULL) 
		{
			foundsec++ ;
			if (foundsec>n)
			{
				break ;
			}
		}
	}

	if (foundsec<=n)
	{
		return NULL ;
	}
	return d->key[i] ;
}

/*************************************************
  Function:			iniparser_dump
  Description:		Dump a dictionary to an opened file pointer.
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			Dictionary to examine,Opened file pointer to dump to.
  Output:
  Return:			
  Others:			This function prints out the contents of a dictionary, one element by
					line, onto the provided file pointer. It is OK to specify @c stderr
					or @c stdout as output files. This function is meant for debugging
					purposes mostly.
*************************************************/
void iniparser_dump(dictionary * d, FILE * f)
{
	int     i ;	

	if (d==NULL || f==NULL) return ;
	for (i=0 ; i<d->size ; i++)
	{
		if (d->key[i]==NULL)
		{
			continue ;
		}

		if (d->val[i]!=NULL)
		{
			fprintf(f, "[%s]=[%s]\n", d->key[i], d->val[i]);
		}
		else
		{
			fprintf(f, "[%s]=UNDEF\n", d->key[i]);
		}
	}
	return ;
}

/*************************************************
  Function:			iniparser_dump_ini
  Description:		Save a dictionary to a loadable ini file
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			Dictionary to dump,Opened file pointer to dump to.
  Output:
  Return:			
  Others:			This function dumps a given dictionary into a loadable ini file.
					It is Ok to specify @c stderr or @c stdout as output files.
*************************************************/
void iniparser_dump_ini(dictionary * d, FILE * f)
{
	int     i, j ;
	char    keym[ASCIILINESZ+1];
	int     nsec ;
	char *  secname ;
	int     seclen ;

	if (d==NULL || f==NULL) return ;

	nsec = iniparser_getnsec(d);
	if (nsec<1)
	{
		/* No section in file: dump all keys as they are */
		for (i=0 ; i<d->size ; i++)
		{
			if (d->key[i]==NULL)
			{
				continue ;
			}

			fprintf(f, "%s = %s\n", d->key[i], d->val[i]);
		}
		return ;
	}
	for (i=0 ; i<nsec ; i++)
	{
		secname = iniparser_getsecname(d, i) ;
		seclen  = (int)strlen(secname);
		fprintf(f, "\n[%s]\n", secname);
		sprintf(keym, "%s:", secname);
		for (j=0 ; j<d->size ; j++)
		{
			if (d->key[j]==NULL)
			{
				continue ;
			}

			if (!strncmp(d->key[j], keym, seclen+1))
			{
				fprintf(f,
					"%-30s = %s\n",
					d->key[j]+seclen+1,
					d->val[j] ? d->val[j] : "");
			}
		}
	}
	fprintf(f, "\n");
	return ;
}

/*************************************************
  Function:			iniparser_getstr
  Description:		Get the string associated to a key, return NULL if not found
  Calls:			
  Called By:		
  Table Accessed:
  Table Updated:
  Input:			Dictionary to search,Key string to look for
  Output:
  Return:			pointer to statically allocated character string, or NULL.
  Others:			This function queries a dictionary for a key. A key as read from an
					ini file is given as "section:key". If the key cannot be found,
					NULL is returned.
					The returned char pointer is pointing to a string allocated in
					the dictionary, do not free or modify it.

					This function is only provided for backwards compatibility with 
					previous versions of iniparser. It is recommended to use
					iniparser_getstring() instead.
*************************************************/
char * iniparser_getstr(dictionary * d, char * key)
{
	return iniparser_getstring(d, key, NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -