mirror of
https://github.com/UberGames/ioef.git
synced 2024-11-27 22:42:09 +00:00
* Make LCC's handling of -D arguments on windows consistent with other plaftorms
This commit is contained in:
parent
1da457889e
commit
8e04904375
1 changed files with 62 additions and 6 deletions
|
@ -217,14 +217,74 @@ char *basename(char *name) {
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <process.h>
|
#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
|
#else
|
||||||
|
|
||||||
#define _P_WAIT 0
|
#define _P_WAIT 0
|
||||||
#ifndef __sun
|
#ifndef __sun
|
||||||
extern int fork(void);
|
extern int fork(void);
|
||||||
#endif
|
#endif
|
||||||
extern int wait(int *);
|
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;
|
int pid, n, status;
|
||||||
|
|
||||||
switch (pid = fork()) {
|
switch (pid = fork()) {
|
||||||
|
@ -292,11 +352,7 @@ static int callsys(char **av) {
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
if (verbose < 2)
|
if (verbose < 2)
|
||||||
#ifndef WIN32
|
status = spawn(executable, argv);
|
||||||
status = _spawnvp(_P_WAIT, executable, argv);
|
|
||||||
#else
|
|
||||||
status = _spawnvp(_P_WAIT, executable, (const char* const*)argv);
|
|
||||||
#endif
|
|
||||||
if (status == -1) {
|
if (status == -1) {
|
||||||
fprintf(stderr, "%s: ", progname);
|
fprintf(stderr, "%s: ", progname);
|
||||||
perror(argv[0]);
|
perror(argv[0]);
|
||||||
|
|
Loading…
Reference in a new issue