|
|
@@ -23,7 +23,10 @@ cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val) |
|
|
|
if (args->argnum > args->allocd) |
|
|
|
{ |
|
|
|
args->allocd *= 2; |
|
|
|
args->arguments = realloc(args->arguments, sizeof(cms_template_arg) * args->allocd); |
|
|
|
args->arguments = realloc( |
|
|
|
args->arguments, |
|
|
|
sizeof(cms_template_arg) * args->allocd |
|
|
|
); |
|
|
|
if (!args->arguments) |
|
|
|
return cms_err_create(CMS_ERR_ALLOC, 0); |
|
|
|
} |
|
|
@@ -34,30 +37,54 @@ cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val) |
|
|
|
return cms_err_create(CMS_ERR_NONE, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
static cms_err* str_insert(char* str1, char* str2, size_t start, size_t end, size_t len) |
|
|
|
static char* str_insert( |
|
|
|
char* str1, |
|
|
|
char* str2, |
|
|
|
size_t start, |
|
|
|
size_t end, |
|
|
|
size_t len) |
|
|
|
{ |
|
|
|
size_t len2 = strlen(str2); |
|
|
|
|
|
|
|
return cms_err_create(CMS_ERR_NONE, NULL); |
|
|
|
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 cms_err* templatify_arg(char* str, cms_template_arg arg, size_t len) |
|
|
|
static char* templatify_arg(char* str, cms_template_arg arg, size_t len) |
|
|
|
{ |
|
|
|
#define OFFSET i - match_begin |
|
|
|
#define OFFSET i - match_start |
|
|
|
|
|
|
|
size_t match_begin = -1; |
|
|
|
size_t match_start = 0; |
|
|
|
size_t i = 0; |
|
|
|
int in_match = 0; |
|
|
|
|
|
|
|
char c; |
|
|
|
while ((c = str[i]) != 0) |
|
|
|
{ |
|
|
|
if (match_begin == -1 && arg.key[0] == c) |
|
|
|
if (!in_match && arg.key[0] == c) |
|
|
|
{ |
|
|
|
match_begin = i; |
|
|
|
match_start = i; |
|
|
|
in_match = 1; |
|
|
|
} |
|
|
|
|
|
|
|
if (match_begin != -1 && arg.key[OFFSET] == 0) |
|
|
|
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; |
|
|
@@ -65,20 +92,20 @@ static cms_err* templatify_arg(char* str, cms_template_arg arg, size_t len) |
|
|
|
|
|
|
|
#undef OFFSET |
|
|
|
|
|
|
|
return cms_err_create(CMS_ERR_NONE, NULL); |
|
|
|
return str; |
|
|
|
} |
|
|
|
|
|
|
|
cms_err* cms_templateify(char* str, cms_template_args* args) |
|
|
|
char* cms_templateify(char* str, cms_template_args* args) |
|
|
|
{ |
|
|
|
size_t len = strlen(str); |
|
|
|
|
|
|
|
size_t i; |
|
|
|
for (i = 0; i < args->argnum; ++i) |
|
|
|
{ |
|
|
|
cms_err* err = templatify_arg(str, args->arguments[i], len); |
|
|
|
if (err) |
|
|
|
return err; |
|
|
|
str = templatify_arg(str, args->arguments[i], len); |
|
|
|
if (str == NULL) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
return cms_err_create(CMS_ERR_NONE, NULL); |
|
|
|
return str; |
|
|
|
} |