30 #define INI_BUFSIZ (512) 31 #define INI_INVALID_KEY ((char*)-1) 50 #if defined (ENABLE_UNUSED_FUNCTION) 51 static void ini_table_unset (
INI_TABLE * ini,
char *key);
69 newp = calloc (2 * size, 1);
74 memcpy (newp, p, size);
99 for (hash = 0, i = 0; i < len; i++)
101 hash += (unsigned) key[i];
102 hash += (hash << 10);
106 hash ^= (hash >> 11);
107 hash += (hash << 15);
136 ini->
val = (
char **) calloc (size,
sizeof (
char *));
141 ini->
key = (
char **) calloc (size,
sizeof (
char *));
146 ini->
lineno = (
int *) calloc (size,
sizeof (
int));
151 ini->
hash = (
unsigned int *) calloc (size,
sizeof (
unsigned int));
199 for (i = 0; i < ini->
size; i++)
240 for (i = 0; i < ini->
size; i++)
247 if (hash == ini->
hash[i])
250 if (!strcmp (key, ini->
key[i]))
289 for (i = 0; i < ini->
size; i++)
295 if (hash == ini->
hash[i])
297 if (!strcmp (key, ini->
key[i]))
313 if (ini->
n == ini->
size)
331 for (i = 0; i < ini->
size; i++)
355 #if defined (ENABLE_UNUSED_FUNCTION) 365 ini_table_unset (
INI_TABLE * ini,
char *key)
367 unsigned int i, hash;
375 for (i = 0; i < ini->
size; i++)
382 if (hash == ini->
hash[i])
385 if (!strcmp (key, ini->
key[i]))
464 last = result +
strlen (result);
465 while (last > result)
495 len = (int)
strlen (line);
503 else if (line[0] ==
'#')
508 else if (line[0] ==
'[' && line[len - 1] ==
']')
513 sscanf (line,
"[%[^]]", section);
515 leading_char = section[0];
516 if (leading_char ==
'@' || leading_char ==
'%')
518 sprintf (section,
"%c%s", leading_char,
ini_str_trim (section + 1));
523 else if (sscanf (line,
"%[^=] = \"%[^\"]\"", key, value) == 2 || sscanf (line,
"%[^=] = '%[^\']'", key, value) == 2
524 || sscanf (line,
"%[^=] = %[^;#]", key, value) == 2)
534 if (!strcmp (value,
"\"\"") || (!strcmp (value,
"''")))
540 else if (sscanf (line,
"%[^=] = %[;#]", key, value) == 2 || sscanf (line,
"%[^=] %[=]", key, value) == 2)
586 if ((in = fopen (ininame,
"r")) ==
NULL)
588 fprintf (stderr,
"ini_parser: cannot open %s\n", ininame);
608 len = (int)
strlen (line) - 1;
610 if (line[len] !=
'\n' && len >=
INI_BUFSIZ - 2)
612 fprintf (stderr,
"ini_parser: input line too long in %s (%d)\n", ininame, lineno);
618 while ((len > 0) && ((line[len] ==
'\n') || (
char_isspace (line[len]))))
624 if (line[len] ==
'\\')
645 sprintf (tmp,
"%s:%s", section, key);
650 fprintf (stderr,
"ini_parser: syntax error in %s (%d):\n", ininame, lineno);
651 fprintf (stderr,
"-> %s\n", line);
662 fprintf (stderr,
"ini_parser: memory allocation failure\n");
706 for (i = 0; i < ini->
size; i++)
712 if (strcasecmp (ini->
key[i], sec) == 0)
733 if (ini ==
NULL || n < 0)
738 for (i = 0; i < ini->
size; i++)
744 if (strchr (ini->
key[i],
':') ==
NULL)
774 return (key[0] !=
':');
788 const char *s1 = strchr (key1,
':');
789 const char *s2 = strchr (key2,
':');
790 int key1_sec_len, key2_sec_len;
798 key1_sec_len = (int)
strlen (key1);
807 key2_sec_len = (int)
strlen (key2);
810 if (key1_sec_len != key2_sec_len)
815 if (strncasecmp (key1, key2, key1_sec_len) == 0)
869 sprintf (sec_key,
"%s:%s", sec, key);
916 result =
ini_getint (ini, sec, key, def, lineno);
925 #if defined (ENABLE_UNUSED_FUNCTION) 940 ini_getuint_min (
INI_TABLE * ini,
const char *sec,
const char *key,
int def,
int min,
int *lineno)
1029 return (
float) strtod (str,
NULL);
const char * ini_getstr(INI_TABLE *ini, const char *sec, const char *key, const char *def, int *lineno)
int ini_gethex(INI_TABLE *ini, const char *sec, const char *key, int def, int *lineno)
static char * ini_str_trim(char *s)
int parse_int(int *ret_p, const char *str_p, int base)
int ini_seccmp(const char *key1, const char *key2)
static unsigned int ini_table_hash(char *key)
void ini_parser_free(INI_TABLE *ini)
INI_TABLE * ini_parser_load(const char *ininame)
enum ini_line_status INI_LINE_STATUS
int ini_getint(INI_TABLE *ini, const char *sec, const char *key, int def, int *lineno)
int ini_findsec(INI_TABLE *ini, const char *sec)
char * ini_getsecname(INI_TABLE *ini, int n, int *lineno)
static INI_TABLE * ini_table_new(int size)
static INI_LINE_STATUS ini_parse_line(char *input_line, char *section, char *key, char *value)
int ini_getuint_max(INI_TABLE *ini, const char *sec, const char *key, int def, int max, int *lineno)
static char * ini_str_lower(const char *s)
static const char * ini_table_get(INI_TABLE *ini, char *key, const char *def, int *lineno)
float ini_getfloat(INI_TABLE *ini, const char *sec, const char *key, float def, int *lineno)
static int ini_table_set(INI_TABLE *vd, char *key, char *val, int lineno)
static void error(const char *msg)
int ini_hassec(const char *key)
static void ini_table_free(INI_TABLE *vd)
char * strdup(const char *str)
static const char * ini_get_internal(INI_TABLE *ini, const char *key, const char *def, int *lineno)
int ini_getuint(INI_TABLE *ini, const char *sec, const char *key, int def, int *lineno)
static void * ini_dblalloc(void *ptr, int size)