diff --git a/src/sp65/input.c b/src/sp65/input.c index 6e3073f80..85807752f 100644 --- a/src/sp65/input.c +++ b/src/sp65/input.c @@ -39,6 +39,7 @@ #include "fileid.h" /* sp65 */ +#include "attr.h" #include "error.h" #include "input.h" #include "pcx.h" @@ -51,15 +52,19 @@ -typedef struct InputFormatDesc InputFormatDesc; -struct InputFormatDesc { - - /* Read routine */ - Bitmap* (*Read) (const char* Name); - +/* Possible input formats */ +enum InputFormat { + ifPCX, /* PCX */ + ifCount /* Number of actual input formats w/o ifAuto*/ }; -/* Table with input formats */ +typedef struct InputFormatDesc InputFormatDesc; +struct InputFormatDesc { + /* Read routine */ + Bitmap* (*Read) (const Collection*); +}; + +/* Table with input formats indexed by InputFormat */ static InputFormatDesc InputFormatTable[ifCount] = { { ReadPCXFile }, }; @@ -80,46 +85,39 @@ static const FileId FormatTable[] = { -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); + const FileId* F; - /* 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])); + /* 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); } diff --git a/src/sp65/input.h b/src/sp65/input.h index b0a5cd27b..cfbc6f63c 100644 --- a/src/sp65/input.h +++ b/src/sp65/input.h @@ -38,42 +38,24 @@ +/* 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. */ diff --git a/src/sp65/main.c b/src/sp65/main.c index 062ace661..c14bf38c0 100644 --- a/src/sp65/main.c +++ b/src/sp65/main.c @@ -207,19 +207,6 @@ static void OptRead (const char* Opt, const char* Arg) /* 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); @@ -227,7 +214,7 @@ static void OptRead (const char* Opt, const char* Arg) 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); @@ -353,7 +340,7 @@ int main (int argc, char* argv []) break; case 'l': - if (Arg[2] == 'c') { + if (Arg[2] == 'c') { OptListConversions (Arg, 0); } else { UnknownOption (Arg); diff --git a/src/sp65/pcx.c b/src/sp65/pcx.c index 259da2a46..036d03c85 100644 --- a/src/sp65/pcx.c +++ b/src/sp65/pcx.c @@ -243,7 +243,7 @@ static void ReadPlane (FILE* F, PCXHeader* P, unsigned char* L) -Bitmap* ReadPCXFile (const char* Name) +Bitmap* ReadPCXFile (const Collection* A) /* Read a bitmap from a PCX file */ { PCXHeader* P; @@ -254,6 +254,8 @@ Bitmap* ReadPCXFile (const char* Name) unsigned X, Y; + /* Get the file name */ + const char* Name = NeedAttrVal (A, "name", "read pcx file"); /* Open the file */ FILE* F = fopen (Name, "rb"); diff --git a/src/sp65/pcx.h b/src/sp65/pcx.h index 1a3870a6a..c288a2514 100644 --- a/src/sp65/pcx.h +++ b/src/sp65/pcx.h @@ -38,6 +38,9 @@ +/* common */ +#include "coll.h" + /* sp65 */ #include "bitmap.h" @@ -49,7 +52,7 @@ -Bitmap* ReadPCXFile (const char* Name); +Bitmap* ReadPCXFile (const Collection* A); /* Read a bitmap from a PCX file */