From 32cbb152660566042ac25b00de4b19b1c90c0f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Mon, 16 Dec 2024 09:09:03 +0100 Subject: [PATCH] Serialize integer-ish config keys properly --- liberty.c | 3 ++- tests/liberty.c | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/liberty.c b/liberty.c index ff7c0c7..0690e89 100644 --- a/liberty.c +++ b/liberty.c @@ -4833,7 +4833,8 @@ config_item_write_kv_pair (struct config_writer *self, str_append_printf (self->output, "%s# %s\n", indent, value->schema->comment); - bool can_use_word = true; + char *end = NULL; + bool can_use_word = ((void) strtoll (key, &end, 10), end == key); for (const char *p = key; *p; p++) if (!config_tokenizer_is_word_char (*p)) can_use_word = false; diff --git a/tests/liberty.c b/tests/liberty.c index 92647ae..fddfb2c 100644 --- a/tests/liberty.c +++ b/tests/liberty.c @@ -647,7 +647,7 @@ static const struct config_schema g_config_test[] = .type = CONFIG_ITEM_INTEGER, .validate = test_config_validate_nonnegative, .default_ = "1" }, - { .name = "foobar", + { .name = "123", .type = CONFIG_ITEM_STRING, .default_ = "\"qux\\x01`\" \"\"`a`" }, {} @@ -676,10 +676,11 @@ test_config (void) config_item_destroy (invalid); hard_assert (!strcmp ("qux\001`a", - config_item_get (config.root, "top.foobar", NULL)->value.string.str)); + config_item_get (config.root, "top.123", NULL)->value.string.str)); struct str s = str_make (); config_item_write (config.root, true, &s); + print_debug ("%s", s.str); struct config_item *parsed = config_item_parse (s.str, s.len, false, NULL); hard_assert (parsed); config_item_destroy (parsed);