diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-08-07 11:00:34 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-08-07 11:00:34 -0400 |
commit | 190b1fcddf3db8257722dbb7fd0f7e5c74fc7597 (patch) | |
tree | d46eee787c189d116687f462978a887ac20717ce | |
parent | 1524075828995e14fef035ff5884134997c7479a (diff) | |
download | stasis-190b1fcddf3db8257722dbb7fd0f7e5c74fc7597.tar.gz |
Add ini_getvar_TYPE() functions
* These replace the functionality of static conv_TYPE() functions in delivery.c
* Add support for missing types: U/CHAR, U/SHORT, STRLIST
-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) { |