From 1ccb54d58d65da3cf8c4a28424d9114cd07690fb Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 25 May 2003 21:06:57 +0000 Subject: [PATCH] Encode option strings in the string pool git-svn-id: svn://svn.cc65.org/cc65/trunk@2170 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/options.c | 46 +++++++-------------------- src/common/optdefs.h | 19 +++++------ src/od65/dump.c | 76 +++++++++++++++++++++----------------------- 3 files changed, 57 insertions(+), 84 deletions(-) diff --git a/src/ca65/options.c b/src/ca65/options.c index 31e37421e..fc41ad157 100644 --- a/src/ca65/options.c +++ b/src/ca65/options.c @@ -43,6 +43,7 @@ #include "error.h" #include "objfile.h" #include "options.h" +#include "spool.h" @@ -65,7 +66,7 @@ static unsigned OptCount = 0; -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; @@ -76,7 +77,7 @@ static Option* NewOption (unsigned char Type) /* Initialize fields */ Opt->Next = 0; Opt->Type = Type; - Opt->V.Str = 0; + Opt->Val = Val; /* Insert it into the list */ if (OptRoot == 0) { @@ -98,14 +99,7 @@ static Option* NewOption (unsigned char Type) 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)); } @@ -113,7 +107,7 @@ void OptStr (unsigned char Type, const char* Text) void OptComment (const char* Comment) /* Add a comment */ { - OptStr (OPT_COMMENT, Comment); + NewOption (OPT_COMMENT, GetStringId (Comment)); } @@ -121,7 +115,7 @@ void OptComment (const char* Comment) void OptAuthor (const char* Author) /* Add an author statement */ { - OptStr (OPT_AUTHOR, Author); + NewOption (OPT_AUTHOR, GetStringId (Author)); } @@ -129,7 +123,7 @@ void OptAuthor (const char* Author) void OptTranslator (const char* Translator) /* Add a translator option */ { - OptStr (OPT_TRANSLATOR, Translator); + NewOption (OPT_TRANSLATOR, GetStringId (Translator)); } @@ -137,7 +131,7 @@ void OptTranslator (const char* Translator) void OptCompiler (const char* Compiler) /* Add a compiler option */ { - OptStr (OPT_COMPILER, Compiler); + NewOption (OPT_COMPILER, GetStringId (Compiler)); } @@ -145,7 +139,7 @@ void OptCompiler (const char* Compiler) void OptOS (const char* OS) /* Add an operating system option */ { - OptStr (OPT_OS, OS); + NewOption (OPT_OS, GetStringId (OS)); } @@ -153,8 +147,7 @@ void OptOS (const char* OS) void OptDateTime (unsigned long DateTime) /* Add a date/time option */ { - Option* O = NewOption (OPT_DATETIME); - O->V.Val = DateTime; + NewOption (OPT_DATETIME, DateTime); } @@ -174,24 +167,9 @@ void WriteOptions (void) 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; diff --git a/src/common/optdefs.h b/src/common/optdefs.h index b256147e9..3fc525cc2 100644 --- a/src/common/optdefs.h +++ b/src/common/optdefs.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (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 */ @@ -60,14 +60,11 @@ /* 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 */ }; diff --git a/src/od65/dump.c b/src/od65/dump.c index 366ca82c5..48c910ccc 100644 --- a/src/od65/dump.c +++ b/src/od65/dump.c @@ -370,49 +370,47 @@ void DumpObjOptions (FILE* F, unsigned long Offset) /* 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; @@ -513,7 +511,7 @@ void DumpObjSegments (FILE* F, unsigned long Offset) /* 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); -- 2.39.5