A static site generator, written in C
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cms_template.c 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "cms_template.h"
  4. #include <stdio.h>
  5. cms_template_args* cms_template_args_create()
  6. {
  7. cms_template_args* args = malloc(sizeof(cms_template_args));
  8. if (!args)
  9. return NULL;
  10. args->arguments = NULL;
  11. args->argnum = 0;
  12. args->allocd = 0;
  13. return args;
  14. }
  15. cms_err* cms_template_args_append(cms_template_args* args, char* key, char* val)
  16. {
  17. args->argnum += 1;
  18. if (args->argnum > args->allocd)
  19. {
  20. if (!args->allocd)
  21. args->allocd = 1;
  22. else
  23. args->allocd *= 2;
  24. args->arguments = realloc(
  25. args->arguments,
  26. sizeof(cms_template_arg) * args->allocd
  27. );
  28. if (!args->arguments)
  29. return cms_err_create(CMS_ERR_ALLOC, 0);
  30. }
  31. //Wrap key in {{ and }}
  32. size_t len = strlen(key);
  33. char* fullkey = malloc(len + 5);
  34. memcpy(fullkey, "{{", 2);
  35. memcpy(fullkey + 2, key, len);
  36. memcpy(fullkey + len + 2, "}}\0", 3);
  37. cms_template_arg arg = {fullkey, val};
  38. args->arguments[args->argnum - 1] = arg;
  39. return cms_err_create(CMS_ERR_NONE, NULL);
  40. }
  41. static char* str_insert(
  42. char* str1,
  43. char* str2,
  44. size_t start,
  45. size_t end,
  46. size_t str1len)
  47. {
  48. size_t str2len = strlen(str2);
  49. str1 = realloc(str1, str1len + str2len - (end - start));
  50. if (str1 == NULL)
  51. return NULL;
  52. memcpy(str1 + start + str2len, str1 + end, str1len - end);
  53. memcpy(str1 + start, str2, str2len);
  54. return str1;
  55. }
  56. static char* templateify_arg(char* str, cms_template_arg arg, size_t len)
  57. {
  58. #define OFFSET i - match_start
  59. size_t match_start = 0;
  60. size_t i = 0;
  61. int in_match = 0;
  62. char c;
  63. while ((c = str[i]) != 0)
  64. {
  65. if (!in_match && arg.key[0] == c)
  66. {
  67. match_start = i;
  68. in_match = 1;
  69. }
  70. if (in_match && arg.key[OFFSET] != 0)
  71. {
  72. if (arg.key[OFFSET] != c)
  73. in_match = 0;
  74. }
  75. else if (in_match)
  76. {
  77. str = str_insert(str, arg.val, match_start, i, len);
  78. if (str == NULL)
  79. return NULL;
  80. in_match = 0;
  81. }
  82. i += 1;
  83. }
  84. #undef OFFSET
  85. return str;
  86. }
  87. char* cms_templateify(char* fstr, cms_template_args* args)
  88. {
  89. size_t len = strlen(fstr);
  90. char* str = malloc(len);
  91. if (str == NULL)
  92. return NULL;
  93. memcpy(str, fstr, len);
  94. size_t i;
  95. for (i = 0; i < args->argnum; ++i)
  96. {
  97. str = templateify_arg(str, args->arguments[i], len);
  98. if (str == NULL)
  99. return NULL;
  100. len = strlen(str);
  101. }
  102. return str;
  103. }