+#include <stdlib.h>
+
/* common */
#include "fileid.h"
/* sp65 */
+#include "attr.h"
#include "error.h"
#include "input.h"
#include "pcx.h"
+/* Possible input formats */
+enum InputFormat {
+ ifPCX, /* PCX */
+ ifCount /* Number of actual input formats w/o ifAuto*/
+};
+
typedef struct InputFormatDesc InputFormatDesc;
struct InputFormatDesc {
-
/* Read routine */
- Bitmap* (*Read) (const char* Name);
-
+ Bitmap* (*Read) (const Collection*);
};
-/* Table with input formats */
+/* Table with input formats indexed by InputFormat */
static InputFormatDesc InputFormatTable[ifCount] = {
{ ReadPCXFile },
};
-int FindInputFormat (const char* Name)
-/* Find an input format by name. The function returns a value less than zero
- * if Name is not a known input format.
- */
-{
- /* Search for the entry in the table */
- const FileId* F = GetFileId (Name, FormatTable,
- sizeof (FormatTable) / sizeof (FormatTable[0]));
- return (F == 0)? -1 : F->Id;
-}
-
-
-
-Bitmap* ReadInputFile (const char* Name, InputFormat Format)
-/* Read a bitmap from a file and return it. If Format is ifAuto, the routine
- * tries to determine the format from the file name extension.
- */
+Bitmap* ReadInputFile (const Collection* A)
+/* Read a bitmap from a file and return it. Format, file name etc. must be
+** given as attributes in A. If no format is given, the function tries to
+** autodetect it by using the extension of the file name.
+*/
{
- /* If the format is Auto, try to determine it from the file name */
- if (Format == ifAuto) {
- /* Search for the entry in the table */
- const FileId* F = GetFileId (Name, FormatTable,
- sizeof (FormatTable) / sizeof (FormatTable[0]));
+ const FileId* F;
+
+ /* Get the file format from the command line */
+ const char* Format = GetAttrVal (A, "format");
+ if (Format != 0) {
+ /* Format is given, search for it in the table. */
+ F = bsearch (Format,
+ FormatTable,
+ sizeof (FormatTable) / sizeof (FormatTable[0]),
+ sizeof (FormatTable[0]),
+ CompareFileId);
+ if (F == 0) {
+ Error ("Unknown input format `%s'", Format);
+ }
+ } else {
+ /* No format given, use file name extension */
+ const char* Name = NeedAttrVal (A, "name", "write");
+ F = GetFileId (Name, FormatTable,
+ sizeof (FormatTable) / sizeof (FormatTable[0]));
/* Found? */
if (F == 0) {
Error ("Cannot determine file format of input file `%s'", Name);
}
- Format = F->Id;
}
- /* Check the format just for safety */
- CHECK (Format >= 0 && Format < ifCount);
-
/* Call the format specific read */
- return InputFormatTable[Format].Read (Name);
+ return InputFormatTable[F->Id].Read (A);
}
-
-
-