diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c index 62c7b13..524f4f5 100644 --- a/hmml_to_html/hmml_to_html.c +++ b/hmml_to_html/hmml_to_html.c @@ -51,7 +51,7 @@ typedef struct int Identifier; } identifier; -#define REF_MAX_IDENTIFIER 32 +#define REF_MAX_IDENTIFIER 55 typedef struct { @@ -84,10 +84,28 @@ char *Credentials[ ][5] = #define ArrayCount(A) sizeof(A)/sizeof(*(A)) +#define ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size) if(__ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size))\ +{\ + fprintf(stderr, "%s:%d: MemoryArena cannot contain %s of size %d\n", __FILE__, __LINE__, ID, Size);\ + hmml_free(&HMML);\ + FreeBuffer(MemoryArena);\ + return 1;\ +}; + void -ClaimBuffer(char *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int Size) +FreeBuffer(buffer *Buffer) { - Buffer->Location = MemoryArena + *ClaimedMemory; + free(Buffer->Location); +} + +int +__ClaimBuffer(buffer *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int Size) +{ + if(*ClaimedMemory + Size > MemoryArena->Size) + { + return 1; + } + Buffer->Location = MemoryArena->Location + *ClaimedMemory; Buffer->Size = Size; Buffer->ID = ID; *ClaimedMemory += Buffer->Size; @@ -97,6 +115,7 @@ ClaimBuffer(char *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int printf(" Claimed: %s: %d\n" " Total ClaimedMemory: %d\n\n", Buffer->ID, Buffer->Size, *ClaimedMemory); #endif + return 0; } void @@ -1287,9 +1306,9 @@ main(int ArgC, char **Args) } // NOTE(matt): Init MemoryArena - char *MemoryArena; - int ArenaSize = Megabytes(4); - if(!(MemoryArena = calloc(ArenaSize, 1))) + buffer MemoryArena; + MemoryArena.Size = Megabytes(4); + if(!(MemoryArena.Location = calloc(MemoryArena.Size, 1))) { perror(Args[0]); return 1; @@ -1354,17 +1373,17 @@ main(int ArgC, char **Args) if(!(InFile = fopen(Args[FileIndex], "r"))) { perror(Args[FileIndex]); - free(MemoryArena); + free(MemoryArena.Location); return 1; } + HMML_Output HMML = hmml_parse_file(InFile); + fclose(InFile); + #if CONFIG ClaimBuffer(MemoryArena, &ClaimedMemory, &Config, "Config", Kilobytes(1)); #endif - HMML_Output HMML = hmml_parse_file(InFile); - fclose(InFile); - if(HMML.well_formed) { #if DEBUG @@ -1390,25 +1409,25 @@ main(int ArgC, char **Args) // Script // FilterState - ClaimBuffer(MemoryArena, &ClaimedMemory, &Master, "Master", Kilobytes(512)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Includes, "Includes", Kilobytes(1)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Master, "Master", Kilobytes(512)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Includes, "Includes", Kilobytes(1)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Menus, "Menus", Kilobytes(24)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &QuoteMenu, "QuoteMenu", Kilobytes(16)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &ReferenceMenu, "ReferenceMenu", Kilobytes(16)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &FilterMenu, "FilterMenu", Kilobytes(16)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &FilterTopics, "FilterTopics", Kilobytes(8)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &FilterMedia, "FilterMedia", Kilobytes(8)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &CreditsMenu, "CreditsMenu", Kilobytes(8)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &HostInfo, "HostInfo", Kilobytes(1)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotatorInfo, "AnnotatorInfo", Kilobytes(1)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Menus, "Menus", Kilobytes(24)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &QuoteMenu, "QuoteMenu", Kilobytes(16)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &ReferenceMenu, "ReferenceMenu", Kilobytes(16)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &FilterMenu, "FilterMenu", Kilobytes(16)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &FilterTopics, "FilterTopics", Kilobytes(8)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &FilterMedia, "FilterMedia", Kilobytes(8)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &CreditsMenu, "CreditsMenu", Kilobytes(8)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &HostInfo, "HostInfo", Kilobytes(1)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotatorInfo, "AnnotatorInfo", Kilobytes(1)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Player, "Player", Kilobytes(256)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Colour, "Colour", 32); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Annotation, "Annotation", Kilobytes(8)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Player, "Player", Kilobytes(256)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Colour, "Colour", 32); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Annotation, "Annotation", Kilobytes(8)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Script, "Script", Kilobytes(8)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &FilterState, "FilterState", Kilobytes(4)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Script, "Script", Kilobytes(8)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &FilterState, "FilterState", Kilobytes(4)); ref_info ReferencesArray[200] = { 0 }; category_info TopicsArray[56] = { 0 }; @@ -1446,7 +1465,7 @@ main(int ArgC, char **Args) { fprintf(stderr, "%s: Missing annotator in [video] node\n", Args[FileIndex]); hmml_free(&HMML); - free(MemoryArena); + free(MemoryArena.Location); return 1; } @@ -1474,11 +1493,11 @@ main(int ArgC, char **Args) // Text // Category - ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationHeader, "AnnotationHeader", 512); - ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationClass, "AnnotationClass", 256); - ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationData, "AnnotationData", 256); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Text, "Text", Kilobytes(4)); - ClaimBuffer(MemoryArena, &ClaimedMemory, &Category, "Category", 512); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationHeader, "AnnotationHeader", 512); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationClass, "AnnotationClass", 256); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationData, "AnnotationData", 256); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Text, "Text", Kilobytes(4)); + ClaimBuffer(&MemoryArena, &ClaimedMemory, &Category, "Category", 512); CopyStringToBuffer(&AnnotationHeader, "