]> git.sur5r.net Git - cc65/commitdiff
Move evaluation of attributes into the input routine.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 10 Mar 2012 20:26:47 +0000 (20:26 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 10 Mar 2012 20:26:47 +0000 (20:26 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5592 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/sp65/input.c
src/sp65/input.h
src/sp65/main.c
src/sp65/pcx.c
src/sp65/pcx.h

index 6e3073f802ea13bfa97c7e72cf1922151272bed7..85807752fea353a12d60806476d2cdda6c27a21d 100644 (file)
@@ -39,6 +39,7 @@
 #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     },
 };
@@ -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);
-
-    /* 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);
 }
 
 
index b0a5cd27b43e294c31cff23a6f3a7a055a59dbcc..cfbc6f63c40073504532e4cc631cdcf1a62dbd18 100644 (file)
 
 
 
+/* 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.
  */
 
 
index 062ace661b7b33b65e4efa1c481b2190c45411ef..c14bf38c007cfff73182d9f10e2ecab0b9a5582b 100644 (file)
@@ -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);
index 259da2a46386ed0f2a204c7a8654a552857bf49d..036d03c85ac20062f69f2e53dde0fcd9ec75e5bf 100644 (file)
@@ -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");
index 1a3870a6a78f39fda311b828dd9a5a30346cb6d9..c288a25140394dc1adef3caa52d84e274f91e1c8 100644 (file)
@@ -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 */