Bontiv-Sourceer source code viewer
Root | Help
./web-crawler/src/tplcp/compile.c
#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);
}
Presented with Bontiv-Sourceer