]> git.sur5r.net Git - cc65/blobdiff - src/sp65/input.c
Merge pull request #249 from polluks/master
[cc65] / src / sp65 / input.c
index 735e4920c163dfe14489c2c1f5dd947f8c4f57f0..381adf6b98bc733896fff91bfa89511ce428efd9 100644 (file)
 
 
 
+#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     },
 };
@@ -78,42 +85,37 @@ 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.
- */
-{
-    /* 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);
 }
-
-
-