#include #include #include "cms_template.h" cms_template_args* cms_template_args_create() { cms_template_args* args = malloc(sizeof(cms_template_args)); if (!args) return NULL; args->arguments = NULL; args->argnum = 0; args->allocd = 0; return args; } cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val) { args->argnum += 1; if (args->argnum > args->allocd) { args->allocd *= 2; args->arguments = realloc( args->arguments, sizeof(cms_template_arg) * args->allocd ); if (!args->arguments) return cms_err_create(CMS_ERR_ALLOC, 0); } cms_template_arg arg = {key, val}; args->arguments[args->argnum - 1] = arg; return cms_err_create(CMS_ERR_NONE, NULL); } static char* str_insert( char* str1, char* str2, size_t start, size_t end, size_t len) { size_t len2 = strlen(str2); str1 = realloc(str1, len + len2 - (end - start)); if (str1 == NULL) return NULL; memmove(str1 + end, str1 + start, len - start); memcpy(str1 + start, str2, len2); return str1; } static char* templatify_arg(char* str, cms_template_arg arg, size_t len) { #define OFFSET i - match_start size_t match_start = 0; size_t i = 0; int in_match = 0; char c; while ((c = str[i]) != 0) { if (!in_match && arg.key[0] == c) { match_start = i; in_match = 1; } if (in_match && arg.key[OFFSET] != 0) { if (arg.key[OFFSET] != c) in_match = 0; } else if (in_match) { str = str_insert(str, arg.val, match_start, i, len); if (str == NULL) return NULL; in_match = 0; } i += 1; } #undef OFFSET return str; } char* cms_templateify(char* str, cms_template_args* args) { size_t len = strlen(str); size_t i; for (i = 0; i < args->argnum; ++i) { str = templatify_arg(str, args->arguments[i], len); if (str == NULL) return NULL; } return str; }