Hi! ciniparser seems to be confused with its own API. From the docs: /** * @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, NULL on error * * 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! */ char *ciniparser_getsecname(dictionary *d, int n);
So, the section numbers are 0 to ciniparser_getnsec() - 1. But in the test directory run.c does: ok(stmp2 = ciniparser_getsecname(ini, 1), "ciniparser_getsecname(): first dict entry is %s", stmp2); First entry should be 0, not 1. ciniparser_dump_ini() follows the docs and fails. ---cut--- rw@sandpuppy:~/ccan/ciniparser> cat test.ini [one] foo = bar [two] foo = bar [three] foo = bar rw@sandpuppy:~/ccan/ciniparser> cat main.c #include <stdio.h> #include <stdbool.h> #include "ciniparser.h" #define CONFIG_FILE "test.ini" int main(int argc, char *argv[]) { dictionary *d; d = ciniparser_load(CONFIG_FILE); if (d == NULL) return 1; ciniparser_dump_ini(d, stdout); ciniparser_freedict(d); return 0; } rw@sandpuppy:~/ccan/ciniparser> ./main [one] foo = bar [one] foo = bar [two] foo = bar ---cut--- 3rd section is missing but 1st is here twice. I'd suggest the following fix: diff --git a/ccan/ciniparser/ciniparser.c b/ccan/ciniparser/ciniparser.c index 2b60e40..a6082da 100644 --- a/ccan/ciniparser/ciniparser.c +++ b/ccan/ciniparser/ciniparser.c @@ -270,7 +270,7 @@ void ciniparser_dump_ini(dictionary *d, FILE *f) return; } - for (i = 0; i < nsec; i++) { + for (i = 1; i <= nsec; i++) { secname = ciniparser_getsecname(d, i); seclen = (int)strlen(secname); fprintf(f, "\n[%s]\n", secname); diff --git a/ccan/ciniparser/ciniparser.h b/ccan/ciniparser/ciniparser.h index f61b357..e676c23 100644 --- a/ccan/ciniparser/ciniparser.h +++ b/ccan/ciniparser/ciniparser.h @@ -65,7 +65,7 @@ int ciniparser_getnsec(dictionary *d); /** * @brief Get name for section n in a dictionary. * @param d Dictionary to examine - * @param n Section number (from 0 to nsec-1). + * @param n Section number (from 1 to nsec). * @return Pointer to char string, NULL on error * * This function locates the n-th section in a dictionary and returns --- Side note, ciniparser_getsecname() returns the first section if asked for both 0 and 1. 0 should be undefined behavior IMHO. -- Thanks, //richard _______________________________________________ ccan mailing list ccan@lists.ozlabs.org https://lists.ozlabs.org/listinfo/ccan