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.
142 lines
2.8 KiB
C
142 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h>
|
|
#include "cpp.h"
|
|
|
|
extern int lcc_getopt(int, char *const *, const char *);
|
|
extern char *optarg, rcsid[];
|
|
extern int optind;
|
|
int verbose;
|
|
int Mflag; /* only print active include files */
|
|
char *objname; /* "src.$O: " */
|
|
int Cplusplus = 1;
|
|
|
|
void
|
|
setup(int argc, char **argv)
|
|
{
|
|
int c, fd, i;
|
|
char *fp, *dp;
|
|
Tokenrow tr;
|
|
extern void setup_kwtab(void);
|
|
uchar *includeDirs[ NINCLUDE ] = { 0 };
|
|
int numIncludeDirs = 0;
|
|
|
|
setup_kwtab();
|
|
while ((c = lcc_getopt(argc, argv, "MNOVv+I:D:U:F:lg")) != -1)
|
|
switch (c) {
|
|
case 'N':
|
|
for (i=0; i<NINCLUDE; i++)
|
|
if (includelist[i].always==1)
|
|
includelist[i].deleted = 1;
|
|
break;
|
|
case 'I':
|
|
includeDirs[ numIncludeDirs++ ] = newstring( (uchar *)optarg, strlen( optarg ), 0 );
|
|
break;
|
|
case 'D':
|
|
case 'U':
|
|
setsource("<cmdarg>", -1, optarg);
|
|
maketokenrow(3, &tr);
|
|
gettokens(&tr, 1);
|
|
doadefine(&tr, c);
|
|
unsetsource();
|
|
break;
|
|
case 'M':
|
|
Mflag++;
|
|
break;
|
|
case 'v':
|
|
fprintf(stderr, "%s %s\n", argv[0], rcsid);
|
|
break;
|
|
case 'V':
|
|
verbose++;
|
|
break;
|
|
case '+':
|
|
Cplusplus++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
dp = ".";
|
|
fp = "<stdin>";
|
|
fd = 0;
|
|
if (optind<argc) {
|
|
dp = basepath( argv[optind] );
|
|
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;
|
|
#ifdef WIN32
|
|
fdo = creat(argv[optind+1], _S_IREAD | _S_IWRITE);
|
|
#else
|
|
fdo = creat(argv[optind+1], 0666);
|
|
#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)
|
|
setobjname(fp);
|
|
includelist[NINCLUDE-1].always = 0;
|
|
includelist[NINCLUDE-1].file = dp;
|
|
|
|
for( i = 0; i < numIncludeDirs; i++ )
|
|
appendDirToIncludeList( (char *)includeDirs[ i ] );
|
|
|
|
setsource(fp, fd, NULL);
|
|
}
|
|
|
|
|
|
char *basepath( char *fname )
|
|
{
|
|
char *dp = ".";
|
|
char *p;
|
|
if ((p = strrchr(fname, '/')) != NULL) {
|
|
int dlen = p - fname;
|
|
dp = (char*)newstring((uchar*)fname, dlen+1, 0);
|
|
dp[dlen] = '\0';
|
|
}
|
|
|
|
return dp;
|
|
}
|
|
|
|
/* memmove is defined here because some vendors don't provide it at
|
|
all and others do a terrible job (like calling malloc) */
|
|
// -- ouch, that hurts -- ln
|
|
/* always use the system memmove() on Mac OS X. --ryan. */
|
|
#if !defined(__APPLE__) && !defined(_MSC_VER)
|
|
#ifdef memmove
|
|
#undef memmove
|
|
#endif
|
|
void *
|
|
memmove(void *dp, const void *sp, size_t n)
|
|
{
|
|
unsigned char *cdp, *csp;
|
|
|
|
if (n<=0)
|
|
return dp;
|
|
cdp = dp;
|
|
csp = (unsigned char *)sp;
|
|
if (cdp < csp) {
|
|
do {
|
|
*cdp++ = *csp++;
|
|
} while (--n);
|
|
} else {
|
|
cdp += n;
|
|
csp += n;
|
|
do {
|
|
*--cdp = *--csp;
|
|
} while (--n);
|
|
}
|
|
return dp;
|
|
}
|
|
#endif
|