Skip to content

Commit ea43740

Browse files
committed
Fix parsing of scientific values for float and double config entries
1 parent 6255d3d commit ea43740

File tree

8 files changed

+67
-21
lines changed

8 files changed

+67
-21
lines changed

src/test/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ INCS = -I$(REPO_ROOT)/src \
3232

3333
CFLAGS = -W -Wall -Wextra -Werror -g -O0 -Wno-multichar -ffunction-sections -Wl,--gc-sections -I$(BUILD_DIR) $(INCS)
3434

35-
all: $(BUILD_DIR) diff test
35+
all: $(BUILD_DIR) test diff
3636

37-
test: diff $(PROG)
37+
test: $(PROG)
3838
./$(PROG)
3939
{ \
4040
x=0; \

src/test/data/golden/mgos_config.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
/* struct mgos_config */
1717
static const struct mgos_conf_entry mgos_config_schema_[] = {
18-
{.type = CONF_TYPE_OBJECT, .key = "", .offset = 0, .num_desc = 40},
18+
{.type = CONF_TYPE_OBJECT, .key = "", .offset = 0, .num_desc = 42},
1919
{.type = CONF_TYPE_OBJECT, .key = "wifi", .offset = offsetof(struct mgos_config, wifi), .num_desc = 8},
2020
{.type = CONF_TYPE_OBJECT, .key = "sta", .offset = offsetof(struct mgos_config, wifi.sta), .num_desc = 2},
2121
{.type = CONF_TYPE_STRING, .key = "ssid", .offset = offsetof(struct mgos_config, wifi.sta.ssid)},
@@ -29,14 +29,16 @@ static const struct mgos_conf_entry mgos_config_schema_[] = {
2929
{.type = CONF_TYPE_OBJECT, .key = "http", .offset = offsetof(struct mgos_config, http), .num_desc = 2},
3030
{.type = CONF_TYPE_BOOL, .key = "enable", .offset = offsetof(struct mgos_config, http.enable)},
3131
{.type = CONF_TYPE_INT, .key = "port", .offset = offsetof(struct mgos_config, http.port)},
32-
{.type = CONF_TYPE_OBJECT, .key = "debug", .offset = offsetof(struct mgos_config, debug), .num_desc = 9},
32+
{.type = CONF_TYPE_OBJECT, .key = "debug", .offset = offsetof(struct mgos_config, debug), .num_desc = 11},
3333
{.type = CONF_TYPE_INT, .key = "level", .offset = offsetof(struct mgos_config, debug.level)},
3434
{.type = CONF_TYPE_STRING, .key = "dest", .offset = offsetof(struct mgos_config, debug.dest)},
3535
{.type = CONF_TYPE_STRING, .key = "file_level", .offset = offsetof(struct mgos_config, debug.file_level)},
3636
{.type = CONF_TYPE_DOUBLE, .key = "test_d1", .offset = offsetof(struct mgos_config, debug.test_d1)},
3737
{.type = CONF_TYPE_DOUBLE, .key = "test_d2", .offset = offsetof(struct mgos_config, debug.test_d2)},
38+
{.type = CONF_TYPE_DOUBLE, .key = "test_d3", .offset = offsetof(struct mgos_config, debug.test_d3)},
3839
{.type = CONF_TYPE_FLOAT, .key = "test_f1", .offset = offsetof(struct mgos_config, debug.test_f1)},
3940
{.type = CONF_TYPE_FLOAT, .key = "test_f2", .offset = offsetof(struct mgos_config, debug.test_f2)},
41+
{.type = CONF_TYPE_FLOAT, .key = "test_f3", .offset = offsetof(struct mgos_config, debug.test_f3)},
4042
{.type = CONF_TYPE_UNSIGNED_INT, .key = "test_ui", .offset = offsetof(struct mgos_config, debug.test_ui)},
4143
{.type = CONF_TYPE_OBJECT, .key = "empty", .offset = offsetof(struct mgos_config, debug.empty), .num_desc = 0},
4244
{.type = CONF_TYPE_OBJECT, .key = "test", .offset = offsetof(struct mgos_config, test), .num_desc = 16},
@@ -143,7 +145,7 @@ bool mgos_config_http_parse_f(const char *fname, struct mgos_config_http *cfg) {
143145

144146
/* struct mgos_config_debug_empty */
145147
const struct mgos_conf_entry *mgos_config_debug_empty_get_schema(void) {
146-
return &mgos_config_schema_[23];
148+
return &mgos_config_schema_[25];
147149
}
148150

149151
void mgos_config_debug_empty_set_defaults(struct mgos_config_debug_empty *cfg) {
@@ -169,8 +171,10 @@ void mgos_config_debug_set_defaults(struct mgos_config_debug *cfg) {
169171
cfg->file_level = "mg_foo.c=4";
170172
cfg->test_d1 = 2.0;
171173
cfg->test_d2 = 0.0;
174+
cfg->test_d3 = 0.0001;
172175
cfg->test_f1 = 0.123;
173176
cfg->test_f2 = 123.0;
177+
cfg->test_f3 = 1e-05;
174178
cfg->test_ui = 4294967295;
175179
mgos_config_debug_empty_set_defaults(&cfg->empty);
176180
}
@@ -185,7 +189,7 @@ bool mgos_config_debug_parse_f(const char *fname, struct mgos_config_debug *cfg)
185189

186190
/* struct mgos_config_baz */
187191
const struct mgos_conf_entry *mgos_config_baz_get_schema(void) {
188-
return &mgos_config_schema_[39];
192+
return &mgos_config_schema_[41];
189193
}
190194

191195
void mgos_config_baz_set_defaults(struct mgos_config_baz *cfg) {
@@ -202,7 +206,7 @@ bool mgos_config_baz_parse_f(const char *fname, struct mgos_config_baz *cfg) {
202206

203207
/* struct mgos_config_bar_inner */
204208
const struct mgos_conf_entry *mgos_config_bar_inner_get_schema(void) {
205-
return &mgos_config_schema_[36];
209+
return &mgos_config_schema_[38];
206210
}
207211

208212
void mgos_config_bar_inner_set_defaults(struct mgos_config_bar_inner *cfg) {
@@ -220,7 +224,7 @@ bool mgos_config_bar_inner_parse_f(const char *fname, struct mgos_config_bar_inn
220224

221225
/* struct mgos_config_baz */
222226
const struct mgos_conf_entry *mgos_config_bar_baz_get_schema(void) {
223-
return &mgos_config_schema_[39];
227+
return &mgos_config_schema_[41];
224228
}
225229

226230
void mgos_config_bar_baz_set_defaults(struct mgos_config_baz *cfg) {
@@ -237,7 +241,7 @@ bool mgos_config_bar_baz_parse_f(const char *fname, struct mgos_config_baz *cfg)
237241

238242
/* struct mgos_config_bar */
239243
const struct mgos_conf_entry *mgos_config_bar_get_schema(void) {
240-
return &mgos_config_schema_[33];
244+
return &mgos_config_schema_[35];
241245
}
242246

243247
void mgos_config_bar_set_defaults(struct mgos_config_bar *cfg) {
@@ -257,7 +261,7 @@ bool mgos_config_bar_parse_f(const char *fname, struct mgos_config_bar *cfg) {
257261

258262
/* struct mgos_config_bar_inner */
259263
const struct mgos_conf_entry *mgos_config_test_bar1_inner_get_schema(void) {
260-
return &mgos_config_schema_[36];
264+
return &mgos_config_schema_[38];
261265
}
262266

263267
void mgos_config_test_bar1_inner_set_defaults(struct mgos_config_bar_inner *cfg) {
@@ -275,7 +279,7 @@ bool mgos_config_test_bar1_inner_parse_f(const char *fname, struct mgos_config_b
275279

276280
/* struct mgos_config_baz */
277281
const struct mgos_conf_entry *mgos_config_test_bar1_baz_get_schema(void) {
278-
return &mgos_config_schema_[39];
282+
return &mgos_config_schema_[41];
279283
}
280284

281285
void mgos_config_test_bar1_baz_set_defaults(struct mgos_config_baz *cfg) {
@@ -292,7 +296,7 @@ bool mgos_config_test_bar1_baz_parse_f(const char *fname, struct mgos_config_baz
292296

293297
/* struct mgos_config_bar */
294298
const struct mgos_conf_entry *mgos_config_test_bar1_get_schema(void) {
295-
return &mgos_config_schema_[33];
299+
return &mgos_config_schema_[35];
296300
}
297301

298302
void mgos_config_test_bar1_set_defaults(struct mgos_config_bar *cfg) {
@@ -312,7 +316,7 @@ bool mgos_config_test_bar1_parse_f(const char *fname, struct mgos_config_bar *cf
312316

313317
/* struct mgos_config_bar_inner */
314318
const struct mgos_conf_entry *mgos_config_test_bar2_inner_get_schema(void) {
315-
return &mgos_config_schema_[36];
319+
return &mgos_config_schema_[38];
316320
}
317321

318322
void mgos_config_test_bar2_inner_set_defaults(struct mgos_config_bar_inner *cfg) {
@@ -330,7 +334,7 @@ bool mgos_config_test_bar2_inner_parse_f(const char *fname, struct mgos_config_b
330334

331335
/* struct mgos_config_baz */
332336
const struct mgos_conf_entry *mgos_config_test_bar2_baz_get_schema(void) {
333-
return &mgos_config_schema_[39];
337+
return &mgos_config_schema_[41];
334338
}
335339

336340
void mgos_config_test_bar2_baz_set_defaults(struct mgos_config_baz *cfg) {
@@ -347,7 +351,7 @@ bool mgos_config_test_bar2_baz_parse_f(const char *fname, struct mgos_config_baz
347351

348352
/* struct mgos_config_bar */
349353
const struct mgos_conf_entry *mgos_config_test_bar2_get_schema(void) {
350-
return &mgos_config_schema_[33];
354+
return &mgos_config_schema_[35];
351355
}
352356

353357
void mgos_config_test_bar2_set_defaults(struct mgos_config_bar *cfg) {
@@ -367,7 +371,7 @@ bool mgos_config_test_bar2_parse_f(const char *fname, struct mgos_config_bar *cf
367371

368372
/* struct mgos_config_test */
369373
const struct mgos_conf_entry *mgos_config_test_get_schema(void) {
370-
return &mgos_config_schema_[24];
374+
return &mgos_config_schema_[26];
371375
}
372376

373377
void mgos_config_test_set_defaults(struct mgos_config_test *cfg) {
@@ -530,6 +534,11 @@ double mgos_config_get_debug_test_d2(const struct mgos_config *cfg) { return cfg
530534
double mgos_config_get_default_debug_test_d2(void) { return 0.0; }
531535
void mgos_config_set_debug_test_d2(struct mgos_config *cfg, double v) { cfg->debug.test_d2 = v; }
532536

537+
/* debug.test_d3 */
538+
double mgos_config_get_debug_test_d3(const struct mgos_config *cfg) { return cfg->debug.test_d3; }
539+
double mgos_config_get_default_debug_test_d3(void) { return 0.0001; }
540+
void mgos_config_set_debug_test_d3(struct mgos_config *cfg, double v) { cfg->debug.test_d3 = v; }
541+
533542
/* debug.test_f1 */
534543
float mgos_config_get_debug_test_f1(const struct mgos_config *cfg) { return cfg->debug.test_f1; }
535544
float mgos_config_get_default_debug_test_f1(void) { return 0.123; }
@@ -540,6 +549,11 @@ float mgos_config_get_debug_test_f2(const struct mgos_config *cfg) { return cfg-
540549
float mgos_config_get_default_debug_test_f2(void) { return 123.0; }
541550
void mgos_config_set_debug_test_f2(struct mgos_config *cfg, float v) { cfg->debug.test_f2 = v; }
542551

552+
/* debug.test_f3 */
553+
float mgos_config_get_debug_test_f3(const struct mgos_config *cfg) { return cfg->debug.test_f3; }
554+
float mgos_config_get_default_debug_test_f3(void) { return 1e-05; }
555+
void mgos_config_set_debug_test_f3(struct mgos_config *cfg, float v) { cfg->debug.test_f3 = v; }
556+
543557
/* debug.test_ui */
544558
unsigned int mgos_config_get_debug_test_ui(const struct mgos_config *cfg) { return cfg->debug.test_ui; }
545559
unsigned int mgos_config_get_default_debug_test_ui(void) { return 4294967295; }

src/test/data/golden/mgos_config.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,10 @@ struct mgos_config_debug {
149149
const char * file_level;
150150
double test_d1;
151151
double test_d2;
152+
double test_d3;
152153
float test_f1;
153154
float test_f2;
155+
float test_f3;
154156
unsigned int test_ui;
155157
struct mgos_config_debug_empty empty;
156158
};
@@ -672,6 +674,16 @@ static inline double mgos_sys_config_get_default_debug_test_d2(void) { return mg
672674
void mgos_config_set_debug_test_d2(struct mgos_config *cfg, double v);
673675
static inline void mgos_sys_config_set_debug_test_d2(double v) { mgos_config_set_debug_test_d2(&mgos_sys_config, v); }
674676

677+
/* debug.test_d3 */
678+
#define MGOS_CONFIG_HAVE_DEBUG_TEST_D3
679+
#define MGOS_SYS_CONFIG_HAVE_DEBUG_TEST_D3
680+
double mgos_config_get_debug_test_d3(const struct mgos_config *cfg);
681+
double mgos_config_get_default_debug_test_d3(void);
682+
static inline double mgos_sys_config_get_debug_test_d3(void) { return mgos_config_get_debug_test_d3(&mgos_sys_config); }
683+
static inline double mgos_sys_config_get_default_debug_test_d3(void) { return mgos_config_get_default_debug_test_d3(); }
684+
void mgos_config_set_debug_test_d3(struct mgos_config *cfg, double v);
685+
static inline void mgos_sys_config_set_debug_test_d3(double v) { mgos_config_set_debug_test_d3(&mgos_sys_config, v); }
686+
675687
/* debug.test_f1 */
676688
#define MGOS_CONFIG_HAVE_DEBUG_TEST_F1
677689
#define MGOS_SYS_CONFIG_HAVE_DEBUG_TEST_F1
@@ -692,6 +704,16 @@ static inline float mgos_sys_config_get_default_debug_test_f2(void) { return mgo
692704
void mgos_config_set_debug_test_f2(struct mgos_config *cfg, float v);
693705
static inline void mgos_sys_config_set_debug_test_f2(float v) { mgos_config_set_debug_test_f2(&mgos_sys_config, v); }
694706

707+
/* debug.test_f3 */
708+
#define MGOS_CONFIG_HAVE_DEBUG_TEST_F3
709+
#define MGOS_SYS_CONFIG_HAVE_DEBUG_TEST_F3
710+
float mgos_config_get_debug_test_f3(const struct mgos_config *cfg);
711+
float mgos_config_get_default_debug_test_f3(void);
712+
static inline float mgos_sys_config_get_debug_test_f3(void) { return mgos_config_get_debug_test_f3(&mgos_sys_config); }
713+
static inline float mgos_sys_config_get_default_debug_test_f3(void) { return mgos_config_get_default_debug_test_f3(); }
714+
void mgos_config_set_debug_test_f3(struct mgos_config *cfg, float v);
715+
static inline void mgos_sys_config_set_debug_test_f3(float v) { mgos_config_set_debug_test_f3(&mgos_sys_config, v); }
716+
695717
/* debug.test_ui */
696718
#define MGOS_CONFIG_HAVE_DEBUG_TEST_UI
697719
#define MGOS_SYS_CONFIG_HAVE_DEBUG_TEST_UI

src/test/data/golden/mgos_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"wifi":{"sta":{"ssid":"cookadoodadoo","pass":"try less cork"},"ap":{"ssid":"Quote \" me \\\\ please","pass":"","channel":6,"dhcp_end":"192.168.4.200"}},"foo":123,"http":{"enable":false,"port":80},"debug":{"level":1,"dest":"uart1","file_level":"mgos_bar=1","test_d1":2.000000,"test_d2":111.000000,"test_f1":0.123000,"test_f2":11.500000,"test_ui":4294967295,"empty":{}},"test":{"bar1":{"enable":false,"param1":1111,"inner":{"param2":"p2","param3":3333},"baz":{"bazaar":false}},"bar2":{"enable":false,"param1":2222,"inner":{"param2":"p2","param3":3333},"baz":{"bazaar":true}}}}
1+
{"wifi":{"sta":{"ssid":"cookadoodadoo","pass":"try less cork"},"ap":{"ssid":"Quote \" me \\\\ please","pass":"","channel":6,"dhcp_end":"192.168.4.200"}},"foo":123,"http":{"enable":false,"port":80},"debug":{"level":1,"dest":"uart1","file_level":"mgos_bar=1","test_d1":2.000000,"test_d2":111.000000,"test_d3":0.000100,"test_f1":0.123000,"test_f2":11.500000,"test_f3":0.000010,"test_ui":4294967295,"empty":{}},"test":{"bar1":{"enable":false,"param1":1111,"inner":{"param2":"p2","param3":3333},"baz":{"bazaar":false}},"bar2":{"enable":false,"param1":2222,"inner":{"param2":"p2","param3":3333},"baz":{"bazaar":true}}}}

src/test/data/golden/mgos_config_pretty.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
"file_level": "mgos_bar=1",
2323
"test_d1": 2.000000,
2424
"test_d2": 111.000000,
25+
"test_d3": 0.000100,
2526
"test_f1": 0.123000,
2627
"test_f2": 11.500000,
28+
"test_f3": 0.000010,
2729
"test_ui": 4294967295,
2830
"empty": {
2931
}

src/test/data/golden/mgos_config_schema.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
["debug.file_level", "s", {"title": "File level"}],
1919
["debug.test_d1", "d", {"title": "Test doubles 1"}],
2020
["debug.test_d2", "d", {}],
21+
["debug.test_d3", "d", {}],
2122
["debug.test_f1", "f", {"title": "Test float 1"}],
2223
["debug.test_f2", "f", {}],
24+
["debug.test_f3", "f", {}],
2325
["debug.test_ui", "ui", {}],
2426
["debug.empty", "o", {"title": "Empty object with no fields"}],
2527
["test", "o", {}],

src/test/data/sys_conf_debug.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
["debug.file_level", "s", "mg_foo.c=4", {title: "File level"}],
1717
["debug.test_d1", "d", 0.123, {title: "Test doubles 1"}],
1818
["debug.test_d2", "d", 0, {}],
19+
["debug.test_d3", "d", 1e-04, {}],
1920
["debug.test_f1", "f", 0.123, {title: "Test float 1"}],
2021
["debug.test_f2", "f", 123, {}],
22+
["debug.test_f3", "f", 1e-05, {}],
2123
["debug.test_ui", "ui", 4294967295, {}],
2224
["debug.empty", "o", {title: "Empty object with no fields"}],
2325

tools/mgos_gen_config.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,18 +200,22 @@ def IsPrimitiveType(self):
200200

201201

202202
def ValidateDefault(self):
203-
if self.vtype in (SchemaEntry.V_FLOAT, SchemaEntry.V_DOUBLE) and type(self.default) is int:
204-
self.default = float(self.default)
203+
if (self.vtype in (SchemaEntry.V_FLOAT, SchemaEntry.V_DOUBLE) and
204+
type(self.default) in (int, str)):
205+
try:
206+
self.default = float(self.default)
207+
except ValueError:
208+
raise TypeError("%s: Invalid default value '%s'" % (self.path, self.default))
205209
if (self.vtype == SchemaEntry.V_BOOL and not isinstance(self.default, bool) or
206210
self.vtype == SchemaEntry.V_INT and not isinstance(self.default, int) or
207211
self.vtype == SchemaEntry.V_UNSIGNED_INT and not isinstance(self.default, int) or
208212
# In Python, boolvalue is an instance of int, but we don't want that.
209213
self.vtype == SchemaEntry.V_INT and isinstance(self.default, bool) or
210214
self.vtype in (SchemaEntry.V_FLOAT, SchemaEntry.V_DOUBLE) and not isinstance(self.default, float) or
211215
self.vtype == SchemaEntry.V_STRING and not isinstance(self.default, str)):
212-
raise TypeError("%s: Invalid default value type (%s)" % (self.path, type(self.default)))
216+
raise TypeError("%s: Invalid default value type '%s'" % (self.path, type(self.default)))
213217
if self.vtype == SchemaEntry.V_UNSIGNED_INT and self.default < 0:
214-
raise TypeError("%s: Invalid default unsigned value (%d)" % (self.path, self.default))
218+
raise TypeError("%s: Invalid default unsigned value '%d'" % (self.path, self.default))
215219

216220
def GetIdentifierName(self):
217221
return self.path.replace(".", "_")

0 commit comments

Comments
 (0)