diff options
Diffstat (limited to 'src/tools/lcc/etc/lcc.c')
-rw-r--r-- | src/tools/lcc/etc/lcc.c | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/src/tools/lcc/etc/lcc.c b/src/tools/lcc/etc/lcc.c index cac01b9..aa3e789 100644 --- a/src/tools/lcc/etc/lcc.c +++ b/src/tools/lcc/etc/lcc.c @@ -11,7 +11,12 @@ static char rcsid[] = "Id: dummy rcsid"; #include <assert.h> #include <ctype.h> #include <signal.h> +#ifdef WIN32 +#include <process.h> /* getpid() */ +#include <io.h> /* access() */ +#else #include <unistd.h> +#endif #ifndef TEMPDIR #define TEMPDIR "/tmp" @@ -217,14 +222,74 @@ char *basename(char *name) { #ifdef WIN32 #include <process.h> + +static char *escapeDoubleQuotes(const char *string) { + int stringLength = strlen(string); + int bufferSize = stringLength + 1; + int i, j; + char *newString; + + if (string == NULL) + return NULL; + + for (i = 0; i < stringLength; i++) { + if (string[i] == '"') + bufferSize++; + } + + newString = (char*)malloc(bufferSize); + + if (newString == NULL) + return NULL; + + for (i = 0, j = 0; i < stringLength; i++) { + if (string[i] == '"') + newString[j++] = '\\'; + + newString[j++] = string[i]; + } + + newString[j] = '\0'; + + return newString; +} + +static int spawn(const char *cmdname, char **argv) { + int argc = 0; + char **newArgv = argv; + int i; + intptr_t exitStatus; + + // _spawnvp removes double quotes from arguments, so we + // have to escape them manually + while (*newArgv++ != NULL) + argc++; + + newArgv = (char **)malloc(sizeof(char*) * (argc + 1)); + + for (i = 0; i < argc; i++) + newArgv[i] = escapeDoubleQuotes(argv[i]); + + newArgv[argc] = NULL; + + exitStatus = _spawnvp(_P_WAIT, cmdname, (const char *const *)newArgv); + + for (i = 0; i < argc; i++) + free(newArgv[i]); + + free(newArgv); + return exitStatus; +} + #else + #define _P_WAIT 0 #ifndef __sun extern int fork(void); #endif extern int wait(int *); -static int _spawnvp(int mode, const char *cmdname, char *argv[]) { +static int spawn(const char *cmdname, char **argv) { int pid, n, status; switch (pid = fork()) { @@ -292,11 +357,7 @@ static int callsys(char **av) { fprintf(stderr, "\n"); } if (verbose < 2) -#ifndef WIN32 - status = _spawnvp(_P_WAIT, executable, argv); -#else - status = _spawnvp(_P_WAIT, executable, (const char* const*)argv); -#endif + status = spawn(executable, argv); if (status == -1) { fprintf(stderr, "%s: ", progname); perror(argv[0]); @@ -526,10 +587,6 @@ static void help(void) { #define xx(v) if ((s = getenv(#v))) fprintf(stderr, #v "=%s\n", s) xx(LCCINPUTS); xx(LCCDIR); -#ifdef WIN32 - xx(include); - xx(lib); -#endif #undef xx } @@ -537,9 +594,6 @@ static void help(void) { static void initinputs(void) { char *s = getenv("LCCINPUTS"); List b; -#ifdef WIN32 - List list; -#endif if (s == 0 || (s = inputs)[0] == 0) s = "."; @@ -556,13 +610,6 @@ static void initinputs(void) { b->str = ""; } while (b != lccinputs); } -#ifdef WIN32 - if ((list = b = path2list(getenv("include")))) - do { - b = b->link; - ilist = append(stringf("-I\"%s\"", b->str), ilist); - } while (b != list); -#endif } /* interrupt - catch interrupt signals */ @@ -771,10 +818,9 @@ char *strsave(const char *str) { char *stringf(const char *fmt, ...) { char buf[1024]; va_list ap; - int n; va_start(ap, fmt); - n = vsprintf(buf, fmt, ap); + vsprintf(buf, fmt, ap); va_end(ap); return strsave(buf); } |