summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-07-26 19:13:38 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-07-28 16:34:18 -0700
commit3e731cc575d3e56af4537a74a2f42bf278ad172f (patch)
treeb2b94d48a8272b621bc472e25316af5697c27d55 /src
parente63cf6fa951b77819b846b8e52a5f89c404a2a19 (diff)
til_settings: filter til_settings_as_arg() results
Most of the time if there are undescribed settings in the settings hierarchy, they're just noise in the serialized as_arg form. So change til_settings_as_arg() to always skip undsecribed entries, and introduce til_settings_as_arg_unfiltered() for any use cases that actually want everything included. The unfiltered variant may just go the way of the dodo if nothing ever makes use of it.
Diffstat (limited to 'src')
-rw-r--r--src/til_settings.c30
-rw-r--r--src/til_settings.h1
2 files changed, 25 insertions, 6 deletions
diff --git a/src/til_settings.c b/src/til_settings.c
index 62f63e1..be8457d 100644
--- a/src/til_settings.c
+++ b/src/til_settings.c
@@ -600,11 +600,14 @@ static inline void fputs_escaped(til_str_t *out, const char *value, unsigned dep
}
-static int settings_as_arg(const til_settings_t *settings, unsigned depth, til_str_t *out)
+static int settings_as_arg(const til_settings_t *settings, int unfiltered, unsigned depth, til_str_t *out)
{
- for (size_t i = 0; i < settings->num; i++) {
+ for (size_t i = 0, j = 0; i < settings->num; i++) {
+ if (!unfiltered && !settings->entries[i]->desc)
+ continue;
+
/* FIXME TODO: detect errors */
- if (i > 0)
+ if (j > 0)
fputc_escaped(out, ',', depth);
if (settings->entries[i]->key) {
@@ -614,17 +617,18 @@ static int settings_as_arg(const til_settings_t *settings, unsigned depth, til_s
}
if (settings->entries[i]->value_as_nested_settings) {
- settings_as_arg(settings->entries[i]->value_as_nested_settings, depth + 1, out);
+ settings_as_arg(settings->entries[i]->value_as_nested_settings, unfiltered, depth + 1, out);
} else if (settings->entries[i]->value) {
fputs_escaped(out, settings->entries[i]->value, depth);
}
+ j++;
}
return 0;
}
-char * til_settings_as_arg(const til_settings_t *settings)
+static char * _settings_as_arg(const til_settings_t *settings, int unfiltered)
{
til_str_t *str;
@@ -632,13 +636,27 @@ char * til_settings_as_arg(const til_settings_t *settings)
if (!str)
return NULL;
- if (settings_as_arg(settings, 0, str) < 0)
+ if (settings_as_arg(settings, unfiltered, 0, str) < 0)
return til_str_free(str);
return til_str_to_buf(str, NULL);
}
+/* returns the serialized form of settings usable as a cli argument, omitting any undescribed settings */
+char * til_settings_as_arg(const til_settings_t *settings)
+{
+ return _settings_as_arg(settings, 0);
+}
+
+
+/* same as til_settings_as_arg() but including undescribed settings */
+char * til_settings_as_arg_unfiltered(const til_settings_t *settings)
+{
+ return _settings_as_arg(settings, 1);
+}
+
+
/* generate a positional label for a given setting, stored @ res_label.
* this is added specifically for labeling bare-value settings in an array subscript fashion...
*/
diff --git a/src/til_settings.h b/src/til_settings.h
index 77811f1..b025158 100644
--- a/src/til_settings.h
+++ b/src/til_settings.h
@@ -56,6 +56,7 @@ til_setting_t * til_settings_add_value(til_settings_t *settings, const char *key
void til_settings_reset_descs(til_settings_t *settings);
int til_settings_get_and_describe_value(const til_settings_t *settings, const til_setting_spec_t *spec, const char **res_value, til_setting_t **res_setting, const til_setting_desc_t **res_desc);
char * til_settings_as_arg(const til_settings_t *settings);
+char * til_settings_as_arg_unfiltered(const til_settings_t *settings);
int til_settings_apply_desc_generators(const til_settings_t *settings, const til_setting_desc_generator_t generators[], unsigned n_generators, til_setup_t *setup, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
int til_setting_desc_new(const til_settings_t *settings, const til_setting_spec_t *spec, const til_setting_desc_t **res_desc);
© All Rights Reserved