?? iniparser.c
字號:
/*-------------------------------------------------------------------------*//** @file iniparser.c @author N. Devillard @date Mar 2000 @version $Revision: 2.17 $ @brief Parser for ini files.*//*--------------------------------------------------------------------------*//* $Id: iniparser.c,v 2.17 2007-05-27 13:03:43 ndevilla Exp $ $Author: ndevilla $ $Date: 2007-05-27 13:03:43 $ $Revision: 2.17 $*//*--------------------------------------------------------------------------- Includes ---------------------------------------------------------------------------*/#include "iniparser.h"#include "strlib.h"#define ASCIILINESZ 1024#define INI_INVALID_KEY ((char*)-1)/*--------------------------------------------------------------------------- Private to this module ---------------------------------------------------------------------------*//* Private: add an entry to the dictionary */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 ;}/*-------------------------------------------------------------------------*//** @brief Get number of sections in a dictionary @param d Dictionary to examine @return int Number of sections found in dictionary 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 ;}/*-------------------------------------------------------------------------*//** @brief Get name for section n in a dictionary. @param d Dictionary to examine @param n Section number (from 0 to nsec-1). @return Pointer to char string 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] ;}/*-------------------------------------------------------------------------*//** @brief Dump a dictionary to an opened file pointer. @param d Dictionary to dump. @param f Opened file pointer to dump to. @return void 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 ;}/*-------------------------------------------------------------------------*//** @brief Save a dictionary to a loadable ini file @param d Dictionary to dump @param f Opened file pointer to dump to @return void 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 ;}/*-------------------------------------------------------------------------*//** @brief Get the string associated to a key, return NULL if not found @param d Dictionary to search @param key Key string to look for @return pointer to statically allocated character string, or NULL. 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, const char * key){ return iniparser_getstring(d, key, NULL);}/*-------------------------------------------------------------------------*//** @brief Get the string associated to a key @param d Dictionary to search @param key Key string to look for @param def Default value to return if key not found. @return pointer to statically allocated character string 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, the pointer passed as 'def' is returned. The returned char pointer is pointing to a string allocated in the dictionary, do not free or modify it. *//*--------------------------------------------------------------------------*/char * iniparser_getstring(dictionary * d, const char * key, char * def){ char * lc_key ; char * sval ; if (d==NULL || key==NULL) return def ; if (!(lc_key = strdup(strlwc(key)))) { return NULL; } sval = dictionary_get(d, lc_key, def); free(lc_key); return sval ;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -