]> git.sur5r.net Git - cc65/blob - src/sp65/output.c
Added the write routine.
[cc65] / src / sp65 / output.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                 output.c                                  */
4 /*                                                                           */
5 /*   Output format/file definitions for the sp65 sprite and bitmap utility   */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2012,      Ullrich von Bassewitz                                      */
10 /*                Roemerstrasse 52                                           */
11 /*                D-70794 Filderstadt                                        */
12 /* EMail:         uz@cc65.org                                                */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #include <stdlib.h>
37
38 /* common */
39 #include "fileid.h"
40
41 /* sp65 */
42 #include "asm.h"
43 #include "bin.h"
44 #include "error.h"
45 #include "output.h"
46
47
48
49 /*****************************************************************************/
50 /*                                   Data                                    */
51 /*****************************************************************************/
52
53
54
55 typedef struct OutputFormatDesc OutputFormatDesc;
56 struct OutputFormatDesc {
57
58     /* Write routine */
59     void (*Write) (const char* Name, const StrBuf* Data);
60
61 };
62
63 /* Table with Output formats */
64 static OutputFormatDesc OutputFormatTable[ofCount] = {
65     {   WriteAsmFile    },
66     {   WriteBinFile    },
67 };
68
69 /* Table that maps extensions to Output formats. Must be sorted alphabetically */
70 static const FileId FormatTable[] = {
71     /* Upper case stuff for obsolete operating systems */
72     {   "A",    ofAsm           },
73     {   "ASM",  ofAsm           },
74     {   "BIN",  ofBin           },
75     {   "INC",  ofAsm           },
76     {   "S",    ofAsm           },
77
78     {   "a",    ofAsm           },
79     {   "asm",  ofAsm           },
80     {   "bin",  ofBin           },
81     {   "inc",  ofAsm           },
82     {   "s",    ofAsm           },
83 };
84
85
86
87 /*****************************************************************************/
88 /*                                   Code                                    */
89 /*****************************************************************************/
90
91
92
93 int FindOutputFormat (const char* Name)
94 /* Find an output format by name. The function returns a value less than zero
95  * if Name is not a known output format.
96  */
97 {
98     /* Search for the entry in the table. */
99     const FileId* F = bsearch (Name,
100                                FormatTable,
101                                sizeof (FormatTable) / sizeof (FormatTable[0]),
102                                sizeof (FormatTable[0]),
103                                CompareFileId);
104
105     /* Return the id or an error code */
106     return (F == 0)? -1 : F->Id;
107 }
108
109
110
111 void WriteOutputFile (const char* Name, const StrBuf* Data, OutputFormat Format)
112 /* Write the contents of Data to the given file in the format specified. If
113  * the format is ofAuto, it is determined by the file extension.
114  */
115 {
116     /* If the format is Auto, try to determine it from the file name */
117     if (Format == ofAuto) {
118         /* Search for the entry in the table */
119         const FileId* F = GetFileId (Name, FormatTable,
120                                      sizeof (FormatTable) / sizeof (FormatTable[0]));
121         /* Found? */
122         if (F == 0) {
123             Error ("Cannot determine file format of output file `%s'", Name);
124         }
125         Format = F->Id;
126     }
127
128     /* Check the format just for safety */
129     CHECK (Format >= 0 && Format < ofCount);
130
131     /* Call the format specific write */
132     OutputFormatTable[Format].Write (Name, Data);
133 }
134
135
136