From d34ad0a03acace2868cdde5eaf3394e5940c72e7 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Sun, 23 Apr 2017 01:30:37 +0100 Subject: [PATCH] hmml_to_html.c: Fix BuildReference() order [#16] Remove dependency on string.h Correctly free everything on every return from main() --- hmml_to_html/hmml_to_html.c | 72 +++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c index f8c82f6..7bface7 100644 --- a/hmml_to_html/hmml_to_html.c +++ b/hmml_to_html/hmml_to_html.c @@ -13,7 +13,6 @@ typedef unsigned int bool; #include // NOTE(matt): varargs #include // NOTE(matt): printf, sprintf, vsprintf, fprintf, perror #include // NOTE(matt): calloc, malloc, free -#include // NOTE(matt): strncmp, memset #include "hmmlib.h" typedef struct @@ -123,6 +122,24 @@ StringsDiffer(char *A, char *B) return *A - *B; } +bool +StringsDifferL(char *A, char *B, int LengthofA) +{ + int i = 0; + while(i < LengthofA && A[i] && A[i] == B[i]) + { + ++i; + } + if(!A[i] && LengthofA == i) + { + return FALSE; + } + else + { + return TRUE; + } +} + typedef struct { unsigned int Hue:16; @@ -222,19 +239,20 @@ char *CategoryMedium[] = int BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMML_Reference Ref, HMML_Annotation Anno) { - if(Ref.page && Ref.url && Ref.title) + if(Ref.url && Ref.title && Ref.author && Ref.publisher && Ref.isbn) + { + CopyString(ReferencesArray[UniqueRefs].ID, Ref.isbn); + CopyString(ReferencesArray[UniqueRefs].Source, "%s (%s)", Ref.author, Ref.publisher); + CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); + CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); + } + else if(Ref.page && Ref.url && Ref.title) { CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); CopyString(ReferencesArray[UniqueRefs].Source, Ref.title); CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.page); CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); } - else if(Ref.url && Ref.title) - { - CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); - CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); - CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); - } else if(Ref.site && Ref.page && Ref.url) { CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); @@ -242,12 +260,6 @@ BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMM CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.page); CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); } - else if(Ref.site && Ref.url) - { - CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); - CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.site); - CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); - } else if(Ref.site && Ref.url && Ref.title) { CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); @@ -255,13 +267,6 @@ BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMM CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); } - else if(Ref.url && Ref.title && Ref.author && Ref.publisher && Ref.isbn) - { - CopyString(ReferencesArray[UniqueRefs].ID, Ref.isbn); - CopyString(ReferencesArray[UniqueRefs].Source, "%s (%s)", Ref.author, Ref.publisher); - CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); - CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); - } else if(Ref.title && Ref.author && Ref.isbn) { CopyString(ReferencesArray[UniqueRefs].ID, Ref.isbn); @@ -283,6 +288,18 @@ BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMM CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); } + else if(Ref.url && Ref.title) + { + CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); + CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title); + CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); + } + else if(Ref.site && Ref.url) + { + CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); + CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.site); + CopyString(ReferencesArray[UniqueRefs].URL, Ref.url); + } else { return 1; @@ -352,7 +369,7 @@ GenerateTopicColours(buffer *Colour, char *Topic) while(TopicsPtr - TopicsBuffer < TopicsLength) { TopicsPtr += 39; - if(!strncmp(SanitisePunctuation(Topic), TopicsPtr, StringLength(Topic))) + if(!StringsDifferL(SanitisePunctuation(Topic), TopicsPtr, StringLength(Topic))) { free(TopicsBuffer); fclose(TopicsFile); @@ -434,8 +451,7 @@ main(int ArgC, char **Args) if(HMML.well_formed) { ClaimBuffer(MemoryArena, &ClaimedMemory, &Title, 1024 * 16); - ref_info ReferencesArray[200]; - memset(ReferencesArray, 0, sizeof(ReferencesArray)); + ref_info ReferencesArray[200] = { 0 }; ClaimBuffer(MemoryArena, &ClaimedMemory, &Player, 1024 * 256); bool HasQuoteMenu = FALSE; @@ -576,6 +592,8 @@ Readable); else { fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line); + hmml_free(&HMML); + free(MemoryArena); return 1; } } @@ -605,8 +623,8 @@ AppendedIdentifier: else { fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line); - free(MemoryArena); hmml_free(&HMML); + free(MemoryArena); return 1; } @@ -625,8 +643,8 @@ AppendedIdentifier: else { fprintf(stderr, "%s:%d: Reference must have an ISBN or URL", Args[FileIndex], Anno->line); - free(MemoryArena); hmml_free(&HMML); + free(MemoryArena); return 1; } } @@ -935,6 +953,8 @@ HMML.metadata.annotator); if(!(OutFile = fopen("out.html", "w"))) { perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); return 1; } fwrite(Master.Location, Master.Ptr - Master.Location, 1, OutFile);