38 #define ASCIILINESZ      (1024) 
   39 #define INI_INVALID_KEY  ((char*)NULL) 
   64 static char* strlwc(
const char* s)
 
   66         static char l[ASCIILINESZ + 1];
 
   72         for (i = 0; s[i] && i < ASCIILINESZ; i++)
 
   90 static char* strstrip(
const char* s)
 
   92         static char l[ASCIILINESZ + 1];
 
   93         unsigned int i, numspc;
 
  101         for (i = numspc = 0; s[i] && i < ASCIILINESZ; i++) {
 
  108         l[i - numspc] = 
'\0';
 
  121 line_status ciniparser_line(
char* input_line, 
char* section,
 
  122                             char* key, 
char* value)
 
  125         char line[ASCIILINESZ + 1];
 
  128         strcpy(line, strstrip(input_line));
 
  129         len = (int)strlen(line);
 
  134         } 
else if (line[0] == 
'#') {
 
  137         } 
else if (line[0] == 
'[' && line[len - 1] == 
']') {
 
  139                 if (sscanf(line, 
"[%[^]]", section) == 1) {
 
  140                         strcpy(section, strstrip(section));
 
  141                         strcpy(section, strlwc(section));
 
  144         } 
else if (sscanf(line, 
"%[^=] = \"%[^\"]\"", key, value) == 2
 
  145                    || sscanf(line, 
"%[^=] = '%[^\']'", key, value) == 2
 
  146                    || sscanf(line, 
"%[^=] = %[^;#]", key, value) == 2) {
 
  148                 strcpy(key, strstrip(key));
 
  149                 strcpy(key, strlwc(key));
 
  150                 strcpy(value, strstrip(value));
 
  155                 if (!strcmp(value, 
"\"\"") || (!strcmp(value, 
"''")))
 
  158         } 
else if (sscanf(line, 
"%[^=] = %[;#]", key, value) == 2
 
  159                    || sscanf(line, 
"%[^=] %[=]", key, value) == 2) {
 
  166                 strcpy(key, strstrip(key));
 
  167                 strcpy(key, strlwc(key));
 
  188         for (i = 0; i < d->size; i++) {
 
  189                 if (d->key[i] == NULL)
 
  191                 if (strchr(d->key[i], 
':') == NULL)
 
  203         if (d == NULL || n < 0)
 
  211         for (i = 0; i < d->size; i++) {
 
  212                 if (d->key[i] == NULL)
 
  214                 if (!strchr(d->key[i], 
':')) {
 
  231         if (d == NULL || f == NULL)
 
  234         for (i = 0; i < d->size; i++) {
 
  235                 if (d->key[i] == NULL)
 
  237                 if (d->val[i] != NULL)
 
  238                         fprintf(f, 
"[%s]=[%s]\n", d->key[i], d->val[i]);
 
  240                         fprintf(f, 
"[%s]=UNDEF\n", d->key[i]);
 
  247         char keym[ASCIILINESZ + 1];
 
  252         if (d == NULL || f == NULL)
 
  255         memset(keym, 0, ASCIILINESZ + 1);
 
  260                 for (i = 0; i < d->size; i++) {
 
  261                         if (d->key[i] == NULL)
 
  263                         fprintf(f, 
"%s = %s\n", d->key[i], d->val[i]);
 
  268         for (i = 0; i < nsec; i++) {
 
  270                 seclen = (int)strlen(secname);
 
  271                 fprintf(f, 
"\n[%s]\n", secname);
 
  272                 snprintf(keym, ASCIILINESZ + 1, 
"%s:", secname);
 
  273                 for (j = 0; j < d->size; j++) {
 
  274                         if (d->key[j] == NULL)
 
  276                         if (!strncmp(d->key[j], keym, seclen + 1)) {
 
  277                                 fprintf(f, 
"%-30s = %s\n",
 
  278                                         d->key[j] + seclen + 1,
 
  279                                         d->val[j] ? d->val[j] : 
"");
 
  291         if (d == NULL || key == NULL)
 
  294         lc_key = strlwc(key);
 
  306         if (str == INI_INVALID_KEY)
 
  309         return (
int)strtol(str, NULL, 10);
 
  318         if (str == INI_INVALID_KEY)
 
  330         if (c == INI_INVALID_KEY)
 
  334         case 'y': 
case 'Y': 
case '1': 
case 't': 
case 'T':
 
  337         case 'n': 
case 'N': 
case '0': 
case 'f': 
case 'F':
 
  371         char line[ASCIILINESZ + 1];
 
  372         char section[ASCIILINESZ + 1];
 
  373         char key[ASCIILINESZ + 1];
 
  374         char tmp[ASCIILINESZ + 1];
 
  375         char val[ASCIILINESZ + 1];
 
  376         int last = 0, len, lineno = 0, errs = 0;
 
  379         in = fopen(ininame, 
"r");
 
  381                 fprintf(stderr, 
"ciniparser: cannot open %s\n (ignored)",
 
  392         memset(line, 0, ASCIILINESZ + 1);
 
  393         memset(section, 0, ASCIILINESZ + 1);
 
  394         memset(key, 0, ASCIILINESZ + 1);
 
  395         memset(val, 0, ASCIILINESZ + 1);
 
  398         while (fgets(line + last, ASCIILINESZ - last, in) != NULL) {
 
  400                 len = (int)strlen(line) - 1;
 
  402                 if (line[len] != 
'\n') {
 
  404                                 "ciniparser: input line too long in %s (%d)\n",
 
  414                        ((line[len] == 
'\n') || (isspace(line[len])))) {
 
  420                 if (len >= 0 && line[len] == 
'\\') {
 
  426                 switch (ciniparser_line(line, section, key, val)) {
 
  436                         snprintf(tmp, ASCIILINESZ + 1, 
"%s:%s", section, key);
 
  441                         fprintf(stderr, 
"ciniparser: syntax error in %s (%d):\n",
 
  443                         fprintf(stderr, 
"-> %s\n", line);
 
  450                 memset(line, 0, ASCIILINESZ);
 
  453                         fprintf(stderr, 
"ciniparser: memory allocation failure\n");
 
enum _line_status_ line_status
This enum stores the status for each parsed line (internal use only).
int ciniparser_set(dictionary *d, const char *entry, const char *val)
Set an item in the dictionary.
dictionary * ciniparser_load(const char *ininame)
Parse an ini file and return an allocated dictionary object.
int ciniparser_getboolean(dictionary *d, const char *key, int notfound)
Get the string associated to a key, convert to a boolean.
void dictionary_unset(dictionary *d, const char *key)
Delete a key in a dictionary.
_line_status_
This enum stores the status for each parsed line (internal use only).
int ciniparser_getnsec(dictionary *d)
Get number of sections in a dictionary.
int ciniparser_getint(dictionary *d, const char *key, int notfound)
Get the string associated to a key, convert to an int.
const char * ciniparser_getsecname(dictionary *d, int n)
Get name for section n in a dictionary.
dictionary * dictionary_new(int size)
Create a new dictionary object.
const char * dictionary_get(dictionary *d, const char *key, const char *def)
Get a value from a dictionary.
void dictionary_del(dictionary *d)
Delete a dictionary object.
int dictionary_set(dictionary *d, const char *key, const char *val)
Set a value in a dictionary.
double ciniparser_getdouble(dictionary *d, const char *key, double notfound)
Get the string associated to a key, convert to a double.
void ciniparser_dump(dictionary *d, FILE *f)
Dump a dictionary to an opened file pointer.
void ciniparser_unset(dictionary *ini, char *entry)
Delete an entry in a dictionary.
void ciniparser_freedict(dictionary *d)
Free all memory associated to an ini dictionary.
const char * ciniparser_getstring(dictionary *d, const char *key, char *def)
Get the string associated to a key.
void ciniparser_dump_ini(dictionary *d, FILE *f)
Save a dictionary to a loadable ini file.
int ciniparser_find_entry(dictionary *ini, const char *entry)
Finds out if a given entry exists in a dictionary.