#include "compile.h" char* escape(char* buff, size_t len) { char* str; size_t pos; size_t spos; char c; len++; str = malloc(len); pos = 0; spos = 0; while (pos < len - 1) { c = buff[pos]; if (c == '\n' || c == '\r') { len++; str = realloc(str, len); str[spos] = '\\'; spos++; str[spos] = 'n'; spos++; } else if (c == '\\') { len++; str = realloc(str, len); str[spos] = '\\'; spos++; str[spos] = '\\'; spos++; } else if (c == '"') { len++; str = realloc(str, len); str[spos] = '\\'; spos++; str[spos] = '"'; spos++; } else { str[spos] = c; spos++; } pos++; } str[pos] = 0; return str; } void wstart(FILE* stream) { fputs("#include <strct.h>\n#include <stdlib.h>\n#include <string.h>\n", stream); } void whead(FILE* stream, char* page) { fprintf(stream, "char* display_%s(tpl_data dat, size_t *size)\n{\n\tchar* var;\n\tchar* buffer;\n\tbuffer = malloc(4);\n\tbuffer[0] = 0;\n", page); } void wpage(FILE* stream, auto_t page) { while (page != 0) { if (page->type == 0) { fprintf(stream, "\t*size += %u;\n\tbuffer = realloc(buffer, *size + 1);\n\tbuffer = strcat(buffer, \"%s\");\n", page->len, escape(page->value, page->len) ); } else if (page->type == 1) { fprintf(stream, "\tvar = tpl_get(dat, \"%s\");\n\ \tif (var != 0)\n\t{\n\t\t*size += strlen(var);\n\t\tbuffer = realloc(buffer, *size + 1);\n\t\tbuffer = strcat(buffer, var);\n\t}\n", escape(page->value, page->len)); } page = page->next; } } void wend(FILE* stream) { fputs("\treturn buffer;\n}\n", stream); }