refactor(hmpl): fix warnings
This commit is contained in:
@@ -10,11 +10,11 @@ stdenv.mkDerivation {
|
||||
nativeBuildInputs = [ gcc ];
|
||||
|
||||
buildPhase = ''
|
||||
${bash}/bin/sh ./build.sh
|
||||
${bash}/bin/sh ./make.sh build
|
||||
'';
|
||||
|
||||
checkPhase = ''
|
||||
${bash}/bin/sh ./check.sh
|
||||
${bash}/bin/sh ./make.sh check
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
|
||||
@@ -28,7 +28,7 @@ char *eval_string(Arena *arena, const Json * const context, const char * const q
|
||||
|
||||
/* Modified: text is passed by reference so we can update it and free old allocations */
|
||||
// {{[prefix]key}}
|
||||
void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, Json *context, const char * const prefix) {
|
||||
void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, const Json * const context, const char * const prefix) {
|
||||
raise_debug("hmpl_render_interpolation_tags");
|
||||
char start_pattern[256];
|
||||
snprintf(start_pattern, sizeof(start_pattern), "{{%s", prefix);
|
||||
@@ -58,7 +58,7 @@ void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, Json *context
|
||||
}
|
||||
char *new_text = arena_repstr(arena, current_text,
|
||||
start_index,
|
||||
end - start + 1,
|
||||
end - start + 2,
|
||||
replacement);
|
||||
|
||||
*text_ptr = new_text;
|
||||
@@ -134,8 +134,7 @@ void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, Json *context
|
||||
|
||||
// {{#array_key}}
|
||||
void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, const char * const prefix_start, const char * const prefix_end, const char * const separator_pattern){
|
||||
raise_debug("hmpl_render_section_tags");
|
||||
printf('key');
|
||||
raise_debug("hmpl_render_section_tags(%p, %s, <optimized>, %s, %s, %s)", arena, *text_ptr, prefix_start, prefix_end, separator_pattern);
|
||||
char start_pattern[32];
|
||||
snprintf(start_pattern, sizeof(start_pattern), "{{%s", prefix_start);
|
||||
int start_pattern_length = strlen(start_pattern);
|
||||
@@ -153,7 +152,6 @@ void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, cons
|
||||
int offset = 0;
|
||||
|
||||
while (1) {
|
||||
printf('key');
|
||||
char *current_text = *text_ptr;
|
||||
char *opening_tag_start = strstr(current_text + offset, start_pattern);
|
||||
if (!opening_tag_start)
|
||||
@@ -174,26 +172,14 @@ void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, cons
|
||||
raise_exception("Malformed template: missing closing braces for section tag");
|
||||
exit(1);
|
||||
}
|
||||
printf('key');
|
||||
|
||||
printf('key');
|
||||
assert((size_t)opening_tag_end > (size_t)opening_tag_separator);
|
||||
assert((size_t)opening_tag_separator > (size_t)opening_tag_start);
|
||||
printf('key');
|
||||
|
||||
int key_length = (opening_tag_separator - current_text) - relative_key_start;
|
||||
assert(key_length > 0);
|
||||
printf('key');
|
||||
|
||||
char *key = arena_alloc(arena, key_length + 1);
|
||||
//substr_clone(current_text, key, relative_key_start, key_length);
|
||||
printf('key');
|
||||
key[2] = 'c';
|
||||
char c=key[2];
|
||||
printf('ksdjfoejisvjmeiw');
|
||||
printf('key: %d\n', c);
|
||||
printf('key: %p\n', key[2]);
|
||||
printf('key: %p\n', key);
|
||||
substr_clone(current_text, key, relative_key_start, key_length);
|
||||
|
||||
int element_name_length = (opening_tag_end - current_text) - element_name_start;
|
||||
assert(element_name_length > 0);
|
||||
@@ -203,11 +189,11 @@ void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, cons
|
||||
|
||||
int close_tag_patern_length = start_pattern_length + key_length + end_pattern_length;
|
||||
char *close_tag_patern = arena_alloc(arena, close_tag_patern_length + 1);
|
||||
snprintf(close_tag_patern, sizeof(close_tag_patern), "%s%s%s", start_pattern, key, end_pattern);
|
||||
snprintf(close_tag_patern, sizeof(*close_tag_patern), "%s%s%s", start_pattern, key, end_pattern);
|
||||
|
||||
char *close_tag = strstr(opening_tag_end + offset + 1, close_tag_patern);
|
||||
if (!close_tag) {
|
||||
raise_exception('Malformed template: missing loop end for key %s', key);
|
||||
raise_exception("Malformed template: missing loop end for key %s", key);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -219,26 +205,34 @@ void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, cons
|
||||
|
||||
char *replacement = arena_alloc(arena, MEM_KiB * elem_count);
|
||||
size_t offset = 0;
|
||||
|
||||
char *block_buff = arena_alloc(arena, MEM_KiB);
|
||||
size_t block_start = (size_t)opening_tag_end + 2;
|
||||
size_t block_len = (size_t)opening_tag_end - (size_t)close_tag - 2;
|
||||
raise_trace("block_len %p = %p - %p - 2", block_len, opening_tag_end, close_tag);
|
||||
assert(block_len > 0);
|
||||
substr_clone(current_text, block_buff, block_start, block_len);
|
||||
|
||||
for (Json *elem = arr->child; elem; elem = elem->next) {
|
||||
char *block = arena_alloc(arena, MEM_KiB);
|
||||
substr_clone(current_text, block, opening_tag_end + 2, close_tag - opening_tag_end - 2);
|
||||
char *block = arena_strdup(arena, block_buff);
|
||||
|
||||
char *prefix = arena_alloc(arena, element_name_length + 2);
|
||||
snprintf(prefix, element_name_length + 2, "%s.", element_name);
|
||||
|
||||
hmpl_render_interpolation_tags(arena, block, context, prefix);
|
||||
hmpl_render_interpolation_tags(arena, &block, context, prefix);
|
||||
raise_trace("block after: %s", block);
|
||||
|
||||
size_t block_len = strlen(block);
|
||||
memcpy(replacement + offset, block, block_len);
|
||||
offset += block_len;
|
||||
}
|
||||
|
||||
|
||||
replacement[offset] = '\0';
|
||||
raise_trace("replacement: %s", replacement);
|
||||
|
||||
char *new_text = arena_repstr(arena, current_text,
|
||||
opening_tag_start - 1,
|
||||
close_tag + close_tag_patern_length - opening_tag_start + 1,
|
||||
(size_t)opening_tag_start - 1,
|
||||
close_tag + close_tag_patern_length - opening_tag_start + 2,
|
||||
replacement);
|
||||
|
||||
*text_ptr = new_text;
|
||||
|
||||
@@ -13,12 +13,12 @@ void init_cjson_with_arenas(Arena *arena);
|
||||
char *eval_string(Arena *arena, const Json * const context, const char * const key);
|
||||
|
||||
/* Modified: text is passed by reference so we can update it and free old allocations */
|
||||
void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, Json *context, const char * const prefix);
|
||||
void hmpl_render_interpolation_tags(Arena *arena, char **text_ptr, const Json * const context, const char * const prefix);
|
||||
|
||||
void hmpl_render_section_tags(Arena *arena, char **text_ptr, Json *context, const char * const prefix_start, const char * const prefix_end, const char * const separator_pattern);
|
||||
|
||||
void render_template_with_arena(Arena *arena, char **text, const Json * const ccontext);
|
||||
void hmpl_render_with_arena(Arena *arena, char **text, const Json * const context);
|
||||
|
||||
void render_template(char **text, const Json * const context);
|
||||
void hmpl_render(char **text, const Json * const context);
|
||||
|
||||
#endif // EPRINTF_HMPL
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
" }\n" \
|
||||
"}"
|
||||
|
||||
#define TEST_DATA_INTERPOLATION_TEMPLATE \
|
||||
#define TEST_DATA_INTERPOLATION_TEMPLATE \
|
||||
"Hello {{persona.name}} {{persona.surname}},\n" \
|
||||
"\n" \
|
||||
"Your home address:\n" \
|
||||
@@ -49,7 +49,7 @@
|
||||
"Home Phone: {{persona.contact.phone.home}}\n" \
|
||||
"Mobile Phone: {{persona.contact.phone.mobile}}\n"
|
||||
|
||||
#define TEST_DATA_INTERPOLATION_RESULT \
|
||||
#define TEST_DATA_INTERPOLATION_RESULT \
|
||||
"Hello John Doe,\n" \
|
||||
"\n" \
|
||||
"Your home address:\n" \
|
||||
@@ -70,7 +70,7 @@
|
||||
#define TEST_DATA_INTERPOLATION_WITH_PREFIX_CONTEXT \
|
||||
TEST_DATA_INTERPOLATION_CONTEXT
|
||||
|
||||
#define TEST_DATA_INTERPOLATION_WITH_PREFIX_TEMPLATE \
|
||||
#define TEST_DATA_INTERPOLATION_WITH_PREFIX_TEMPLATE \
|
||||
"Hello {{.persona.name}} {{.persona.surname}},\n" \
|
||||
"\n" \
|
||||
"Your home address:\n" \
|
||||
@@ -88,10 +88,10 @@
|
||||
"Home Phone: {{.persona.contact.phone.home}}\n" \
|
||||
"Mobile Phone: {{.persona.contact.phone.mobile}}\n"
|
||||
|
||||
#define TEST_DATA_INTERPOLATION_WITH_PREFIX_RESULT \
|
||||
#define TEST_DATA_INTERPOLATION_WITH_PREFIX_RESULT \
|
||||
TEST_DATA_INTERPOLATION_RESULT
|
||||
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_CONTEXT \
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_CONTEXT \
|
||||
"{" \
|
||||
" \"array\": [" \
|
||||
" { \"field\": { \"subfield\": \"value1\" } }," \
|
||||
@@ -100,18 +100,18 @@
|
||||
" ]" \
|
||||
"}"
|
||||
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_TEMPLATE \
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_TEMPLATE \
|
||||
"{{#array element}}" \
|
||||
" {{element.field.subfield}}" \
|
||||
"{{/array}}"
|
||||
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_RESULT \
|
||||
#define TEST_DATA_SIMPLE_SECTION_ITERATION_RESULT \
|
||||
"value1" \
|
||||
"value2" \
|
||||
"value3"
|
||||
|
||||
void test_eval_single_level_key(Arena *arena) {
|
||||
char *context_text = arena_strdup(arena, "{\"name\": \"world\"}");
|
||||
const char *context_text = arena_strdup(arena, "{\"name\": \"world\"}");
|
||||
Json *context = json_parse(arena, &context_text);
|
||||
if (!context) { raise_exception("Malformed json"); exit(1); }
|
||||
|
||||
@@ -121,7 +121,7 @@ void test_eval_single_level_key(Arena *arena) {
|
||||
}
|
||||
|
||||
void test_eval_nested_key(Arena *arena) {
|
||||
char *context_text = arena_strdup(arena, "{\"person\": {\"name\": \"Alice\"}}");
|
||||
const char *context_text = arena_strdup(arena, "{\"person\": {\"name\": \"Alice\"}}");
|
||||
Json *context = json_parse(arena, &context_text);
|
||||
if (!context) { raise_exception("Malformed json"); exit(1); }
|
||||
|
||||
@@ -131,18 +131,20 @@ void test_eval_nested_key(Arena *arena) {
|
||||
}
|
||||
|
||||
void test_render_interpolation_tags(Arena *arena) {
|
||||
char *context_text = arena_strdup(arena, TEST_DATA_INTERPOLATION_CONTEXT);
|
||||
raise_trace("test_render_interpolation_tags(arena)");
|
||||
const char *context_text = arena_strdup(arena, TEST_DATA_INTERPOLATION_CONTEXT);
|
||||
Json *context = json_parse(arena, &context_text);
|
||||
if (!context) { raise_exception("Malformed json"); exit(1); }
|
||||
|
||||
char *text = arena_strdup(arena, TEST_DATA_INTERPOLATION_TEMPLATE);
|
||||
|
||||
hmpl_render_interpolation_tags(arena, &text, context, "");
|
||||
raise_trace("text: %s", text);
|
||||
assert(strcmp(text, TEST_DATA_INTERPOLATION_RESULT) == 0);
|
||||
}
|
||||
|
||||
void test_render_interpolation_tags_with_prefix(Arena *arena) {
|
||||
char *context_text = arena_strdup(arena, TEST_DATA_INTERPOLATION_WITH_PREFIX_CONTEXT);
|
||||
const char *context_text = arena_strdup(arena, TEST_DATA_INTERPOLATION_WITH_PREFIX_CONTEXT);
|
||||
Json *context = json_parse(arena, &context_text);
|
||||
if (!context) { raise_exception("Malformed json"); exit(1); }
|
||||
|
||||
@@ -153,7 +155,7 @@ void test_render_interpolation_tags_with_prefix(Arena *arena) {
|
||||
}
|
||||
|
||||
void test_render_section_tags(Arena *arena) {
|
||||
char *context_text = arena_strdup(arena, TEST_DATA_SIMPLE_SECTION_ITERATION_CONTEXT);
|
||||
const char *context_text = arena_strdup(arena, TEST_DATA_SIMPLE_SECTION_ITERATION_CONTEXT);
|
||||
Json *context = json_parse(arena, &context_text);
|
||||
if (!context) { raise_exception("Malformed json"); exit(1); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user