hmmlconv.c: Add syntax error output
This commit is contained in:
parent
9d835b4ea3
commit
39f9e30117
|
@ -11,7 +11,6 @@ exit
|
||||||
#include <fcntl.h> // open
|
#include <fcntl.h> // open
|
||||||
#include <sys/types.h> // open, mkdir
|
#include <sys/types.h> // open, mkdir
|
||||||
#include <sys/stat.h> // open, mkdir
|
#include <sys/stat.h> // open, mkdir
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -143,21 +142,70 @@ Resource *LookupResource(char *Tag, char *Line)
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessAnnotation(char *Line, FILE *OutFile)
|
int
|
||||||
|
ValidateTimecode(char *Timecode)
|
||||||
|
{
|
||||||
|
int HMS[3] = { 0, 0, 0 }; // 0 == Seconds; 1 == Minutes; 2 == Hours
|
||||||
|
int Colons = 0;
|
||||||
|
while(*Timecode)
|
||||||
|
{
|
||||||
|
if(!(*Timecode >= '0' && *Timecode <= '9') && *Timecode != ':') { return 1; }
|
||||||
|
|
||||||
|
if(*Timecode == ':')
|
||||||
|
{
|
||||||
|
++Colons;
|
||||||
|
if(Colons > 2) { return 2; }
|
||||||
|
for(int i = 0; i < Colons; ++i)
|
||||||
|
{
|
||||||
|
HMS[Colons - i] = HMS[Colons - (i + 1)];
|
||||||
|
}
|
||||||
|
HMS[0] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HMS[0] = HMS[0] * 10 + *Timecode - '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
++Timecode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(HMS[0] > 59 || HMS[1] > 59 || Timecode[-1] == ':') { return 3; }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile)
|
||||||
{
|
{
|
||||||
SkipWhitespace(&Line);
|
SkipWhitespace(&Line);
|
||||||
assert(*Line == '"');
|
if(*Line != '"') { fprintf(stderr, " l.%d: Syntax error, line must begin with a \": %.*s...\n", LineNumber, 8, Line); exit(1); }
|
||||||
|
|
||||||
fputc('[', OutFile);
|
fputc('[', OutFile);
|
||||||
while(*++Line != '"')
|
char Timecode[9];
|
||||||
|
char *Ptr = Timecode;
|
||||||
|
while(*++Line != '"' && *Line != '\n')
|
||||||
{
|
{
|
||||||
fputc(*Line, OutFile);
|
*Ptr++ = *Line;
|
||||||
}
|
}
|
||||||
|
*Ptr = '\0';
|
||||||
|
|
||||||
|
switch(ValidateTimecode(Timecode))
|
||||||
|
{
|
||||||
|
case 0: break;
|
||||||
|
case 1: fprintf(stderr, " l.%d: Invalid timecode, not a number: %s\n", LineNumber, Timecode); exit(1);
|
||||||
|
case 2: fprintf(stderr, " l.%d: Invalid timecode, too many colons: %s\n", LineNumber, Timecode); exit(1);
|
||||||
|
case 3: fprintf(stderr, " l.%d: Invalid timecode, not 0-59: %s\n", LineNumber, Timecode); exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fputs(Timecode, OutFile);
|
||||||
fputc(']', OutFile);
|
fputc(']', OutFile);
|
||||||
|
|
||||||
assert(*++Line == ':');
|
if(*++Line != ':') { fprintf(stderr, " l.%d: Syntax error, missing : before: %.*s...\n", LineNumber, 8, Line); exit(1); }
|
||||||
assert(*++Line == ' ');
|
if(*++Line != ' ') { fprintf(stderr, " l.%d: Syntax error, missing space before: %.*s...\n", LineNumber, 8, Line); exit(1); }
|
||||||
assert(*++Line == '"');
|
if(*++Line != '"') { fprintf(stderr, " l.%d: Syntax error, missing \" before: %.*s...\n", LineNumber, 8, Line); exit(1); }
|
||||||
|
|
||||||
|
char *LinePtr = Line;
|
||||||
|
while(*LinePtr) { ++LinePtr; }
|
||||||
|
if(LinePtr[-1] != '"') { fprintf(stderr, " l.%d: Syntax error, missing closing \": %.*s\n", LineNumber, LinePtr-Line, Line); exit(1); }
|
||||||
|
|
||||||
Line = InPlaceUnescape(Line);
|
Line = InPlaceUnescape(Line);
|
||||||
|
|
||||||
|
@ -165,7 +213,7 @@ void ProcessAnnotation(char *Line, FILE *OutFile)
|
||||||
if(Line[0] == '@')
|
if(Line[0] == '@')
|
||||||
{
|
{
|
||||||
char *P = strchr(Line, ' ');
|
char *P = strchr(Line, ' ');
|
||||||
assert(P);
|
if(!P) { fprintf(stderr, " l.%d: Invalid annotation, cannot contain only a member: %.*s...\n", LineNumber, 8, Line); exit(1); }
|
||||||
|
|
||||||
if(P[-1] == ':')
|
if(P[-1] == ':')
|
||||||
{
|
{
|
||||||
|
@ -177,7 +225,6 @@ void ProcessAnnotation(char *Line, FILE *OutFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
char RefBuf[256];
|
char RefBuf[256];
|
||||||
char *LinePtr;
|
|
||||||
char *RunStart = Line;
|
char *RunStart = Line;
|
||||||
char *FirstSpace = NULL;
|
char *FirstSpace = NULL;
|
||||||
int ConsiderQuote = 0;
|
int ConsiderQuote = 0;
|
||||||
|
@ -192,6 +239,8 @@ void ProcessAnnotation(char *Line, FILE *OutFile)
|
||||||
int TmpQuoteID;
|
int TmpQuoteID;
|
||||||
|
|
||||||
// convert Resource -> ref
|
// convert Resource -> ref
|
||||||
|
// TODO(matt): Gather the whole Resources section, and prompt if we match more than one resource
|
||||||
|
// TODO(matt): (Maybe) Lookup individual words from the [see Resources] thing
|
||||||
if(LinePtr[0] == ' ' && LinePtr[1] == '[' && sscanf(LinePtr+1, "[see Resources, %255[^]]]%n", RefBuf, &ScanBytes) == 1 && ScanBytes)
|
if(LinePtr[0] == ' ' && LinePtr[1] == '[' && sscanf(LinePtr+1, "[see Resources, %255[^]]]%n", RefBuf, &ScanBytes) == 1 && ScanBytes)
|
||||||
{
|
{
|
||||||
//printf("Find Resource [%s]\n", RefBuf);
|
//printf("Find Resource [%s]\n", RefBuf);
|
||||||
|
@ -211,7 +260,7 @@ void ProcessAnnotation(char *Line, FILE *OutFile)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "WARNING: can't find resource [%s] :(\n", RefBuf);
|
fprintf(stderr, " l.%d: WARNING: can't find resource: %s :(\n", LineNumber, RefBuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +323,10 @@ int ProcessFile(char *InFileName, FILE *InFile, FILE *OutFile)
|
||||||
char *Contents = ReadWholeFile(InFile);
|
char *Contents = ReadWholeFile(InFile);
|
||||||
char *Ptr;
|
char *Ptr;
|
||||||
|
|
||||||
printf("Processing [%s]...\n", InFileName);
|
if(!(getenv("HERO")))
|
||||||
|
{
|
||||||
|
printf("Processing [%s]...\n", InFileName);
|
||||||
|
}
|
||||||
|
|
||||||
// Resources
|
// Resources
|
||||||
ResCount = 0;
|
ResCount = 0;
|
||||||
|
@ -348,7 +400,10 @@ int ProcessFile(char *InFileName, FILE *InFile, FILE *OutFile)
|
||||||
LinePtr = Separator + 1;
|
LinePtr = Separator + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Add Res: %s\n", Resources[ResCount].Site);
|
if(!(getenv("HERO")))
|
||||||
|
{
|
||||||
|
printf("Add Res: %s\n", Resources[ResCount].Site);
|
||||||
|
}
|
||||||
|
|
||||||
++ResCount;
|
++ResCount;
|
||||||
}
|
}
|
||||||
|
@ -362,7 +417,7 @@ int ProcessFile(char *InFileName, FILE *InFile, FILE *OutFile)
|
||||||
STATE_MARKERS,
|
STATE_MARKERS,
|
||||||
} State = STATE_METADATA;
|
} State = STATE_METADATA;
|
||||||
|
|
||||||
int LineNumber = 0;
|
int LineNumber = 1;
|
||||||
char *LineState;
|
char *LineState;
|
||||||
char *LinePtr = strtok_r(Contents, "\r\n", &LineState);
|
char *LinePtr = strtok_r(Contents, "\r\n", &LineState);
|
||||||
|
|
||||||
|
@ -390,7 +445,7 @@ int ProcessFile(char *InFileName, FILE *InFile, FILE *OutFile)
|
||||||
if(strncmp(LinePtr, "---", 3) == 0){
|
if(strncmp(LinePtr, "---", 3) == 0){
|
||||||
goto Done;
|
goto Done;
|
||||||
} else {
|
} else {
|
||||||
ProcessAnnotation(LinePtr, OutFile);
|
ProcessAnnotation(LinePtr, LineNumber, OutFile);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
@ -438,6 +493,10 @@ int main(int ArgC, char **Args)
|
||||||
|
|
||||||
int Errors = 0;
|
int Errors = 0;
|
||||||
int AlwaysOverwrite = 0;
|
int AlwaysOverwrite = 0;
|
||||||
|
if(getenv("HERO"))
|
||||||
|
{
|
||||||
|
AlwaysOverwrite = 1;
|
||||||
|
}
|
||||||
|
|
||||||
for(int i = 1; i < ArgC-1; ++i)
|
for(int i = 1; i < ArgC-1; ++i)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue