Fix building QVMs on Linux with Windows line endings

On non-Windows, compiling QVM tools failed if dagcheck.md had CRLF line
endings and compiling QVMs failed if game source had CRLF line endings.

Also made Windows open the files as binary (no automatic CRLF to LF) so
it behaves the same as on non-Windows.
This commit is contained in:
Zack Middleton 2023-12-26 07:24:06 -06:00
parent b07ff2a3ca
commit 5ede35d8dd
5 changed files with 72 additions and 2 deletions

View File

@ -511,6 +511,25 @@ foldline(Source *s)
return 0; return 0;
} }
// This doesn't have proper tracking across read() to only remove \r from \r\n sequence.
// The lexer doesn't correctly handle standalone \r anyway though.
int
crlf_to_lf(unsigned char *buf, int n) {
int i, count;
count = 0;
for (i = 0; i < n; i++) {
if (buf[i] == '\r') {
continue;
}
buf[count++] = buf[i];
}
return count;
}
int int
fillbuf(Source *s) fillbuf(Source *s)
{ {
@ -521,6 +540,7 @@ fillbuf(Source *s)
error(FATAL, "Input buffer overflow"); error(FATAL, "Input buffer overflow");
if (s->fd<0 || (n=read(s->fd, (char *)s->inl, INS/8)) <= 0) if (s->fd<0 || (n=read(s->fd, (char *)s->inl, INS/8)) <= 0)
n = 0; n = 0;
n = crlf_to_lf(s->inl, n);
if ((*s->inp&0xff) == EOB) /* sentinel character appears in input */ if ((*s->inp&0xff) == EOB) /* sentinel character appears in input */
*s->inp = EOFC; *s->inp = EOFC;
s->inl += n; s->inl += n;

View File

@ -65,6 +65,9 @@ setup(int argc, char **argv)
fp = (char*)newstring((uchar*)argv[optind], strlen(argv[optind]), 0); fp = (char*)newstring((uchar*)argv[optind], strlen(argv[optind]), 0);
if ((fd = open(fp, 0)) <= 0) if ((fd = open(fp, 0)) <= 0)
error(FATAL, "Can't open input file %s", fp); error(FATAL, "Can't open input file %s", fp);
#ifdef WIN32
_setmode(fd, _O_BINARY);
#endif
} }
if (optind+1<argc) { if (optind+1<argc) {
int fdo; int fdo;
@ -75,6 +78,9 @@ setup(int argc, char **argv)
#endif #endif
if (fdo<0) if (fdo<0)
error(FATAL, "Can't open output file %s", argv[optind+1]); error(FATAL, "Can't open output file %s", argv[optind+1]);
#ifdef WIN32
_setmode(fdo, _O_BINARY);
#endif
dup2(fdo, 1); dup2(fdo, 1);
} }
if(Mflag) if(Mflag)

View File

@ -1553,12 +1553,32 @@ static char buf[BUFSIZ], *bp = buf;
static int ppercent = 0; static int ppercent = 0;
static int code = 0; static int code = 0;
static void crlf_to_lf(char *buf, int bufmax) {
int i, count;
count = 0;
for (i = 0; i < bufmax; i++) {
if (buf[i] == '\r' && buf[i+1] == '\n') {
// skip '\r'
continue;
}
buf[count++] = buf[i];
if (buf[i] == '\0') {
break;
}
}
}
static int get(void) { static int get(void) {
if (*bp == 0) { if (*bp == 0) {
bp = buf; bp = buf;
*bp = 0; *bp = 0;
if (fgets(buf, sizeof buf, infp) == NULL) if (fgets(buf, sizeof buf, infp) == NULL)
return EOF; return EOF;
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
while (buf[0] == '%' && buf[1] == '{' && buf[2] == '\n') { while (buf[0] == '%' && buf[1] == '{' && buf[2] == '\n') {
for (;;) { for (;;) {
@ -1566,6 +1586,7 @@ static int get(void) {
yywarn("unterminated %{...%}\n"); yywarn("unterminated %{...%}\n");
return EOF; return EOF;
} }
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
if (strcmp(buf, "%}\n") == 0) if (strcmp(buf, "%}\n") == 0)
break; break;
@ -1573,6 +1594,7 @@ static int get(void) {
} }
if (fgets(buf, sizeof buf, infp) == NULL) if (fgets(buf, sizeof buf, infp) == NULL)
return EOF; return EOF;
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
} }
} }

View File

@ -70,12 +70,32 @@ static char buf[BUFSIZ], *bp = buf;
static int ppercent = 0; static int ppercent = 0;
static int code = 0; static int code = 0;
static void crlf_to_lf(char *buf, int bufmax) {
int i, count;
count = 0;
for (i = 0; i < bufmax; i++) {
if (buf[i] == '\r' && buf[i+1] == '\n') {
// skip '\r'
continue;
}
buf[count++] = buf[i];
if (buf[i] == '\0') {
break;
}
}
}
static int get(void) { static int get(void) {
if (*bp == 0) { if (*bp == 0) {
bp = buf; bp = buf;
*bp = 0; *bp = 0;
if (fgets(buf, sizeof buf, infp) == NULL) if (fgets(buf, sizeof buf, infp) == NULL)
return EOF; return EOF;
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
while (buf[0] == '%' && buf[1] == '{' && buf[2] == '\n') { while (buf[0] == '%' && buf[1] == '{' && buf[2] == '\n') {
for (;;) { for (;;) {
@ -83,6 +103,7 @@ static int get(void) {
yywarn("unterminated %{...%}\n"); yywarn("unterminated %{...%}\n");
return EOF; return EOF;
} }
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
if (strcmp(buf, "%}\n") == 0) if (strcmp(buf, "%}\n") == 0)
break; break;
@ -90,6 +111,7 @@ static int get(void) {
} }
if (fgets(buf, sizeof buf, infp) == NULL) if (fgets(buf, sizeof buf, infp) == NULL)
return EOF; return EOF;
crlf_to_lf(buf, sizeof buf);
yylineno++; yylineno++;
} }
} }

View File

@ -56,14 +56,14 @@ int main(int argc, char *argv[]) {
} else if (infp == NULL) { } else if (infp == NULL) {
if (strcmp(argv[i], "-") == 0) if (strcmp(argv[i], "-") == 0)
infp = stdin; infp = stdin;
else if ((infp = fopen(argv[i], "r")) == NULL) { else if ((infp = fopen(argv[i], "rb")) == NULL) {
yyerror("%s: can't read `%s'\n", argv[0], argv[i]); yyerror("%s: can't read `%s'\n", argv[0], argv[i]);
exit(1); exit(1);
} }
} else if (outfp == NULL) { } else if (outfp == NULL) {
if (strcmp(argv[i], "-") == 0) if (strcmp(argv[i], "-") == 0)
outfp = stdout; outfp = stdout;
if ((outfp = fopen(argv[i], "w")) == NULL) { if ((outfp = fopen(argv[i], "wb")) == NULL) {
yyerror("%s: can't write `%s'\n", argv[0], argv[i]); yyerror("%s: can't write `%s'\n", argv[0], argv[i]);
exit(1); exit(1);
} }