hmml_to_html.c: Pull from insobot's quote store
#25 Also fix the forced integration
This commit is contained in:
		
							parent
							
								
									ad8fb22211
								
							
						
					
					
						commit
						5f21a9544d
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
#if 0
 | 
					#if 0
 | 
				
			||||||
ctime -begin ${0%.*}.ctm
 | 
					ctime -begin ${0%.*}.ctm
 | 
				
			||||||
gcc -g -no-pie -fsanitize=address -Wall -std=c99 -pipe $0 -o ${0%.*} hmml.a
 | 
					gcc -g -no-pie -fsanitize=address -Wall -std=c99 -pipe $0 -o ${0%.*} hmml.a -lcurl
 | 
				
			||||||
ctime -end ${0%.*}.ctm
 | 
					ctime -end ${0%.*}.ctm
 | 
				
			||||||
exit
 | 
					exit
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ typedef unsigned int bool;
 | 
				
			||||||
#include "hmmlib.h"
 | 
					#include "hmmlib.h"
 | 
				
			||||||
#include <getopt.h> // NOTE(matt): getopts
 | 
					#include <getopt.h> // NOTE(matt): getopts
 | 
				
			||||||
//#include "config.h" // TODO(matt): Implement config.h
 | 
					//#include "config.h" // TODO(matt): Implement config.h
 | 
				
			||||||
 | 
					#include <curl/curl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Kilobytes(Bytes) Bytes << 10
 | 
					#define Kilobytes(Bytes) Bytes << 10
 | 
				
			||||||
#define Megabytes(Bytes) Bytes << 20
 | 
					#define Megabytes(Bytes) Bytes << 20
 | 
				
			||||||
| 
						 | 
					@ -809,78 +810,98 @@ StringToInt(char *String)
 | 
				
			||||||
    return Result;
 | 
					    return Result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					size_t
 | 
				
			||||||
BuildQuote(quote_info *Info, char *Speaker, int ID, char *QuoteDir)
 | 
					CurlIntoBuffer(char *InPtr, size_t CharLength, size_t Chars, char **OutputPtr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char Path[255] = {0};
 | 
					    int Length = CharLength * Chars;
 | 
				
			||||||
    sprintf(Path, "%s/#%s", QuoteDir, Speaker);
 | 
					    int i;
 | 
				
			||||||
    FILE *File;
 | 
					    for(i = 0; InPtr[i] && i < Length; ++i)
 | 
				
			||||||
    if(!(File = fopen(Path, "r")))
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        perror(Path);
 | 
					        *((*OutputPtr)++) = InPtr[i];
 | 
				
			||||||
        return 1;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    **OutputPtr = '\0';
 | 
				
			||||||
 | 
					    return Length;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fseek(File, 0, SEEK_END);
 | 
					#include <time.h>
 | 
				
			||||||
    int Length = ftell(File);
 | 
					
 | 
				
			||||||
    fseek(File, 0, SEEK_SET);
 | 
					int
 | 
				
			||||||
    char *Buffer;
 | 
					BuildQuote(quote_info *Info, char *Speaker, int ID)
 | 
				
			||||||
    if(!(Buffer = malloc(Length)))
 | 
					{
 | 
				
			||||||
 | 
					    char QuotesURL[256];
 | 
				
			||||||
 | 
					    CopyString(QuotesURL, "https://dev.abaines.me.uk/quotes/%s.raw", Speaker);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    buffer QuoteStaging;
 | 
				
			||||||
 | 
					    QuoteStaging.ID = "QuoteStaging";
 | 
				
			||||||
 | 
					    QuoteStaging.Size = Kilobytes(256);
 | 
				
			||||||
 | 
					    if(!(QuoteStaging.Location = malloc(QuoteStaging.Size)))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        perror("BuildQuote");
 | 
					        perror("malloc");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QuoteStaging.Ptr = QuoteStaging.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CURL *curl = curl_easy_init();
 | 
				
			||||||
 | 
					    if(curl) {
 | 
				
			||||||
 | 
					        CURLcode res;
 | 
				
			||||||
 | 
					        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &QuoteStaging.Ptr);
 | 
				
			||||||
 | 
					        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlIntoBuffer);
 | 
				
			||||||
 | 
					        curl_easy_setopt(curl, CURLOPT_URL, QuotesURL);
 | 
				
			||||||
 | 
					        if((res = curl_easy_perform(curl)))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            fprintf(stderr, "%s", curl_easy_strerror(res));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        curl_easy_cleanup(curl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    fread(Buffer, Length, 1, File);
 | 
					 | 
				
			||||||
    fclose(File);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO(matt): Search the quote store in reverse
 | 
					    // TODO(matt): Search the quote store in reverse
 | 
				
			||||||
    char *InPtr = Buffer;
 | 
					    QuoteStaging.Ptr = QuoteStaging.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(InPtr - Buffer < Length)
 | 
					    while(*QuoteStaging.Ptr)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        char InID[4] = { 0 };
 | 
					        char InID[4] = { 0 };
 | 
				
			||||||
 | 
					        char InTime[16] = { 0 };
 | 
				
			||||||
        char *OutPtr = InID;
 | 
					        char *OutPtr = InID;
 | 
				
			||||||
        while(*InPtr != ',')
 | 
					        while(*QuoteStaging.Ptr != ',')
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            *OutPtr++ = *InPtr++;
 | 
					            *OutPtr++ = *QuoteStaging.Ptr++;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        *OutPtr = '\0';
 | 
					        *OutPtr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(StringToInt(InID) == ID)
 | 
					        if(StringToInt(InID) == ID)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            InPtr += 2;
 | 
					            QuoteStaging.Ptr += 1;
 | 
				
			||||||
            OutPtr = Info->Date;
 | 
					            OutPtr = InTime;
 | 
				
			||||||
            while(*InPtr != '"')
 | 
					            while(*QuoteStaging.Ptr != ',')
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                *OutPtr++ = *InPtr++;
 | 
					                *OutPtr++ = *QuoteStaging.Ptr++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            *OutPtr = '\0';
 | 
					            *OutPtr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            InPtr += 3;
 | 
					            long int Time = StringToInt(InTime);
 | 
				
			||||||
 | 
					            strftime(Info->Date, 32, "%d %B, %Y", gmtime(&Time));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QuoteStaging.Ptr += 1;
 | 
				
			||||||
            OutPtr = Info->Text;
 | 
					            OutPtr = Info->Text;
 | 
				
			||||||
            while(*InPtr != '\n')
 | 
					            while(*QuoteStaging.Ptr != '\n')
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if(*InPtr == '\\')
 | 
					                *OutPtr++ = *QuoteStaging.Ptr++;
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    ++InPtr;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                *OutPtr++ = *InPtr++;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            *--OutPtr = '\0';
 | 
					            *--OutPtr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            free(Buffer);
 | 
					            FreeBuffer(&QuoteStaging);
 | 
				
			||||||
            return 0;
 | 
					            return 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            while(*InPtr != '\n')
 | 
					            while(*QuoteStaging.Ptr != '\n')
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                ++InPtr;
 | 
					                ++QuoteStaging.Ptr;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            ++InPtr;
 | 
					            ++QuoteStaging.Ptr;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    free(Buffer);
 | 
					    FreeBuffer(&QuoteStaging);
 | 
				
			||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1215,7 +1236,7 @@ ParseConfig(buffer *Buffer, char *Username)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, char *DefaultJSDir, char *DefaultDefaultMedium, char *DefaultOutLocation, char *DefaultQuoteDir, char *DefaultTemplateLocation)
 | 
					PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, char *DefaultJSDir, char *DefaultDefaultMedium, char *DefaultOutLocation, char *DefaultTemplateLocation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    fprintf(stderr, "Usage: %s [option(s)] filename(s)\n"
 | 
					    fprintf(stderr, "Usage: %s [option(s)] filename(s)\n"
 | 
				
			||||||
            "\n"
 | 
					            "\n"
 | 
				
			||||||
| 
						 | 
					@ -1232,8 +1253,6 @@ PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, ch
 | 
				
			||||||
            "        Override default default medium (\"%s\")\n"
 | 
					            "        Override default default medium (\"%s\")\n"
 | 
				
			||||||
            "    -o <output location>\n"
 | 
					            "    -o <output location>\n"
 | 
				
			||||||
            "        Override default output location (\"%s\")\n"
 | 
					            "        Override default output location (\"%s\")\n"
 | 
				
			||||||
            "    -q <quotes directory path>\n"
 | 
					 | 
				
			||||||
            "        Override default quotes directory (\"%s\")\n"
 | 
					 | 
				
			||||||
            "    -t <template location>\n"
 | 
					            "    -t <template location>\n"
 | 
				
			||||||
            "        Override default template location (\"%s\")\n"
 | 
					            "        Override default template location (\"%s\")\n"
 | 
				
			||||||
            "        and automatically enable integration\n"
 | 
					            "        and automatically enable integration\n"
 | 
				
			||||||
| 
						 | 
					@ -1254,7 +1273,7 @@ PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, ch
 | 
				
			||||||
            "       <!-- __CINERA_SCRIPT__ --> (must come after <!-- __CINERA_PLAYER__ -->)\n"
 | 
					            "       <!-- __CINERA_SCRIPT__ --> (must come after <!-- __CINERA_PLAYER__ -->)\n"
 | 
				
			||||||
            "   Other available tags include:\n"
 | 
					            "   Other available tags include:\n"
 | 
				
			||||||
            "       <!-- __CINERA_TITLE__ -->\n",
 | 
					            "       <!-- __CINERA_TITLE__ -->\n",
 | 
				
			||||||
            BinaryLocation, DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultQuoteDir, DefaultOutLocation, DefaultTemplateLocation);
 | 
					            BinaryLocation, DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultOutLocation, DefaultTemplateLocation);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
| 
						 | 
					@ -1284,9 +1303,6 @@ main(int ArgC, char **Args)
 | 
				
			||||||
    char *DefaultOutIntegratedLocation = "out_integrated.html";
 | 
					    char *DefaultOutIntegratedLocation = "out_integrated.html";
 | 
				
			||||||
    char *OutIntegratedLocation = DefaultOutIntegratedLocation;
 | 
					    char *OutIntegratedLocation = DefaultOutIntegratedLocation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char *DefaultQuoteDir = "/home/matt/git/GitHub/insofaras/25fc16d58a297a486334";
 | 
					 | 
				
			||||||
    char *QuoteDir = DefaultQuoteDir;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char *CINERA_MODE = getenv("CINERA_MODE");
 | 
					    char *CINERA_MODE = getenv("CINERA_MODE");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool DefaultForceIntegration = FALSE;
 | 
					    bool DefaultForceIntegration = FALSE;
 | 
				
			||||||
| 
						 | 
					@ -1294,7 +1310,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(ArgC < 2)
 | 
					    if(ArgC < 2)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultQuoteDir, DefaultOutLocation, DefaultTemplateLocation);
 | 
					        PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultOutLocation, DefaultTemplateLocation);
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1322,8 +1338,6 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                OutLocation = optarg;
 | 
					                OutLocation = optarg;
 | 
				
			||||||
                OutIntegratedLocation = optarg;
 | 
					                OutIntegratedLocation = optarg;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'q':
 | 
					 | 
				
			||||||
                QuoteDir = optarg;
 | 
					 | 
				
			||||||
            case 't':
 | 
					            case 't':
 | 
				
			||||||
                TemplateLocation = optarg;
 | 
					                TemplateLocation = optarg;
 | 
				
			||||||
                CINERA_MODE="INTEGRATE";
 | 
					                CINERA_MODE="INTEGRATE";
 | 
				
			||||||
| 
						 | 
					@ -1332,7 +1346,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
            // Override config path, once we even have a default!
 | 
					            // Override config path, once we even have a default!
 | 
				
			||||||
            case 'h':
 | 
					            case 'h':
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultQuoteDir, DefaultOutLocation, DefaultTemplateLocation);
 | 
					                PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultOutLocation, DefaultTemplateLocation);
 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1340,7 +1354,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
    if(optind == ArgC)
 | 
					    if(optind == ArgC)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        fprintf(stderr, "%s: requires at least one input .hmml file\n", Args[0]);
 | 
					        fprintf(stderr, "%s: requires at least one input .hmml file\n", Args[0]);
 | 
				
			||||||
        PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultQuoteDir, DefaultOutLocation, DefaultTemplateLocation);
 | 
					        PrintUsage(Args[0], DefaultCSSDir, DefaultImagesDir, DefaultJSDir, DefaultDefaultMedium, DefaultOutLocation, DefaultTemplateLocation);
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1377,21 +1391,6 @@ main(int ArgC, char **Args)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        JSDir[StringLength(JSDir) - 1] = '\0';
 | 
					        JSDir[StringLength(JSDir) - 1] = '\0';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if(QuoteDir[StringLength(QuoteDir) - 1] == '/')
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        QuoteDir[StringLength(QuoteDir) - 1] = '\0';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 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;
 | 
					    buffer Template;
 | 
				
			||||||
    Template.ID = "Template";
 | 
					    Template.ID = "Template";
 | 
				
			||||||
| 
						 | 
					@ -1399,6 +1398,17 @@ main(int ArgC, char **Args)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if(CINERA_MODE && !StringsDiffer(CINERA_MODE, "INTEGRATE"))
 | 
					        if(CINERA_MODE && !StringsDiffer(CINERA_MODE, "INTEGRATE"))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            // 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            FILE *TemplateFile;
 | 
					            FILE *TemplateFile;
 | 
				
			||||||
            if(!(TemplateFile = fopen(TemplateLocation, "r")))
 | 
					            if(!(TemplateFile = fopen(TemplateLocation, "r")))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -1548,12 +1558,15 @@ main(int ArgC, char **Args)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if(!FoundIncludes){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_INCLUDES__ --> tag\n"); };
 | 
					                if(!ForceIntegration)
 | 
				
			||||||
                if(!FoundMenus){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_MENUS__ --> tag\n"); };
 | 
					                {
 | 
				
			||||||
                if(!FoundPlayer){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_PLAYER__ --> tag\n"); };
 | 
					                    if(!FoundIncludes){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_INCLUDES__ --> tag\n"); };
 | 
				
			||||||
                if(!FoundScript){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_SCRIPT__ --> tag\n"); };
 | 
					                    if(!FoundMenus){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_MENUS__ --> tag\n"); };
 | 
				
			||||||
                fprintf(stderr, "%s", Errors.Location);
 | 
					                    if(!FoundPlayer){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_PLAYER__ --> tag\n"); };
 | 
				
			||||||
                free(Template.Location); free(Errors.Location); return 1;
 | 
					                    if(!FoundScript){ CopyStringToBuffer(&Errors, "Template must include one <!-- __CINERA_SCRIPT__ --> tag\n"); };
 | 
				
			||||||
 | 
					                    fprintf(stderr, "%s", Errors.Location);
 | 
				
			||||||
 | 
					                    free(Template.Location); free(Errors.Location); return 1;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1564,6 +1577,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
    if(!(MemoryArena.Location = calloc(MemoryArena.Size, 1)))
 | 
					    if(!(MemoryArena.Location = calloc(MemoryArena.Size, 1)))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        perror(Args[0]);
 | 
					        perror(Args[0]);
 | 
				
			||||||
 | 
					        free(Template.Location);
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    int ClaimedMemory = 0;
 | 
					    int ClaimedMemory = 0;
 | 
				
			||||||
| 
						 | 
					@ -1627,6 +1641,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            perror(Args[FileIndex]);
 | 
					            perror(Args[FileIndex]);
 | 
				
			||||||
            free(MemoryArena.Location);
 | 
					            free(MemoryArena.Location);
 | 
				
			||||||
 | 
					            free(Template.Location);
 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1719,6 +1734,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                fprintf(stderr, "%s: Missing annotator in [video] node\n", Args[FileIndex]);
 | 
					                fprintf(stderr, "%s: Missing annotator in [video] node\n", Args[FileIndex]);
 | 
				
			||||||
                hmml_free(&HMML);
 | 
					                hmml_free(&HMML);
 | 
				
			||||||
                free(MemoryArena.Location);
 | 
					                free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                free(Template.Location);
 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1893,6 +1909,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                        "appear in the references menu\n", Args[FileIndex], Anno->line);
 | 
					                                        "appear in the references menu\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                hmml_free(&HMML);
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
                                free(MemoryArena.Location);
 | 
					                                free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                free(Template.Location);
 | 
				
			||||||
                                return 1;
 | 
					                                return 1;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            ++ReferencesArray[RefIdentifier - 1].IdentifierCount;
 | 
					                            ++ReferencesArray[RefIdentifier - 1].IdentifierCount;
 | 
				
			||||||
| 
						 | 
					@ -1909,6 +1926,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                    fprintf(stderr, "%s:%d: Too many timecodes associated with one reference (increase REF_MAX_IDENTIFIER)\n", Args[FileIndex], Anno->line);
 | 
					                                    fprintf(stderr, "%s:%d: Too many timecodes associated with one reference (increase REF_MAX_IDENTIFIER)\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                    hmml_free(&HMML);
 | 
					                                    hmml_free(&HMML);
 | 
				
			||||||
                                    free(MemoryArena.Location);
 | 
					                                    free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                    free(Template.Location);
 | 
				
			||||||
                                    return 1;
 | 
					                                    return 1;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                                if(CurrentRef->isbn)
 | 
					                                if(CurrentRef->isbn)
 | 
				
			||||||
| 
						 | 
					@ -1936,6 +1954,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                    fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
					                                    fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                    hmml_free(&HMML);
 | 
					                                    hmml_free(&HMML);
 | 
				
			||||||
                                    free(MemoryArena.Location);
 | 
					                                    free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                    free(Template.Location);
 | 
				
			||||||
                                    return 1;
 | 
					                                    return 1;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
| 
						 | 
					@ -1949,6 +1968,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                        "appear in the references menu\n", Args[FileIndex], Anno->line);
 | 
					                                        "appear in the references menu\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                hmml_free(&HMML);
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
                                free(MemoryArena.Location);
 | 
					                                free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                free(Template.Location);
 | 
				
			||||||
                                return 1;
 | 
					                                return 1;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            ++ReferencesArray[UniqueRefs].IdentifierCount;
 | 
					                            ++ReferencesArray[UniqueRefs].IdentifierCount;
 | 
				
			||||||
| 
						 | 
					@ -1970,6 +1990,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
					                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                hmml_free(&HMML);
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
                                free(MemoryArena.Location);
 | 
					                                free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                free(Template.Location);
 | 
				
			||||||
                                return 1;
 | 
					                                return 1;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1990,6 +2011,7 @@ main(int ArgC, char **Args)
 | 
				
			||||||
                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL", Args[FileIndex], Anno->line);
 | 
					                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL", Args[FileIndex], Anno->line);
 | 
				
			||||||
                                hmml_free(&HMML);
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
                                free(MemoryArena.Location);
 | 
					                                free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                                free(Template.Location);
 | 
				
			||||||
                                return 1;
 | 
					                                return 1;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
| 
						 | 
					@ -2062,15 +2084,16 @@ main(int ArgC, char **Args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    HasQuote = TRUE;
 | 
					                    HasQuote = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if(BuildQuote(&QuoteInfo, Anno->quote.author ? Anno->quote.author : HMML.metadata.stream_username ? HMML.metadata.stream_username : HMML.metadata.member, Anno->quote.id, QuoteDir) == 1)
 | 
					                    if(BuildQuote(&QuoteInfo, Anno->quote.author ? Anno->quote.author : HMML.metadata.stream_username ? HMML.metadata.stream_username : HMML.metadata.member, Anno->quote.id) == 1)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        fprintf(stderr, "%s:%d: Quote #%s %d not found! Consider pulling the latest quotes\n",
 | 
					                        fprintf(stderr, "%s:%d: Quote #%s %d not found. Unlucky!\n",
 | 
				
			||||||
                                Args[FileIndex],
 | 
					                                Args[FileIndex],
 | 
				
			||||||
                                Anno->line,
 | 
					                                Anno->line,
 | 
				
			||||||
                                Anno->quote.author ? Anno->quote.author : HMML.metadata.stream_username ? HMML.metadata.stream_username : HMML.metadata.member,
 | 
					                                Anno->quote.author ? Anno->quote.author : HMML.metadata.stream_username ? HMML.metadata.stream_username : HMML.metadata.member,
 | 
				
			||||||
                                Anno->quote.id);
 | 
					                                Anno->quote.id);
 | 
				
			||||||
                        hmml_free(&HMML);
 | 
					                        hmml_free(&HMML);
 | 
				
			||||||
                        free(MemoryArena.Location);
 | 
					                        free(MemoryArena.Location);
 | 
				
			||||||
 | 
					                        free(Template.Location);
 | 
				
			||||||
                        return 1;
 | 
					                        return 1;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue