From f670f6003cc4b7d2391957a6dac55f5bf3ca325e Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Fri, 5 Jan 2007 23:38:19 +0000 Subject: Move response file code to m_argv.c Subversion-branch: /trunk/chocolate-doom Subversion-revision: 817 --- src/m_argv.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) (limited to 'src/m_argv.c') diff --git a/src/m_argv.c b/src/m_argv.c index fd04631c..9e119876 100644 --- a/src/m_argv.c +++ b/src/m_argv.c @@ -24,9 +24,13 @@ //----------------------------------------------------------------------------- - +#include +#include +#include #include +#include "i_system.h" + int myargc; char** myargv; @@ -52,6 +56,166 @@ int M_CheckParm (char *check) return 0; } +#define MAXARGVS 100 + +static void LoadResponseFile(int argv_index) +{ + FILE *handle; + int size; + char *infile; + char *file; + char *response_filename; + char **newargv; + int newargc; + int i, k; + + response_filename = myargv[argv_index] + 1; + + // Read the response file into memory + handle = fopen(response_filename, "r"); + + if (handle == NULL) + { + printf ("\nNo such response file!"); + exit(1); + } + + printf("Found response file %s!\n", response_filename); + + // Find size of file + + fseek(handle, 0, SEEK_END); + size = ftell(handle); + fseek(handle, 0, SEEK_SET); + + // Read in the entire file + // Allocate one byte extra - this is incase there is an argument + // at the end of the response file, in which case a '\0' will be + // needed. + + file = malloc(size + 1); + fread(file, size, 1, handle); + fclose(handle); + + // Create new arguments list array + + newargv = malloc(sizeof(char *) * MAXARGVS); + newargc = 0; + memset(newargv, 0, sizeof(char *) * MAXARGVS); + + // Copy all the arguments in the list up to the response file + + for (i=0; i= size) + { + break; + } + + // If the next argument is enclosed in quote marks, treat + // the contents as a single argument. This allows long filenames + // to be specified. + + if (infile[k] == '\"') + { + // Skip the first character(") + ++k; + + newargv[newargc++] = &infile[k]; + + // Read all characters between quotes + + while (k < size && infile[k] != '\"' && infile[k] != '\n') + { + ++k; + } + + if (k >= size || infile[k] == '\n') + { + I_Error("Quotes unclosed in response file '%s'", + response_filename); + } + + // Cut off the string at the closing quote + + infile[k] = '\0'; + ++k; + } + else + { + // Read in the next argument until a space is reached + + newargv[newargc++] = &infile[k]; + + while(k < size && !isspace(infile[k])) + { + ++k; + } + + // Cut off the end of the argument at the first space + + infile[k] = '\0'; + + ++k; + } + } + + // Add arguments following the response file argument + + for (i=argv_index + 1; i