static JsonElement *LookupVariable(Seq *hash_stack, const char *name, size_t name_len) { assert(SeqLength(hash_stack) > 0); size_t num_comps = StringCountTokens(name, name_len, "."); JsonElement *base_var = NULL; { StringRef base_comp = StringGetToken(name, name_len, 0, "."); char *base_comp_str = xstrndup(base_comp.data, base_comp.len); for (ssize_t i = SeqLength(hash_stack) - 1; i >= 0; i--) { JsonElement *hash = SeqAt(hash_stack, i); if (!hash) { continue; } if (JsonGetElementType(hash) == JSON_ELEMENT_TYPE_CONTAINER && JsonGetContainerType(hash) == JSON_CONTAINER_TYPE_OBJECT) { JsonElement *var = JsonObjectGet(hash, base_comp_str); if (var) { base_var = var; break; } } } free(base_comp_str); } if (!base_var) { return NULL; } for (size_t i = 1; i < num_comps; i++) { if (JsonGetElementType(base_var) != JSON_ELEMENT_TYPE_CONTAINER || JsonGetContainerType(base_var) != JSON_CONTAINER_TYPE_OBJECT) { return NULL; } StringRef comp = StringGetToken(name, name_len, i, "."); char *comp_str = xstrndup(comp.data, comp.len); base_var = JsonObjectGet(base_var, comp_str); free(comp_str); if (!base_var) { return NULL; } } assert(base_var); return base_var; }
static bool SetDelimiters(const char *content, size_t content_len, char *delim_start, size_t *delim_start_len, char *delim_end, size_t *delim_end_len) { size_t num_tokens = StringCountTokens(content, content_len, " \t"); if (num_tokens != 2) { Log(LOG_LEVEL_WARNING, "Could not parse delimiter mustache, " "number of tokens is %llu, expected 2 in '%s'", (unsigned long long) num_tokens, content); return false; } StringRef first = StringGetToken(content, content_len, 0, " \t"); if (first.len > MUSTACHE_MAX_DELIM_SIZE) { Log(LOG_LEVEL_WARNING, "New mustache start delimiter exceeds the allowed size of %d in '%s'", MUSTACHE_MAX_DELIM_SIZE, content); return false; } strncpy(delim_start, first.data, first.len); delim_start[first.len] = '\0'; *delim_start_len = first.len; StringRef second = StringGetToken(content, content_len, 1, " \t"); if (second.len > MUSTACHE_MAX_DELIM_SIZE) { Log(LOG_LEVEL_WARNING, "New mustache start delimiter exceeds the allowed size of %d in '%s'", MUSTACHE_MAX_DELIM_SIZE, content); return false; } strncpy(delim_end, second.data, second.len); delim_end[second.len] = '\0'; *delim_end_len = second.len; return true; }