📄 iniparser.cpp
字号:
/*************************************************
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 + -