[ccan] cinitparser: section numbering issue

Richard Weinberger richard.weinberger at gmail.com
Sun Jan 24 10:05:08 AEDT 2016


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 at sandpuppy:~/ccan/ciniparser> cat test.ini
[one]
foo = bar
[two]
foo = bar
[three]
foo = bar
rw at 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 at 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


More information about the ccan mailing list