diff options
| -rw-r--r-- | include/ini.h | 49 | ||||
| -rw-r--r-- | src/ini.c | 113 | 
2 files changed, 151 insertions, 11 deletions
diff --git a/include/ini.h b/include/ini.h index d7cf056..5c840f5 100644 --- a/include/ini.h +++ b/include/ini.h @@ -14,17 +14,21 @@  #define INI_SEARCH_SUBSTR 2                                      ///< expanded to preserve runtime state. -#define INIVAL_TYPE_INT 1           ///< Integer -#define INIVAL_TYPE_UINT 2          ///< Unsigned integer -#define INIVAL_TYPE_LONG 3          ///< Long integer -#define INIVAL_TYPE_ULONG 4         ///< Unsigned long integer -#define INIVAL_TYPE_LLONG 5         ///< Long long integer -#define INIVAL_TYPE_ULLONG 6        ///< Unsigned long long integer -#define INIVAL_TYPE_DOUBLE 7        ///< Double precision float -#define INIVAL_TYPE_FLOAT 8         ///< Single precision float -#define INIVAL_TYPE_STR 9           ///< String -#define INIVAL_TYPE_STR_ARRAY 10    ///< String Array -#define INIVAL_TYPE_BOOL 11         ///< Boolean +#define INIVAL_TYPE_CHAR 1          ///< Byte +#define INIVAL_TYPE_UCHAR 2         ///< Unsigned byte +#define INIVAL_TYPE_SHORT 3         ///< Short integer +#define INIVAL_TYPE_USHORT 4        ///< Unsigned short integer +#define INIVAL_TYPE_INT 5           ///< Integer +#define INIVAL_TYPE_UINT 6          ///< Unsigned integer +#define INIVAL_TYPE_LONG 7          ///< Long integer +#define INIVAL_TYPE_ULONG 8         ///< Unsigned long integer +#define INIVAL_TYPE_LLONG 9         ///< Long long integer +#define INIVAL_TYPE_ULLONG 10       ///< Unsigned long long integer +#define INIVAL_TYPE_DOUBLE 11       ///< Double precision float +#define INIVAL_TYPE_FLOAT 12        ///< Single precision float +#define INIVAL_TYPE_STR 13          ///< String +#define INIVAL_TYPE_STR_ARRAY 14    ///< String Array +#define INIVAL_TYPE_BOOL 15         ///< Boolean  #define INIVAL_TO_LIST 1 << 1 @@ -32,6 +36,10 @@   * \brief Consolidate possible value types   */  union INIVal { +    char as_char;                    ///< Byte +    unsigned char as_uchar;          ///< Unsigned byte +    short as_short;                  ///< Short integer +    unsigned short as_ushort;        ///< Unsigned short integer      int as_int;                      ///< Integer      unsigned as_uint;                ///< Unsigned integer      long as_long;                    ///< Long integer @@ -226,4 +234,23 @@ int ini_write(struct INIFILE *ini, FILE **stream, unsigned mode);   * @param ini   */  void ini_free(struct INIFILE **ini); + +int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int *state); +unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int *state); +long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int *state); +unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int *state); +long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int *state); +unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int *state); +float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int *state); +double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int *state); +bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int *state); +short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int *state); +unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int *state); +char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int *state); +unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int *state); +char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int *state); +char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int *state); +char **ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int *state); +char **ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int *state); +struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int *state);  #endif //STASIS_INI_H @@ -123,6 +123,18 @@ int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, uni          return -1;      }      switch (type) { +        case INIVAL_TYPE_CHAR: +            result->as_char = (char) strtol(data->value, NULL, 10); +            break; +        case INIVAL_TYPE_UCHAR: +            result->as_uchar = (unsigned char) strtoul(data->value, NULL, 10); +            break; +        case INIVAL_TYPE_SHORT: +            result->as_short = (short) strtol(data->value, NULL, 10); +            break; +        case INIVAL_TYPE_USHORT: +            result->as_ushort = (unsigned short) strtoul(data->value, NULL, 10); +            break;          case INIVAL_TYPE_INT:              result->as_int = (int) strtol(data->value, NULL, 10);              break; @@ -175,6 +187,107 @@ int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, uni      return 0;  } +#define getval_returns(t) return result.t +#define getval_setup(t) \ +    union INIVal result; \ +    int state_local = 0; \ +    state_local = ini_getval(ini, section_name, key, t, &result); \ +    if (state != NULL) { \ +        *state = state_local; \ +    } + +int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_INT) +    getval_returns(as_int); +} + +unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_UINT) +    getval_returns(as_uint); +} + +long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_LONG) +    getval_returns(as_long); +} + +unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_ULONG) +    getval_returns(as_ulong); +} + +long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_LLONG) +    getval_returns(as_llong); +} + +unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_ULLONG) +    getval_returns(as_ullong); +} + +float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_FLOAT) +    getval_returns(as_float); +} + +double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_DOUBLE) +    getval_returns(as_double); +} + +bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_BOOL) +    getval_returns(as_bool); +} + +short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_SHORT) +    getval_returns(as_short); +} + +unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_USHORT) +    getval_returns(as_ushort); +} + +char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_CHAR) +    getval_returns(as_char); +} + +unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_UCHAR) +    getval_returns(as_uchar); +} + +char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_STR) +    getval_returns(as_char_p); +} + +char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int *state) { +    return ini_getval_char_p(ini, section_name, key, state); +} + +char **ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int *state) { +    getval_setup(INIVAL_TYPE_STR_ARRAY) +    getval_returns(as_char_array_p); +} + +char **ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int *state) { +    return ini_getval_char_array_p(ini, section_name, key, state); +} + +struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int *state) { +    getval_setup(INIVAL_TYPE_STR_ARRAY) +    struct StrList *list; +    list = strlist_init(); +    strlist_append_tokenize(list, result.as_char_p, tok); +    guard_free(result.as_char_p); +    return list; +} +  int ini_data_append(struct INIFILE **ini, char *section_name, char *key, char *value) {      struct INISection *section = ini_section_search(ini, INI_SEARCH_EXACT, section_name);      if (section == NULL) {  | 
