From f0a73e253d5abe8ee7be1ddbb9ffe178e7b2b566 Mon Sep 17 00:00:00 2001 From: uz Date: Mon, 27 Feb 2012 16:33:13 +0000 Subject: [PATCH] Added a new input layer that manages the different input formats. git-svn-id: svn://svn.cc65.org/cc65/trunk@5559 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/sp65/input.c | 106 ++++++++++++++++++++++++++++++++++++++++++ src/sp65/input.h | 81 ++++++++++++++++++++++++++++++++ src/sp65/main.c | 4 +- src/sp65/make/gcc.mak | 1 + src/sp65/pcx.c | 3 ++ 5 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 src/sp65/input.c create mode 100644 src/sp65/input.h diff --git a/src/sp65/input.c b/src/sp65/input.c new file mode 100644 index 000000000..d7b17686f --- /dev/null +++ b/src/sp65/input.c @@ -0,0 +1,106 @@ +/*****************************************************************************/ +/* */ +/* input.c */ +/* */ +/* Input format/file definitions for the sp65 sprite and bitmap utility */ +/* */ +/* */ +/* */ +/* (C) 2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* common */ +#include "fileid.h" + +/* sp65 */ +#include "error.h" +#include "input.h" +#include "pcx.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +typedef struct InputFormatDesc InputFormatDesc; +struct InputFormatDesc { + + /* Read routine */ + Bitmap* (*Read) (const char* Name); + +}; + +/* Table with input formats */ +static InputFormatDesc InputFormatTable[ifCount] = { + { ReadPCXFile }, +}; + +/* Table that maps extensions to input formats. Must be sorted alphabetically */ +static const FileId FormatTable[] = { + /* Upper case stuff for obsolete operating systems */ + { "PCX", ifPCX }, + + { "pcx", ifPCX }, +}; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +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])); + /* 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); +} + + + diff --git a/src/sp65/input.h b/src/sp65/input.h new file mode 100644 index 000000000..0b019f724 --- /dev/null +++ b/src/sp65/input.h @@ -0,0 +1,81 @@ +/*****************************************************************************/ +/* */ +/* input.h */ +/* */ +/* Input format/file definitions for the sp65 sprite and bitmap utility */ +/* */ +/* */ +/* */ +/* (C) 2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef INPUT_H +#define INPUT_H + + + +/* sp65 */ +#include "bitmap.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +typedef enum InputFormat InputFormat; +enum InputFormat { + ifAuto = -1, /* Auto detect */ + ifPCX, /* PCX */ + + ifCount /* Number of actual input formats w/o ifAuto*/ +}; + + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +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. + */ + + + +/* End of input.h */ + +#endif + + + diff --git a/src/sp65/main.c b/src/sp65/main.c index 1c57de983..0db919515 100644 --- a/src/sp65/main.c +++ b/src/sp65/main.c @@ -45,7 +45,7 @@ /* sp65 */ #include "error.h" -#include "pcx.h" /* ### Testing */ +#include "input.h" @@ -153,7 +153,7 @@ int main (int argc, char* argv []) } } else { /* #### Testing */ - ReadPCXFile (Arg); + ReadInputFile (Arg, ifAuto); } /* Next argument */ diff --git a/src/sp65/make/gcc.mak b/src/sp65/make/gcc.mak index ed3ebf318..9c4a2b50a 100644 --- a/src/sp65/make/gcc.mak +++ b/src/sp65/make/gcc.mak @@ -26,6 +26,7 @@ OBJS = bitmap.o \ color.o \ error.o \ fileio.o \ + input.o \ main.o \ palette.o \ pcx.o diff --git a/src/sp65/pcx.c b/src/sp65/pcx.c index 5ce35b5fb..22cabfedc 100644 --- a/src/sp65/pcx.c +++ b/src/sp65/pcx.c @@ -272,6 +272,9 @@ Bitmap* ReadPCXFile (const char* Name) default:Internal ("Unexpected number of planes"); } + /* Copy the name */ + SB_CopyStr (&B->Name, Name); + /* Remember the PCX header in the tag */ B->Tag = P; -- 2.39.5