1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-20 05:29:39 +00:00

Encode option strings in the string pool

git-svn-id: svn://svn.cc65.org/cc65/trunk@2170 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-05-25 21:06:57 +00:00
parent 76e67e2f97
commit 1ccb54d58d
3 changed files with 53 additions and 80 deletions

View File

@ -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;

View File

@ -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 */
};

View File

@ -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;
}
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 header */
printf (" Index:%27u\n", I);
/* Print the data */
printf (" Type:%22s0x%02X (%s)\n", "", Type, TypeDesc);
switch (ArgType) {
/* 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_ARGSTR:
ArgStr = GetString (&StrPool, Val);
ArgLen = strlen (ArgStr);
printf (" Data:%*s\"%s\"\n", 24-ArgLen, "", 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_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);