#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.
+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.
*/
{
- /* Search for the entry in the table. */
- const FileId* F = bsearch (Name,
- FormatTable,
- sizeof (FormatTable) / sizeof (FormatTable[0]),
- sizeof (FormatTable[0]),
- CompareFileId);
-
- /* Return the id or an error code */
- 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.
- */
-{
- /* 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);
}
+/* common */
+#include "coll.h"
+
/* sp65 */
#include "bitmap.h"
-/*****************************************************************************/
-/* Data */
-/*****************************************************************************/
-
-
-
-enum InputFormat {
- ifAuto = -1, /* Auto detect */
- ifPCX, /* PCX */
-
- ifCount /* Number of actual input formats w/o ifAuto*/
-};
-typedef enum InputFormat InputFormat;
-
-
-
-
/*****************************************************************************/
/* Code */
/*****************************************************************************/
-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.
- */
-
-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.
*/
/* Parse the argument */
Collection* A = ParseAttrList (Arg, NameList, 2);
- /* Must have a file name given */
- const char* FileName = NeedAttrVal (A, "name", Opt);
-
- /* Determine the format of the input file */
- int IF = ifAuto;
- const char* Format = GetAttrVal (A, "format");
- if (Format != 0) {
- IF = FindInputFormat (Format);
- if (IF < 0) {
- Error ("Unknown input format `%s'", Format);
- }
- }
-
/* Clear the working copy */
SetWorkBitmap (0);
FreeBitmap (B);
/* Read the file and use it as original and as working copy */
- B = C = ReadInputFile (FileName, IF);
+ B = C = ReadInputFile (A);
/* Delete the attribute list */
FreeCollection (A);
break;
case 'l':
- if (Arg[2] == 'c') {
+ if (Arg[2] == 'c') {
OptListConversions (Arg, 0);
} else {
UnknownOption (Arg);