aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Allen <axlecrusher@gmail.com>2017-03-07 20:33:19 -0500
committerJoshua Allen <axlecrusher@gmail.com>2017-03-07 20:33:19 -0500
commit90ed96e7b59e60a39f1e1f33223c6ffb0ee833f7 (patch)
tree6d7f81727a3c707d5aff3517ccf98d48fc7c3d7b
parenta7b423ba1f0b28d0e6f3f375475cf93d66b922c9 (diff)
downloadlibsurvive-90ed96e7b59e60a39f1e1f33223c6ffb0ee833f7.tar.gz
libsurvive-90ed96e7b59e60a39f1e1f33223c6ffb0ee833f7.tar.bz2
parse out integers and floats
-rw-r--r--calibrate_client.c6
-rw-r--r--src/survive_config.c81
-rw-r--r--src/survive_config.h1
3 files changed, 86 insertions, 2 deletions
diff --git a/calibrate_client.c b/calibrate_client.c
index 927f40f..9867d67 100644
--- a/calibrate_client.c
+++ b/calibrate_client.c
@@ -149,6 +149,12 @@ int main()
const char *s = config_read_str(&global_config_values, "test123","default");
printf("%s\n", s);
+ FLT *f;
+
+ uint16_t fs = config_read_float_array(lh_config+1, "fcalgibpha", &f, NULL, 0);
+ printf("%d\n", fs);
+ printf("===> %f %f\n", f[0], f[1]);
+
// config_save("config.json");
diff --git a/src/survive_config.c b/src/survive_config.c
index 83951fb..d8bad17 100644
--- a/src/survive_config.c
+++ b/src/survive_config.c
@@ -4,6 +4,8 @@
#include "survive_config.h"
#include <json_helpers.h>
+#include <errno.h>
+
#define MAX_CONFIG_ENTRIES 100
#define MAX_LIGHTHOUSES 2
@@ -99,6 +101,21 @@ FLT config_read_float(config_group *cg, const char *tag, const FLT def) {
return config_set_float(cg, tag, def);
}
+uint16_t config_read_float_array(config_group *cg, const char *tag, FLT** values, const FLT* def, uint16_t count) {
+ config_entry *cv = find_config_entry(cg, tag);
+
+ if (cv != NULL) {
+ *values = (FLT*)cv->data;
+ return cv->elements;
+ }
+
+ if (def == NULL) return 0;
+
+ config_set_float_a(cg, tag, def, count);
+ *values = def;
+ return count;
+}
+
config_entry* next_unused_entry(config_group *cg) {
config_entry *cv = cg->config_entries + cg->used_entries;
assert(cg->used_entries < cg->max_entries);
@@ -239,13 +256,73 @@ void pop_config_group() {
cg_stack_head--;
}
+
+int parse_floats(char* tag, char** values, uint16_t count) {
+ uint16_t i = 0;
+ FLT f[count];
+ char* end = NULL;
+ config_group* cg = cg_stack[cg_stack_head];
+
+ for(i=0;i<count;++i) {
+
+ #ifdef USE_DOUBLE
+ f[i] = strtod(values[i], &end);
+ #else
+ f[i] = strtof(values[i], &end);
+ #endif
+
+// if (values[i] == end) return 0; //not a float
+ if (*end != '\0') return 0; //not an integer
+ }
+
+ if (count>1) {
+ config_set_float_a(cg, tag, f, count);
+ }
+ else {
+ config_set_float(cg, tag, f[0]);
+ }
+
+ return 1;
+}
+
+int parse_uint32(char* tag, char** values, uint16_t count) {
+ uint16_t i = 0;
+ uint32_t l[count];
+ char* end = NULL;
+ config_group* cg = cg_stack[cg_stack_head];
+
+/*
+ //look for non numeric values
+ for(end=values[0];*end!='\0';++end) {
+ if ((*end<48) || (*end>57)) return 0;
+ }
+
+ end=NULL;
+*/
+ for(i=0;i<count;++i) {
+ l[i] = strtol(values[i], &end, 10);
+// if (values[i] == end) return 0; //not an integer
+ if (*end != '\0') return 0; //not an integer
+ }
+
+// if (count>1)
+// config_set_uint32_array(cg, tag, f, count);
+// else
+ config_set_uint32(cg, tag, l[0]);
+
+ return 1;
+}
+
void handle_tag_value(char* tag, char** values, uint16_t count) {
print_json_value(tag,values,count);
config_group* cg = cg_stack[cg_stack_head];
- //parse out numeric values
+ if (parse_uint32(tag,values,count) > 0) return; //parse integers first, stricter rules
+
+ if (parse_floats(tag,values,count) > 0) return;
- if (count == 1) config_set_str(cg,tag,values[0]);
+ //should probably also handle string arrays
+ config_set_str(cg,tag,values[0]);
// else if (count>1) config_set_str
}
diff --git a/src/survive_config.h b/src/survive_config.h
index b14f928..234db68 100644
--- a/src/survive_config.h
+++ b/src/survive_config.h
@@ -48,6 +48,7 @@ const uint32_t config_set_uint32(config_group *cg, const char *tag, const uint32
const char* config_set_str(config_group *cg, const char *tag, const char* value);
FLT config_read_float(config_group *cg, const char *tag, const FLT def);
+uint16_t config_read_float_array(config_group *cg, const char *tag, FLT** values, const FLT* def, uint16_t count);
uint32_t config_read_uint32(config_group *cg, const char *tag, const uint32_t def);
const char* config_read_str(config_group *cg, const char *tag, const char *def);