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 1.8KB

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