- Response file improvements:
* Fixed: Trying to use a response file would result in infinite looping until memory was
exhausted.
* Fixed: Response files were read after coalescing file parameters, which would lead to
non-coalesced parameters if the original command line and response file both had them.
* You can now use more than one response file.
* Response files can include other response files.
SVN r2334 (trunk)
This commit is contained in:
parent
adcf26d2b5
commit
61d2a808d7
5 changed files with 84 additions and 39 deletions
|
|
@ -150,40 +150,54 @@ int M_ReadFile (char const *name, BYTE **buffer)
|
|||
|
||||
void M_FindResponseFile (void)
|
||||
{
|
||||
int i;
|
||||
const int limit = 100; // avoid infinite recursion
|
||||
int added_stuff = 0;
|
||||
int i = 1;
|
||||
|
||||
for (i = 1; i < Args->NumArgs(); i++)
|
||||
while (i < Args->NumArgs())
|
||||
{
|
||||
if (Args->GetArg(i)[0] == '@')
|
||||
if (Args->GetArg(i)[0] != '@')
|
||||
{
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
char **argv;
|
||||
char *file;
|
||||
int argc;
|
||||
char *file = NULL;
|
||||
int argc = 0;
|
||||
FILE *handle;
|
||||
int size;
|
||||
long argsize;
|
||||
int k;
|
||||
int index;
|
||||
|
||||
// READ THE RESPONSE FILE INTO MEMORY
|
||||
handle = fopen (Args->GetArg(i) + 1,"rb");
|
||||
if (!handle)
|
||||
{ // [RH] Make this a warning, not an error.
|
||||
Printf ("No such response file (%s)!", Args->GetArg(i) + 1);
|
||||
continue;
|
||||
// Any more response files after the limit will be removed from the
|
||||
// command line.
|
||||
if (added_stuff < limit)
|
||||
{
|
||||
// READ THE RESPONSE FILE INTO MEMORY
|
||||
handle = fopen (Args->GetArg(i) + 1,"rb");
|
||||
if (!handle)
|
||||
{ // [RH] Make this a warning, not an error.
|
||||
Printf ("No such response file (%s)!\n", Args->GetArg(i) + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
Printf ("Found response file %s!\n", Args->GetArg(i) + 1);
|
||||
fseek (handle, 0, SEEK_END);
|
||||
size = ftell (handle);
|
||||
fseek (handle, 0, SEEK_SET);
|
||||
file = new char[size+1];
|
||||
fread (file, size, 1, handle);
|
||||
file[size] = 0;
|
||||
fclose (handle);
|
||||
|
||||
argsize = ParseCommandLine (file, &argc, NULL);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Printf ("Ignored response file %s.\n", Args->GetArg(i) + 1);
|
||||
}
|
||||
|
||||
Printf ("Found response file %s!\n", Args->GetArg(i) + 1);
|
||||
fseek (handle, 0, SEEK_END);
|
||||
size = ftell (handle);
|
||||
fseek (handle, 0, SEEK_SET);
|
||||
file = new char[size+1];
|
||||
fread (file, size, 1, handle);
|
||||
file[size] = 0;
|
||||
fclose (handle);
|
||||
|
||||
argsize = ParseCommandLine (file, &argc, NULL);
|
||||
argc = Args->NumArgs() - 1;
|
||||
|
||||
if (argc != 0)
|
||||
{
|
||||
|
|
@ -199,27 +213,39 @@ void M_FindResponseFile (void)
|
|||
newargs->AppendArg(Args->GetArg(index));
|
||||
|
||||
// Copy parameters from response file.
|
||||
for (index = 0; index < argc; ++i)
|
||||
for (index = 0; index < argc; ++index)
|
||||
newargs->AppendArg(argv[index]);
|
||||
|
||||
// Copy parameters after response file.
|
||||
for (index = i + 1, i = newargs->NumArgs(); index < Args->NumArgs(); ++index)
|
||||
for (index = i + 1; index < Args->NumArgs(); ++index)
|
||||
newargs->AppendArg(Args->GetArg(index));
|
||||
|
||||
// Use the new argument vector as the global Args object.
|
||||
Args = newargs;
|
||||
if (++added_stuff == limit)
|
||||
{
|
||||
Printf("Response file limit of %d hit.\n", limit);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remove the response file from the Args object
|
||||
Args->RemoveArg(i);
|
||||
}
|
||||
if (file != NULL)
|
||||
{
|
||||
delete[] file;
|
||||
}
|
||||
|
||||
delete[] file;
|
||||
|
||||
// DISPLAY ARGS
|
||||
Printf ("%d command-line args:\n", Args->NumArgs ());
|
||||
for (k = 1; k < Args->NumArgs (); k++)
|
||||
Printf ("%s\n", Args->GetArg (k));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (added_stuff > 0)
|
||||
{
|
||||
// DISPLAY ARGS
|
||||
Printf ("Added %d response file%s, now have %d command-line args:\n",
|
||||
added_stuff, added_stuff > 1 ? "s" : "", Args->NumArgs ());
|
||||
for (int k = 1; k < Args->NumArgs (); k++)
|
||||
Printf ("%s\n", Args->GetArg (k));
|
||||
}
|
||||
}
|
||||
|
||||
// ParseCommandLine
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue