From 03ccba43bbd5448e5b481ec795a97cf1ba65a4e7 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Fri, 16 Jun 2017 08:55:59 +0100 Subject: [PATCH] hmml_to_html.c: Integrate keeping comments [#25] It straight up replaces comments with our content, while preserving other comments --- hmml_to_html/hmml_to_html.c | 245 ++++++++++++++++++------------------ 1 file changed, 119 insertions(+), 126 deletions(-) diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c index 916b2df..3767296 100644 --- a/hmml_to_html/hmml_to_html.c +++ b/hmml_to_html/hmml_to_html.c @@ -304,7 +304,7 @@ StringsDiffer(char *A, char *B) // NOTE(matt): Two null-terminated strings bool StringsDifferT(char *A, // NOTE(matt): Null-terminated string char *B, // NOTE(matt): Not null-terminated string (e.g. one mid-buffer) - char Terminator // NOTE(matt): Caller definable terminator. Pass '\0' to only match on the extent of A + char Terminator // NOTE(matt): Caller definable terminator. Pass 0 to only match on the extent of A ) { int ALength = StringLength(A); @@ -2169,11 +2169,11 @@ CategoryMedium[j][2] " \n" " \n" -" \n"); +" "); CopyStringToBuffer(&Player, " \n" -" \n"); +" "); // TODO(matt): Maybe do something about indentation levels CopyStringToBuffer(&Header, @@ -2186,12 +2186,11 @@ CategoryMedium[j][2] " \n" " \n" " \n" -" \n", +" ", HMML.metadata.project); CopyStringToBuffer(&Script, -" "); - // - //NOTE(matt): Collate the buffers! + #if DEBUG printf("Buffer Collation\n\n"); #endif @@ -2394,25 +2392,24 @@ HMML.metadata.project); } fseek(TemplateFile, 0, SEEK_END); - int TemplateSize = ftell(TemplateFile); + buffer Template; + Template.ID = "Template"; + Template.Size = ftell(TemplateFile); fseek(TemplateFile, 0, SEEK_SET); - char *TemplateBuffer; - if(!(TemplateBuffer = malloc(TemplateSize))) + if(!(Template.Location = malloc(Template.Size))) { perror(Args[0]); hmml_free(&HMML); free(MemoryArena); return 1; } - fread(TemplateBuffer, TemplateSize, 1, TemplateFile); + fread(Template.Location, Template.Size, 1, TemplateFile); fclose(TemplateFile); - char *OutputBuffer; - if(!(OutputBuffer = malloc(TemplateSize + Master.Size))) + buffer Output; + Output.ID = "Output"; + if(!(Output.Location = malloc(Template.Size + Master.Size))) { - perror(Args[0]); free(TemplateBuffer); hmml_free(&HMML); free(MemoryArena); return 1; + perror(Args[0]); free(Template.Location); hmml_free(&HMML); free(MemoryArena); return 1; } - char *TemplatePtr = TemplateBuffer; - char *OutputPtr = OutputBuffer; - char *HeaderTag = "__CINERA_HEADER__"; char *TitleTag = "__CINERA_TITLE__"; char *PlayerTag = "__CINERA_PLAYER__"; @@ -2423,120 +2420,113 @@ HMML.metadata.project); bool FoundPlayer = FALSE; bool FoundScript = FALSE; - while(TemplatePtr - TemplateBuffer < TemplateSize) + while(Template.Ptr - Template.Location < Template.Size) { - if(*TemplatePtr == '!') + if(*Template.Ptr == '!' && (Template.Ptr > Template.Location && !StringsDifferT(" tag\n"); - free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; - } - FoundHeader = TRUE; - OutputPtr = CommentStart; - OutputPtr += CopyStringNoFormat(OutputPtr, Header.Location); - while(TemplatePtr - TemplateBuffer < TemplateSize) - { - if(TemplatePtr[0] == '>' && TemplatePtr[-1] == '-' && TemplatePtr[-2] == '-') - { - break; - } - ++TemplatePtr; - } - ++TemplatePtr; - break; - } - else if(!(StringsDifferT(TitleTag, TemplatePtr, '\0'))) - { - if(FoundTitle == TRUE) - { - fprintf(stderr, "Template contains more than one tag\n"); - free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; - } - /* TODO(matt): Allow setting a Title format, e.g. - <-- __CINERA_TITLE__ "%s - HandmadeDev" --> - Where %s is replaced with the HMML.metadata.title - Perhaps it would be saner to do this in the config file - */ - FoundTitle = TRUE; - OutputPtr = CommentStart; - OutputPtr += CopyStringNoFormat(OutputPtr, Title.Location); - while(TemplatePtr - TemplateBuffer < TemplateSize) - { - if(TemplatePtr[0] == '>' && TemplatePtr[-1] == '-' && TemplatePtr[-2] == '-') - { - break; - } - ++TemplatePtr; - } - ++TemplatePtr; - break; - } - else if(!(StringsDifferT(PlayerTag, TemplatePtr, '\0'))) - { - if(FoundPlayer == TRUE) - { - fprintf(stderr, "Template contains more than one tag\n"); - free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; - } - FoundPlayer = TRUE; - OutputPtr = CommentStart; - OutputPtr += CopyStringNoFormat(OutputPtr, Player.Location); - while(TemplatePtr - TemplateBuffer < TemplateSize) - { - if(TemplatePtr[0] == '>' && TemplatePtr[-1] == '-' && TemplatePtr[-2] == '-') - { - break; - } - ++TemplatePtr; - } - ++TemplatePtr; - break; - } - else if(!(StringsDifferT(ScriptTag, TemplatePtr, '\0'))) - { - if(FoundScript == TRUE) - { - fprintf(stderr, "Template contains more than one tag\n"); - free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; - } - FoundScript = TRUE; - OutputPtr = CommentStart; - OutputPtr += CopyStringNoFormat(OutputPtr, Script.Location); - while(TemplatePtr - TemplateBuffer < TemplateSize) - { - if(TemplatePtr[0] == '>' && TemplatePtr[-1] == '-' && TemplatePtr[-2] == '-') - { - break; - } - ++TemplatePtr; - } - ++TemplatePtr; - break; - } + fprintf(stderr, "Template contains more than one tag\n"); + free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena); return 1; } - *OutputPtr++ = *TemplatePtr++; + FoundHeader = TRUE; + Output.Ptr = CommentStart; + CopyBuffer(&Output, &Header); + while(Template.Ptr - Template.Location < Template.Size) + { + if(!StringsDifferT("-->", Template.Ptr, 0)) + { + Template.Ptr += StringLength("-->"); + break; + } + ++Template.Ptr; + } + break; } - } - else - { - *OutputPtr++ = *TemplatePtr++; + else if(!(StringsDifferT(TitleTag, Template.Ptr, 0))) + { + if(FoundTitle == TRUE) + { + fprintf(stderr, "Template contains more than one tag\n"); + free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena); return 1; + } + /* TODO(matt): Allow setting a Title format, e.g. + <-- __CINERA_TITLE__ "%s - HandmadeDev" --> + Where %s is replaced with the HMML.metadata.title + Perhaps it would be saner to do this in the config file + */ + FoundTitle = TRUE; + Output.Ptr = CommentStart; + CopyBuffer(&Output, &Title); + while(Template.Ptr - Template.Location < Template.Size) + { + if(!StringsDifferT("-->", Template.Ptr, 0)) + { + Template.Ptr += StringLength("-->"); + printf("%c%c%c\n", Template.Ptr[-1], Template.Ptr[0], Template.Ptr[1]); + break; + } + ++Template.Ptr; + } + break; + } + 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); return 1; + } + FoundPlayer = TRUE; + Output.Ptr = CommentStart; + CopyBuffer(&Output, &Player); + 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(FoundScript == TRUE) + { + fprintf(stderr, "Template contains more than one tag\n"); + free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena); return 1; + } + FoundScript = TRUE; + Output.Ptr = CommentStart; + CopyBuffer(&Output, &Script); + 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; + } + *Output.Ptr++ = *Template.Ptr++; } } else { - *OutputPtr++ = *TemplatePtr++; + *Output.Ptr++ = *Template.Ptr++; } } @@ -2545,9 +2535,9 @@ HMML.metadata.project); FILE *OutFile; if(!(OutFile = fopen("out_integrated.html", "w"))) { - perror(Args[0]); free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; + perror(Args[0]); free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena); return 1; } - fwrite(OutputBuffer, OutputPtr - OutputBuffer, 1, OutFile); + fwrite(Output.Location, Output.Ptr - Output.Location, 1, OutFile); fclose(OutFile); } else @@ -2557,11 +2547,11 @@ HMML.metadata.project); if(!FoundTitle) { fprintf(stderr, " \n"); } if(!FoundPlayer) { fprintf(stderr, " \n"); } if(!FoundScript) { fprintf(stderr, " \n"); } - free(TemplateBuffer); free(OutputBuffer); hmml_free(&HMML); free(MemoryArena); return 1; + free(Template.Location); free(Output.Location); hmml_free(&HMML); free(MemoryArena); return 1; } - free(TemplateBuffer); - free(OutputBuffer); + free(Template.Location); + free(Output.Location); } else { @@ -2573,10 +2563,13 @@ HMML.metadata.project); //NOTE(matt): Here is where we do all our CopyBuffer() calls CopyBuffer(&Master, &Header); CopyStringToBuffer(&Master, +"\n" " \n" " \n"); CopyBuffer(&Master, &Title); + CopyStringToBuffer(&Master, "\n"); CopyBuffer(&Master, &Player); + CopyStringToBuffer(&Master, "\n"); CopyBuffer(&Master, &Script); CopyStringToBuffer(&Master, "\n"); //