From fabdcfe3f7dc890f89c0ca2f0ef034d189226531 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Sun, 29 May 2016 14:19:54 +0200 Subject: renderer: added support to truncate variables. this commit also documents variable formatters properly. --- src/renderer.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 8 deletions(-) (limited to 'src/renderer.c') diff --git a/src/renderer.c b/src/renderer.c index 5af3b8a..0f71ba7 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -10,6 +10,7 @@ #include #endif /* HAVE_CONFIG_H */ +#include #include #include #include @@ -61,6 +62,12 @@ char* blogc_format_variable(const char *name, sb_trie_t *global, sb_trie_t *local, sb_slist_t *foreach_var) { + // if used asked for a variable that exists, just return it right away + const char *value = blogc_get_variable(name, global, local); + if (value != NULL) + return sb_strdup(value); + + // do the same for special variable 'FOREACH_ITEM' if (0 == strcmp(name, "FOREACH_ITEM")) { if (foreach_var != NULL && foreach_var->data != NULL) { return sb_strdup(foreach_var->data); @@ -68,30 +75,69 @@ blogc_format_variable(const char *name, sb_trie_t *global, sb_trie_t *local, return NULL; } - char *var = NULL; + char *var = sb_strdup(name); + + size_t i; + size_t last = strlen(var); + + long int len = -1; + + // just walk till the last '_' + for (i = last - 1; i > 0 && var[i] >= '0' && var[i] <= '9'; i--); + + if (var[i] == '_' && (i + 1) < last) { // var ends with '_[0-9]+' + // passing NULL to endptr because our string was previously validated + len = strtol(var + i + 1, NULL, 10); + if (errno != 0) { + fprintf(stderr, "warning: invalid variable size for '%s' (%s), " + "ignoring.\n", var, strerror(errno)); + len = -1; + } + else { + var[i] = '\0'; + } + } + bool must_format = false; - if (sb_str_ends_with(name, "_FORMATTED")) { - var = sb_strndup(name, strlen(name) - 10); + + if (sb_str_ends_with(var, "_FORMATTED")) { + var[strlen(var) - 10] = '\0'; must_format = true; } - if (var == NULL) - var = sb_strdup(name); - const char *value = blogc_get_variable(var, global, local); + if ((0 == strcmp(var, "FOREACH_ITEM")) && + (foreach_var != NULL && foreach_var->data != NULL)) + value = foreach_var->data; + else + value = blogc_get_variable(var, global, local); + free(var); if (value == NULL) return NULL; char *rv = NULL; + if (must_format) { if (sb_str_starts_with(name, "DATE_")) { rv = blogc_format_date(value, global, local); } + else { + fprintf(stderr, "warning: no formatter found for '%s', " + "ignoring.\n", var); + rv = sb_strdup(value); + } + } + else { + rv = sb_strdup(value); + } + + if (len > 0) { + char *tmp = sb_strndup(rv, len); + free(rv); + rv = tmp; } - if (rv == NULL) - return sb_strdup(value); return rv; } -- cgit v1.2.3-18-g5258