mirror of
https://github.com/ioquake/ioq3.git
synced 2024-11-10 07:11:46 +00:00
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:
parent
b07ff2a3ca
commit
5ede35d8dd
5 changed files with 72 additions and 2 deletions
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue