diff --git a/doc/ca65.sgml b/doc/ca65.sgml
index 74ca32631..9980e55c9 100644
--- a/doc/ca65.sgml
+++ b/doc/ca65.sgml
@@ -3192,7 +3192,7 @@ See: , when .
pc_assignment
@@ -3793,7 +3793,7 @@ See: ,[Type = Type;
+ if (FileName) {
+ memcpy (F->FileName, FileName, Length + 1);
+ } else {
+ F->FileName[0] = '\0';
+ }
+ return F;
+}
+
+
+
+static void FreeInputFile (InputFile* F)
+/* Free an InputFile struct */
+{
+ xfree (F);
+}
@@ -434,10 +464,7 @@ static void OptLargeAlignment (const char* Opt attribute ((unused)),
static void OptLib (const char* Opt attribute ((unused)), const char* Arg)
/* Link a library */
{
- InputFiles[InputFilesCount].Type = INPUT_FILES_FILE_LIB;
- InputFiles[InputFilesCount].FileName = Arg;
- if (++InputFilesCount >= MAX_INPUTFILES)
- Error ("Too many input files");
+ CollAppend (&InputFiles, NewInputFile (INPUT_FILES_FILE_LIB, Arg));
}
@@ -485,10 +512,7 @@ static void OptNoUtf8 (const char* Opt attribute ((unused)),
static void OptObj (const char* Opt attribute ((unused)), const char* Arg)
/* Link an object file */
{
- InputFiles[InputFilesCount].Type = INPUT_FILES_FILE_OBJ;
- InputFiles[InputFilesCount].FileName = Arg;
- if (++InputFilesCount >= MAX_INPUTFILES)
- Error ("Too many input files");
+ CollAppend (&InputFiles, NewInputFile (INPUT_FILES_FILE_OBJ, Arg));
}
@@ -606,10 +630,7 @@ static void CmdlOptStartGroup (const char* Opt attribute ((unused)),
const char* Arg attribute ((unused)))
/* Remember 'start group' occurrence in input files array */
{
- InputFiles[InputFilesCount].Type = INPUT_FILES_SGROUP;
- InputFiles[InputFilesCount].FileName = Arg; /* Unused */
- if (++InputFilesCount >= MAX_INPUTFILES)
- Error ("Too many input files");
+ CollAppend (&InputFiles, NewInputFile (INPUT_FILES_SGROUP, 0));
}
@@ -618,10 +639,7 @@ static void CmdlOptEndGroup (const char* Opt attribute ((unused)),
const char* Arg attribute ((unused)))
/* Remember 'end group' occurrence in input files array */
{
- InputFiles[InputFilesCount].Type = INPUT_FILES_EGROUP;
- InputFiles[InputFilesCount].FileName = Arg; /* Unused */
- if (++InputFilesCount >= MAX_INPUTFILES)
- Error ("Too many input files");
+ CollAppend (&InputFiles, NewInputFile (INPUT_FILES_EGROUP, 0));
}
@@ -679,9 +697,6 @@ static void ParseCommandLine (void)
unsigned I;
unsigned LabelFileGiven = 0;
- /* Allocate memory for input file array */
- InputFiles = xmalloc (MAX_INPUTFILES * sizeof (struct InputFile));
-
/* Defer setting of config/target and input files until all options are parsed */
I = 1;
while (I < ArgCount) {
@@ -774,13 +789,8 @@ static void ParseCommandLine (void)
}
} else {
-
/* A filename */
- InputFiles[InputFilesCount].Type = INPUT_FILES_FILE;
- InputFiles[InputFilesCount].FileName = Arg;
- if (++InputFilesCount >= MAX_INPUTFILES)
- Error ("Too many input files");
-
+ CollAppend (&InputFiles, NewInputFile (INPUT_FILES_FILE, Arg));
}
/* Next argument */
@@ -793,17 +803,18 @@ static void ParseCommandLine (void)
OptConfig (NULL, CmdlineCfgFile);
}
- /* Process input files */
- for (I = 0; I < InputFilesCount; ++I) {
- switch (InputFiles[I].Type) {
+ /* Process input files and delete the entries while doing so */
+ for (I = 0; I < CollCount (&InputFiles); ++I) {
+ InputFile* F = CollAtUnchecked (&InputFiles, I);
+ switch (F->Type) {
case INPUT_FILES_FILE:
- LinkFile (InputFiles[I].FileName, FILETYPE_UNKNOWN);
+ LinkFile (F->FileName, FILETYPE_UNKNOWN);
break;
case INPUT_FILES_FILE_LIB:
- LinkFile (InputFiles[I].FileName, FILETYPE_LIB);
+ LinkFile (F->FileName, FILETYPE_LIB);
break;
case INPUT_FILES_FILE_OBJ:
- LinkFile (InputFiles[I].FileName, FILETYPE_OBJ);
+ LinkFile (F->FileName, FILETYPE_OBJ);
break;
case INPUT_FILES_SGROUP:
OptStartGroup (NULL, 0);
@@ -812,12 +823,14 @@ static void ParseCommandLine (void)
OptEndGroup (NULL, 0);
break;
default:
- abort ();
+ FAIL ("Unknown file type");
}
+ FreeInputFile (F);
}
/* Free memory used for input file array */
- xfree (InputFiles);
+ DoneCollection (&InputFiles);
+ InitCollection (&InputFiles); /* Don't leave dangling pointers */
}
]