diff --git a/hmmlconv/hmmlconv.c b/hmmlconv/hmmlconv.c index 47fb0a8..722087d 100644 --- a/hmmlconv/hmmlconv.c +++ b/hmmlconv/hmmlconv.c @@ -12,6 +12,8 @@ exit #include // open, mkdir #include // open, mkdir +#define LError(Format, ...) do { fprintf(stderr, " l.%d: " Format, LineNumber, ##__VA_ARGS__); } while(0) + typedef struct { char *Site; @@ -114,6 +116,11 @@ char *InPlaceUnescape(char *In) *Out++ = *In++; } + if(*In != '"') + { + return NULL; + } + *Out = 0; return Result; } @@ -142,6 +149,13 @@ Resource *LookupResource(char *Tag, char *Line) return Res; } +enum +{ + TC_NAN = 1, + TC_COLONS = 2, + TC_OUT_OF_RANGE = 3 +}; + int ValidateTimecode(char *Timecode) { @@ -149,12 +163,12 @@ ValidateTimecode(char *Timecode) int Colons = 0; while(*Timecode) { - if(!(*Timecode >= '0' && *Timecode <= '9') && *Timecode != ':') { return 1; } + if(!(*Timecode >= '0' && *Timecode <= '9') && *Timecode != ':') { return TC_NAN; } if(*Timecode == ':') { ++Colons; - if(Colons > 2) { return 2; } + if(Colons > 2) { return TC_COLONS; } for(int i = 0; i < Colons; ++i) { HMS[Colons - i] = HMS[Colons - (i + 1)]; @@ -169,7 +183,7 @@ ValidateTimecode(char *Timecode) ++Timecode; } - if(HMS[0] > 59 || HMS[1] > 59 || Timecode[-1] == ':') { return 3; } + if(HMS[0] > 59 || HMS[1] > 59 || Timecode[-1] == ':') { return TC_OUT_OF_RANGE; } return 0; } @@ -177,7 +191,7 @@ ValidateTimecode(char *Timecode) void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile) { SkipWhitespace(&Line); - if(*Line != '"') { fprintf(stderr, " l.%d: Syntax error, line must begin with a \": %.*s...\n", LineNumber, 8, Line); exit(1); } + if(*Line != '"') { LError("Syntax error, line must begin with a \": %.*s...\n", 8, Line); exit(1); } fputc('[', OutFile); char Timecode[9]; @@ -191,29 +205,29 @@ void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile) 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); + case TC_NAN: LError("Invalid timecode, not a number: %s\n", Timecode); exit(1); + case TC_COLONS: LError("Invalid timecode, too many colons: %s\n", Timecode); exit(1); + case TC_OUT_OF_RANGE: LError("Invalid timecode, not 0-59: %s\n", Timecode); exit(1); } fputs(Timecode, OutFile); fputc(']', OutFile); - if(*++Line != ':') { fprintf(stderr, " l.%d: Syntax error, missing : before: %.*s...\n", LineNumber, 8, Line); exit(1); } - if(*++Line != ' ') { fprintf(stderr, " l.%d: Syntax error, missing space before: %.*s...\n", LineNumber, 8, Line); exit(1); } - if(*++Line != '"') { fprintf(stderr, " l.%d: Syntax error, missing \" before: %.*s...\n", LineNumber, 8, Line); exit(1); } + if(*++Line != ':') { LError("Syntax error, missing : before: %.*s...\n", 8, Line); exit(1); } + if(*++Line != ' ') { LError("Syntax error, missing space before: %.*s...\n", 8, Line); exit(1); } + if(*++Line != '"') { LError("Syntax error, missing \" before: %.*s...\n", 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); + if(!(Line = InPlaceUnescape(Line))) + { + LError("Syntax error, missing closing \": %.*s\n", Line-LinePtr, LinePtr); exit(1); + } // convert author if(Line[0] == '@') { char *P = strchr(Line, ' '); - if(!P) { fprintf(stderr, " l.%d: Invalid annotation, cannot contain only a member: %.*s...\n", LineNumber, 8, Line); exit(1); } + if(!P) { LError("Invalid annotation, cannot contain only a member: %.*s...\n", 8, Line); exit(1); } if(P[-1] == ':') { @@ -227,7 +241,7 @@ void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile) char RefBuf[256]; char *RunStart = Line; char *FirstSpace = NULL; - int ConsiderQuote = 0; + int ConsiderAuthored = 0; fputc('[', OutFile); @@ -260,7 +274,7 @@ void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile) } else { - fprintf(stderr, " l.%d: WARNING: can't find resource: %s :(\n", LineNumber, RefBuf); + LError("WARNING: can't find resource: %s :(\n", RefBuf); } } @@ -279,16 +293,16 @@ void ProcessAnnotation(char *Line, int LineNumber, FILE *OutFile) if(!FirstSpace) { FirstSpace = LinePtr; - ConsiderQuote = 1; + ConsiderAuthored = 1; } else { - ConsiderQuote = 0; + ConsiderAuthored = 0; } } // Q: - else if(LinePtr[0] == 'Q' && LinePtr[1] == ':' && ConsiderQuote) + else if(LinePtr[0] == 'Q' && LinePtr[1] == ':' && ConsiderAuthored) { LinePtr += 2; RunStart = LinePtr+1;