diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c
index 41b2cb6..8187049 100644
--- a/hmml_to_html/hmml_to_html.c
+++ b/hmml_to_html/hmml_to_html.c
@@ -1260,8 +1260,7 @@ PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, ch
int
main(int ArgC, char **Args)
{
- // TODO(matt): Read all defaults from the config and probably validate the
- // template up front
+ // TODO(matt): Read all defaults from the config
char *DefaultCSSDir = ".";
char *CSSDir = DefaultCSSDir;
@@ -1274,8 +1273,10 @@ main(int ArgC, char **Args)
char *DefaultDefaultMedium = "programming";
char *DefaultMedium = DefaultDefaultMedium;
+ bool HasTemplate = FALSE;
char *DefaultTemplateLocation = "template.html";
char *TemplateLocation = DefaultTemplateLocation;
+ HasTemplate = TRUE;
char *DefaultOutLocation = "out.html";
char *OutLocation = DefaultOutLocation;
@@ -1381,7 +1382,181 @@ main(int ArgC, char **Args)
QuoteDir[StringLength(QuoteDir) - 1] = '\0';
}
- // TODO(matt): Validate template
+ // TODO(matt): Put the Errors in the MemoryArena
+ buffer Errors;
+ Errors.ID = "Errors";
+ Errors.Size = Kilobytes(1);
+ if(!(Errors.Location = malloc(Errors.Size)))
+ {
+ perror(Args[0]); return 1;
+ }
+ Errors.Ptr = Errors.Location;
+ bool HaveErrors = FALSE;
+
+ buffer Template;
+ Template.ID = "Template";
+ if(HasTemplate)
+ {
+ if(CINERA_MODE && !StringsDiffer(CINERA_MODE, "INTEGRATE"))
+ {
+ FILE *TemplateFile;
+ if(!(TemplateFile = fopen(TemplateLocation, "r")))
+ {
+ perror(Args[0]); return 1;
+ }
+
+ fseek(TemplateFile, 0, SEEK_END);
+ Template.Size = ftell(TemplateFile);
+ fseek(TemplateFile, 0, SEEK_SET);
+ if(!(Template.Location = malloc(Template.Size)))
+ {
+ perror(Args[0]); return 1;
+ }
+ Template.Ptr = Template.Location;
+ fread(Template.Location, Template.Size, 1, TemplateFile);
+ fclose(TemplateFile);
+
+ char *IncludesTag = "__CINERA_INCLUDES__";
+ char *TitleTag = "__CINERA_TITLE__";
+ char *MenusTag = "__CINERA_MENUS__";
+ char *PlayerTag = "__CINERA_PLAYER__";
+ char *ScriptTag = "__CINERA_SCRIPT__";
+
+ bool FoundIncludes = FALSE;
+ bool FoundMenus = FALSE;
+ bool FoundPlayer = FALSE;
+ bool FoundScript = FALSE;
+
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(*Template.Ptr == '!' && (Template.Ptr > Template.Location && !StringsDifferT(" tag\n");
+ HaveErrors = TRUE;
+ }
+ FoundIncludes = TRUE;
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ Template.Ptr += StringLength("-->");
+ break;
+ }
+ ++Template.Ptr;
+ }
+ break;
+ }
+
+ else if(!(StringsDifferT(TitleTag, Template.Ptr, 0)))
+ {
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ Template.Ptr += StringLength("-->");
+ break;
+ }
+ ++Template.Ptr;
+ }
+ break;
+ }
+ else if(!(StringsDifferT(MenusTag, Template.Ptr, 0)))
+ {
+ if(!ForceIntegration && FoundMenus == TRUE)
+ {
+ CopyStringToBuffer(&Errors, "Template contains more than one tag\n");
+ HaveErrors = TRUE;
+ }
+ FoundMenus = TRUE;
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ Template.Ptr += StringLength("-->");
+ break;
+ }
+ ++Template.Ptr;
+ }
+ break;
+ }
+ else if(!(StringsDifferT(PlayerTag, Template.Ptr, 0)))
+ {
+ if(!ForceIntegration && FoundPlayer == TRUE)
+ {
+ CopyStringToBuffer(&Errors, "Template contains more than one tag\n");
+ HaveErrors = TRUE;
+ }
+ FoundPlayer = TRUE;
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ Template.Ptr += StringLength("-->");
+ break;
+ }
+ ++Template.Ptr;
+ }
+ break;
+ }
+ else if(!(StringsDifferT(ScriptTag, Template.Ptr, 0)))
+ {
+ if(!ForceIntegration && FoundPlayer == FALSE)
+ {
+ CopyStringToBuffer(&Errors, " must come after \n");
+ HaveErrors = TRUE;
+ }
+ if(!ForceIntegration && FoundScript == TRUE)
+ {
+ CopyStringToBuffer(&Errors, "Template contains more than one tag\n");
+ HaveErrors = TRUE;
+ }
+ FoundScript = TRUE;
+ while(Template.Ptr - Template.Location < Template.Size)
+ {
+ if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ Template.Ptr += StringLength("-->");
+ break;
+ }
+ ++Template.Ptr;
+ }
+ break;
+ }
+ else if(!StringsDifferT("-->", Template.Ptr, 0))
+ {
+ break;
+ }
+ Template.Ptr++;
+ }
+ }
+ else
+ {
+ Template.Ptr++;
+ }
+ }
+
+ if(!HaveErrors && FoundIncludes && FoundMenus && FoundPlayer && FoundScript)
+ {
+ Template.Ptr = Template.Location;
+ free(Errors.Location);
+ }
+ else
+ {
+ if(!FoundIncludes){ CopyStringToBuffer(&Errors, "Template must include one tag\n"); };
+ if(!FoundMenus){ CopyStringToBuffer(&Errors, "Template must include one tag\n"); };
+ if(!FoundPlayer){ CopyStringToBuffer(&Errors, "Template must include one tag\n"); };
+ if(!FoundScript){ CopyStringToBuffer(&Errors, "Template must include one tag\n"); };
+ fprintf(stderr, "%s", Errors.Location);
+ free(Template.Location); free(Errors.Location); return 1;
+ }
+ }
+ }
// NOTE(matt): Init MemoryArena
buffer MemoryArena;
@@ -2628,25 +2803,6 @@ main(int ArgC, char **Args)
if(CINERA_MODE && !StringsDiffer(CINERA_MODE, "INTEGRATE"))
{
- FILE *TemplateFile;
- if(!(TemplateFile = fopen(TemplateLocation, "r")))
- {
- perror(Args[0]); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
-
- fseek(TemplateFile, 0, SEEK_END);
- buffer Template;
- Template.ID = "Template";
- Template.Size = ftell(TemplateFile);
- fseek(TemplateFile, 0, SEEK_SET);
- if(!(Template.Location = malloc(Template.Size)))
- {
- perror(Args[0]); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- Template.Ptr = Template.Location;
- fread(Template.Location, Template.Size, 1, TemplateFile);
- fclose(TemplateFile);
-
buffer Output;
Output.Size = Template.Size + Master.Size;
Output.ID = "Output";
@@ -2662,11 +2818,6 @@ main(int ArgC, char **Args)
char *PlayerTag = "__CINERA_PLAYER__";
char *ScriptTag = "__CINERA_SCRIPT__";
- bool FoundIncludes = FALSE;
- bool FoundMenus = FALSE;
- bool FoundPlayer = FALSE;
- bool FoundScript = FALSE;
-
while(Template.Ptr - Template.Location < Template.Size)
{
if(*Template.Ptr == '!' && (Template.Ptr > Template.Location && !StringsDifferT(" tag\n");
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- FoundIncludes = TRUE;
Output.Ptr = CommentStart;
CopyBuffer(&Output, &Includes);
while(Template.Ptr - Template.Location < Template.Size)
@@ -2713,12 +2858,6 @@ main(int ArgC, char **Args)
}
else if(!(StringsDifferT(MenusTag, Template.Ptr, 0)))
{
- if(FoundMenus == TRUE)
- {
- fprintf(stderr, "Template contains more than one tag\n");
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- FoundMenus = TRUE;
Output.Ptr = CommentStart;
CopyBuffer(&Output, &Menus);
while(Template.Ptr - Template.Location < Template.Size)
@@ -2734,12 +2873,6 @@ main(int ArgC, char **Args)
}
else if(!(StringsDifferT(PlayerTag, Template.Ptr, 0)))
{
- if(FoundPlayer == TRUE)
- {
- fprintf(stderr, "Template contains more than one tag\n");
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- FoundPlayer = TRUE;
Output.Ptr = CommentStart;
CopyBuffer(&Output, &Player);
while(Template.Ptr - Template.Location < Template.Size)
@@ -2755,17 +2888,6 @@ main(int ArgC, char **Args)
}
else if(!(StringsDifferT(ScriptTag, Template.Ptr, 0)))
{
- if(!ForceIntegration && FoundPlayer == FALSE)
- {
- fprintf(stderr, " must come after \n");
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- if(FoundScript == TRUE)
- {
- fprintf(stderr, "Template contains more than one tag\n");
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- FoundScript = TRUE;
Output.Ptr = CommentStart;
CopyBuffer(&Output, &Script);
while(Template.Ptr - Template.Location < Template.Size)
@@ -2792,25 +2914,13 @@ main(int ArgC, char **Args)
}
}
- if(ForceIntegration || (FoundIncludes && FoundMenus && FoundPlayer && FoundScript))
+ FILE *OutFile;
+ if(!(OutFile = fopen(OutIntegratedLocation, "w")))
{
- FILE *OutFile;
- if(!(OutFile = fopen(OutIntegratedLocation, "w")))
- {
- perror(OutIntegratedLocation); free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
- }
- fwrite(Output.Location, Output.Ptr - Output.Location, 1, OutFile);
- fclose(OutFile);
- }
- else
- {
- fprintf(stderr, "Template is missing necessary tags:\n");
- if(!FoundIncludes) { fprintf(stderr, " \n"); }
- if(!FoundMenus) { fprintf(stderr, " \n"); }
- if(!FoundPlayer) { fprintf(stderr, " \n"); }
- if(!FoundScript) { fprintf(stderr, " \n"); }
- free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
+ perror(OutIntegratedLocation); free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena.Location); return 1;
}
+ fwrite(Output.Location, Output.Ptr - Output.Location, 1, OutFile);
+ fclose(OutFile);
free(Template.Location);
free(Output.Location);