#include "error.h"
#include "objfile.h"
#include "options.h"
+#include "spool.h"
-static Option* NewOption (unsigned char Type)
+static Option* NewOption (unsigned char Type, unsigned long Val)
/* Create a new option, insert it into the list and return it */
{
Option* Opt;
/* Initialize fields */
Opt->Next = 0;
Opt->Type = Type;
- Opt->V.Str = 0;
+ Opt->Val = Val;
/* Insert it into the list */
if (OptRoot == 0) {
void OptStr (unsigned char Type, const char* Text)
/* Add a string option */
{
- Option* O;
-
- /* String must have less than 255 bytes */
- if (strlen (Text) > 255) {
- Fatal (FAT_STRING_TOO_LONG);
- }
- O = NewOption (Type);
- O->V.Str = xstrdup (Text);
+ NewOption (Type, GetStringId (Text));
}
void OptComment (const char* Comment)
/* Add a comment */
{
- OptStr (OPT_COMMENT, Comment);
+ NewOption (OPT_COMMENT, GetStringId (Comment));
}
void OptAuthor (const char* Author)
/* Add an author statement */
{
- OptStr (OPT_AUTHOR, Author);
+ NewOption (OPT_AUTHOR, GetStringId (Author));
}
void OptTranslator (const char* Translator)
/* Add a translator option */
{
- OptStr (OPT_TRANSLATOR, Translator);
+ NewOption (OPT_TRANSLATOR, GetStringId (Translator));
}
void OptCompiler (const char* Compiler)
/* Add a compiler option */
{
- OptStr (OPT_COMPILER, Compiler);
+ NewOption (OPT_COMPILER, GetStringId (Compiler));
}
void OptOS (const char* OS)
/* Add an operating system option */
{
- OptStr (OPT_OS, OS);
+ NewOption (OPT_OS, GetStringId (OS));
}
void OptDateTime (unsigned long DateTime)
/* Add a date/time option */
{
- Option* O = NewOption (OPT_DATETIME);
- O->V.Val = DateTime;
+ NewOption (OPT_DATETIME, DateTime);
}
O = OptRoot;
while (O) {
- /* Write the type of the option */
+ /* Write the type of the option, then the value */
ObjWrite8 (O->Type);
-
- /* Write the argument */
- switch (O->Type & OPT_ARGMASK) {
-
- case OPT_ARGSTR:
- ObjWriteStr (O->V.Str);
- break;
-
- case OPT_ARGNUM:
- ObjWrite32 (O->V.Val);
- break;
-
- default:
- Internal ("Invalid option type: $%02X", O->Type & 0xFF);
-
- }
+ ObjWriteVar (O->Val);
/* Next option */
O = O->Next;
/* */
/* */
/* */
-/* (C) 1998 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@musoftware.de */
+/* (C) 1998-2003 Ullrich von Bassewitz */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* Structure to encode options */
-typedef struct Option_ Option;
-struct Option_ {
- Option* Next; /* For list of options */
+typedef struct Option Option;
+struct Option {
+ Option* Next; /* For list of options */
unsigned char Type; /* Type of option */
- union {
- const char* Str; /* String attribute */
- unsigned long Val; /* Value attribute */
- } V;
+ unsigned long Val; /* Value attribute or string index */
};
/* Read and print all options */
for (I = 0; I < Count; ++I) {
- unsigned long ArgNum;
- char* ArgStr;
- unsigned ArgLen;
+ const char* ArgStr;
+ unsigned ArgLen;
- /* Read the type of the option */
- unsigned char Type = Read8 (F);
+ /* Read the type of the option and the value */
+ unsigned char Type = Read8 (F);
+ unsigned long Val = ReadVar (F);
/* Get the type of the argument */
- unsigned char ArgType = Type & OPT_ARGMASK;
+ unsigned char ArgType = Type & OPT_ARGMASK;
- /* Determine which option follows */
- const char* TypeDesc;
- switch (Type) {
+ /* Determine which option follows */
+ const char* TypeDesc;
+ switch (Type) {
case OPT_COMMENT: TypeDesc = "OPT_COMMENT"; break;
- case OPT_AUTHOR: TypeDesc = "OPT_AUTHOR"; break;
- case OPT_TRANSLATOR:TypeDesc = "OPT_TRANSLATOR"; break;
- case OPT_COMPILER: TypeDesc = "OPT_COMPILER"; break;
- case OPT_OS: TypeDesc = "OPT_OS"; break;
- case OPT_DATETIME: TypeDesc = "OPT_DATETIME"; break;
- default: TypeDesc = "OPT_UNKNOWN"; break;
- }
-
- /* Print the header */
- printf (" Index:%27u\n", I);
-
- /* Print the data */
- printf (" Type:%22s0x%02X (%s)\n", "", Type, TypeDesc);
- switch (ArgType) {
-
- case OPT_ARGSTR:
- ArgStr = ReadStr (F);
- ArgLen = strlen (ArgStr);
- printf (" Data:%*s\"%s\"\n", 24-ArgLen, "", ArgStr);
- xfree (ArgStr);
- break;
-
- case OPT_ARGNUM:
- ArgNum = Read32 (F);
- printf (" Data:%26lu", ArgNum);
- if (Type == OPT_DATETIME) {
- /* Print the time as a string */
- printf (" (%s)", TimeToStr (ArgNum));
- }
+ case OPT_AUTHOR: TypeDesc = "OPT_AUTHOR"; break;
+ case OPT_TRANSLATOR:TypeDesc = "OPT_TRANSLATOR"; break;
+ case OPT_COMPILER: TypeDesc = "OPT_COMPILER"; break;
+ case OPT_OS: TypeDesc = "OPT_OS"; break;
+ case OPT_DATETIME: TypeDesc = "OPT_DATETIME"; break;
+ default: TypeDesc = "OPT_UNKNOWN"; break;
+ }
+
+ /* Print the header */
+ printf (" Index:%27u\n", I);
+
+ /* Print the data */
+ printf (" Type:%22s0x%02X (%s)\n", "", Type, TypeDesc);
+ switch (ArgType) {
+
+ case OPT_ARGSTR:
+ ArgStr = GetString (&StrPool, Val);
+ ArgLen = strlen (ArgStr);
+ printf (" Data:%*s\"%s\"\n", 24-ArgLen, "", ArgStr);
+ break;
+
+ case OPT_ARGNUM:
+ printf (" Data:%26lu", Val);
+ if (Type == OPT_DATETIME) {
+ /* Print the time as a string */
+ printf (" (%s)", TimeToStr (Val));
+ }
printf ("\n");
break;
/* Read and print all segments */
for (I = 0; I < Count; ++I) {
-
+
/* Read the data for one segments */
char* Name = ReadStr (F);
unsigned Len = strlen (Name);