+static void
+read_file_list (const char *filename)
+{
+ FILE *f;
+ /* An upper bound on the number of characters in the file. */
+ long pos;
+ /* File in memory. */
+ char *buffer;
+ size_t len;
+ char *b;
+ char *e;
+
+ f = fopen (filename, FOPEN_RT);
+ if (f == NULL)
+ {
+ einfo ("%F%P: cannot open %s\n", filename);
+ return;
+ }
+ if (fseek (f, 0L, SEEK_END) == -1)
+ goto error;
+ pos = ftell (f);
+ if (pos == -1)
+ goto error;
+ if (fseek (f, 0L, SEEK_SET) == -1)
+ goto error;
+
+ buffer = (char *) xmalloc (pos + 1);
+ len = fread (buffer, sizeof (char), pos, f);
+ if (len != (size_t) pos && ferror (f))
+ goto error;
+ /* Add a NUL terminator. */
+ buffer[len] = '\0';
+ fclose (f);
+
+ /* Parse files. */
+ b = buffer;
+ while (1)
+ {
+ /* Skip empty lines. */
+ while (*b == '\n' || *b == '\r')
+ b++;
+
+ /* Stop if end of buffer. */
+ if (b == buffer + len)
+ break;
+
+ /* Eat any byte until end of line. */
+ for (e = b; *e != '\0'; e++)
+ if (*e == '\n' || *e == '\r')
+ break;
+
+ /* Replace end of line by nul. */
+ if (*e != '\0')
+ *e++ = '\0';
+
+ if (b != e)
+ lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL);
+ b = e;
+ }
+ return;
+
+ error:
+ einfo ("%F%P: cannot read %s\n", optarg);
+ fclose (f);
+}