]> git.sur5r.net Git - cc65/commitdiff
Encode option strings in the string pool
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 25 May 2003 21:06:57 +0000 (21:06 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 25 May 2003 21:06:57 +0000 (21:06 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2170 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/options.c
src/common/optdefs.h
src/od65/dump.c

index 31e37421e22cfd65d86d3ee6b70e06c22adabb84..fc41ad157ddecd41592107a7c6f21bc905bfa13c 100644 (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;
index b256147e9ff79b16568cac2f3751304ae3b707eb..3fc525cc247329d1914f77e411c31a396b8276ae 100644 (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       */
 
 
 /* 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 */
 };
 
 
index 366ca82c5ce197104d358e44bdb9b130b7c21925..48c910ccc4b59204768b3a019d84455be6178c67 100644 (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;
-       }
-
-       /* 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);