aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ini.h49
-rw-r--r--src/ini.c113
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
diff --git a/src/ini.c b/src/ini.c
index 9f3b8f7..efc94e5 100644
--- a/src/ini.c
+++ b/src/ini.c
@@ -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) {