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:
1 parent
b07ff2a3ca
commit
5ede35d8dd
5 files changed
+72
-2
No files matched your search
@@ -511,6 +511,25 @@ foldline(Source *s)
|
||||
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
|
||||
fillbuf(Source *s)
|
||||
{
|
||||
@@ -521,6 +540,7 @@ fillbuf(Source *s)
|
||||
error(FATAL, "Input buffer overflow");
|
||||
if (s->fd<0 || (n=read(s->fd, (char *)s->inl, INS/8)) <= 0)
|
||||
n = 0;
|
||||
n = crlf_to_lf(s->inl, n);
|
||||
if ((*s->inp&0xff) == EOB) /* sentinel character appears in input */
|
||||
*s->inp = EOFC;
|
||||
s->inl += n;
|
||||
|
||||
@@ -65,6 +65,9 @@ setup(int argc, char **argv)
|
||||
fp = (char*)newstring((uchar*)argv[optind], strlen(argv[optind]), 0);
|
||||
if ((fd = open(fp, 0)) <= 0)
|
||||
error(FATAL, "Can't open input file %s", fp);
|
||||
#ifdef WIN32
|
||||
_setmode(fd, _O_BINARY);
|
||||
#endif
|
||||
}
|
||||
if (optind+1<argc) {
|
||||
int fdo;
|
||||
@@ -75,6 +78,9 @@ setup(int argc, char **argv)
|
||||
#endif
|
||||
if (fdo<0)
|
||||
error(FATAL, "Can't open output file %s", argv[optind+1]);
|
||||
#ifdef WIN32
|
||||
_setmode(fdo, _O_BINARY);
|
||||
#endif
|
||||
dup2(fdo, 1);
|
||||
}
|
||||
if(Mflag)
|
||||
|
||||
Reference in new issue
Block a user