ref: f670f6003cc4b7d2391957a6dac55f5bf3ca325e
parent: a64a06c4bb5d9ebcc6bb8e8c6897da1de692f7d1
author: Simon Howard <fraggle@gmail.com>
date: Fri Jan 5 18:38:19 EST 2007
Move response file code to m_argv.c Subversion-branch: /trunk/chocolate-doom Subversion-revision: 817
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -590,167 +590,6 @@
return handle != NULL;
}
-
-#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<argv_index; ++i)
- {
- newargv[i] = myargv[i];
- ++newargc;
- }
-
- infile = file;
- k = 0;
-
- while(k < size)
- {
- // Skip past space characters to the next argument
-
- while(k < size && isspace(infile[k]))
- {
- ++k;
- }
-
- if (k >= 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<myargc; ++i)
- {
- newargv[newargc] = myargv[i];
- ++newargc;
- }
-
- myargv = newargv;
- myargc = newargc;
-
-#if 0
- // Disabled - Vanilla Doom does not do this.
- // Display arguments
-
- printf("%d command-line args:\n", myargc);
-
- for (k=1; k<myargc; k++)
- {
- printf("'%s'\n", myargv[k]);
- }
-#endif
-}
-
-//
-// Find a Response File
-//
-void FindResponseFile (void)
-{
- int i;
-
- for (i = 1; i < myargc; i++)
- {
- if (myargv[i][0] == '@')
- {
- LoadResponseFile(i);
- }
- }
-}
-
// Startup banner
void PrintBanner(char *msg)
@@ -935,7 +774,7 @@
char file[256];
char demolumpname[9];
- FindResponseFile ();
+ M_FindResponseFile ();
// Undocumented "search for IWADs" parameter used by the setup
// tool.
--- a/src/m_argv.c
+++ b/src/m_argv.c
@@ -24,9 +24,13 @@
//-----------------------------------------------------------------------------
-
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include "i_system.h"
+
int myargc;
char** myargv;
@@ -50,6 +54,166 @@
}
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<argv_index; ++i)
+ {
+ newargv[i] = myargv[i];
+ ++newargc;
+ }
+
+ infile = file;
+ k = 0;
+
+ while(k < size)
+ {
+ // Skip past space characters to the next argument
+
+ while(k < size && isspace(infile[k]))
+ {
+ ++k;
+ }
+
+ if (k >= 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<myargc; ++i)
+ {
+ newargv[newargc] = myargv[i];
+ ++newargc;
+ }
+
+ myargv = newargv;
+ myargc = newargc;
+
+#if 0
+ // Disabled - Vanilla Doom does not do this.
+ // Display arguments
+
+ printf("%d command-line args:\n", myargc);
+
+ for (k=1; k<myargc; k++)
+ {
+ printf("'%s'\n", myargv[k]);
+ }
+#endif
+}
+
+//
+// Find a Response File
+//
+void M_FindResponseFile(void)
+{
+ int i;
+
+ for (i = 1; i < myargc; i++)
+ {
+ if (myargv[i][0] == '@')
+ {
+ LoadResponseFile(i);
+ }
+ }
}
--- a/src/m_argv.h
+++ b/src/m_argv.h
@@ -38,5 +38,6 @@
// in the arg list (0 if not found).
int M_CheckParm (char* check);
+void M_FindResponseFile(void);
#endif