]> git.sur5r.net Git - cc65/commitdiff
Added a method to write variable sized unsigned values. Use this method for
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 2 Aug 2000 13:23:06 +0000 (13:23 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 2 Aug 2000 13:23:06 +0000 (13:23 +0000)
all sorts of things in the object files. This does not only make the object
files smaller, but does also remove several limits (strings may be longer
than 255 bytes, several counters no longer have 8 or 16 bit limits).

git-svn-id: svn://svn.cc65.org/cc65/trunk@260 b7a2c559-68d2-44c3-8de9-860c34a00d81

29 files changed:
src/ar65/exports.c
src/ar65/fileio.c
src/ar65/fileio.h
src/ar65/library.c
src/ar65/objdata.c
src/ca65/dbginfo.c
src/ca65/dbginfo.h
src/ca65/filetab.c
src/ca65/objcode.c
src/ca65/objfile.c
src/ca65/objfile.h
src/ca65/options.c
src/ca65/pseudo.c
src/ca65/symtab.c
src/common/filepos.h
src/common/segdefs.h
src/ld65/dbgsyms.c
src/ld65/dbgsyms.h
src/ld65/exports.c
src/ld65/exports.h
src/ld65/fileio.c
src/ld65/fileio.h
src/ld65/library.c
src/ld65/objdata.h
src/ld65/objfile.c
src/ld65/segments.c
src/od65/dump.c
src/od65/fileio.c
src/od65/fileio.h

index 01d8f0ded4629f39a6d658ddfdee35ade24aeb50..34d34227f47e9c007a9a9ffe14e6110d33ba41c3 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 #include <string.h>
 
-#include "../common/hashstr.h"
-#include "../common/xmalloc.h"
-
+/* common */
+#include "hashstr.h"
+#include "xmalloc.h"
+         
+/* ar65 */
 #include "error.h"
 #include "objdata.h"
 #include "exports.h"
@@ -112,7 +114,7 @@ void ExpInsert (const char* Name, unsigned Module)
            /* Duplicate entry */
            Warning ("External symbol `%s' in module `%s' is duplicated in "
                     "module `%s'",
-                    Name, GetObjName (L->Module), GetObjName (Module));
+                    Name, GetObjName (L->Module), GetObjName (Module));
        }
        if (L->Next == 0) {
            break;
@@ -147,4 +149,4 @@ int ExpFind (const char* Name)
 
 
 
-                   
+
index 9cf095bb78604dd320b2abf7707a437ee9305b33..730fc6332a568e24cf8025200d724d4406b843c7 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 #include <string.h>
 
-#include "../common/xmalloc.h"
+/* common */
+#include "xmalloc.h"
 
+/* ar65 */
 #include "error.h"
 #include "fileio.h"
 
@@ -78,14 +80,31 @@ void Write32 (FILE* F, unsigned long Val)
 
 
 
+void WriteVar (FILE* F, unsigned long V)
+/* Write a variable sized value to the file in special encoding */
+{
+    /* We will write the value to the file in 7 bit chunks. If the 8th bit
+     * is clear, we're done, if it is set, another chunk follows. This will
+     * allow us to encode smaller values with less bytes, at the expense of
+     * needing 5 bytes if a 32 bit value is written to file.
+     */
+    do {
+       unsigned char C = (V & 0x7F);
+       V >>= 7;
+       if (V) {
+           C |= 0x80;
+       }
+       Write8 (F, C);
+    } while (V != 0);
+}
+
+
+
 void WriteStr (FILE* F, const char* S)
 /* Write a string to the file */
 {
     unsigned Len = strlen (S);
-    if (Len > 255) {
-               Internal ("String too long");
-    }
-    Write8 (F, (unsigned char) Len);
+    WriteVar (F, Len);
     WriteData (F, S, Len);
 }
 
@@ -133,11 +152,35 @@ unsigned long Read32 (FILE* F)
 
 
 
+unsigned long ReadVar (FILE* F)
+/* Read a variable size value from the file */
+{
+    /* The value was written to the file in 7 bit chunks LSB first. If there
+     * are more bytes, bit 8 is set, otherwise it is clear.
+     */
+    unsigned char C;
+    unsigned long V = 0;
+    unsigned Shift = 0;
+    do {
+       /* Read one byte */
+       C = Read8 (F);
+       /* Encode it into the target value */
+       V |= ((unsigned long)(C & 0x7F)) << Shift;
+       /* Next value */
+       Shift += 7;
+    } while (C & 0x80);
+
+    /* Return the value read */
+    return V;
+}
+
+
+
 char* ReadStr (FILE* F)
 /* Read a string from the file (the memory will be malloc'ed) */
 {
-    /* Read the length byte */
-    unsigned Len = Read8 (F);
+    /* Read the length */
+    unsigned Len = ReadVar (F);
 
     /* Allocate memory and read the string itself */
     char* S = xmalloc (Len + 1);
index e38c46082e9f86a2a8379a19d4e700a1b1d23891..3a636e987d42e7ead7bc0aba5cfd855eceaa2742 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -57,6 +57,9 @@ void Write16 (FILE* F, unsigned Val);
 void Write32 (FILE* F, unsigned long Val);
 /* Write a 32 bit value to the file */
 
+void WriteVar (FILE* F, unsigned long V);
+/* Write a variable sized value to the file in special encoding */
+
 void WriteStr (FILE* F, const char* S);
 /* Write a string to the file */
 
@@ -72,6 +75,9 @@ unsigned Read16 (FILE* F);
 unsigned long Read32 (FILE* F);
 /* Read a 32 bit value from the file */
 
+unsigned long ReadVar (FILE* F);
+/* Read a variable size value from the file */
+
 char* ReadStr (FILE* F);
 /* Read a string from the file (the memory will be malloc'ed) */
 
index 4906f57d544ae98780adb6600b3f076a7b03727f..5c1ba063cd813e46018d7c0105584fe4b4408361 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #include <string.h>
 #include <errno.h>
 
-#include "../common/bitops.h"
-#include "../common/exprdefs.h"
-#include "../common/filepos.h"
-#include "../common/libdefs.h"
-#include "../common/symdefs.h"
-#include "../common/xmalloc.h"
+/* common */
+#include "bitops.h"
+#include "exprdefs.h"
+#include "filepos.h"
+#include "libdefs.h"
+#include "symdefs.h"
+#include "xmalloc.h"
 
+/* ar65 */
 #include "error.h"
 #include "global.h"
 #include "fileio.h"
@@ -303,6 +305,28 @@ void LibCopyFrom (unsigned long Pos, unsigned long Bytes, FILE* F)
 
 
 
+static unsigned long GetVar (unsigned char** Buf)
+/* Get a variable sized value from Buf */
+{
+    unsigned char C;
+    unsigned long V = 0;
+    unsigned Shift = 0;
+    do {
+       /* Read one byte */
+               C = **Buf;
+       ++(*Buf);
+       /* Add this char to the value */
+       V |= ((unsigned long)(C & 0x7F)) << Shift;
+       /* Next value */
+       Shift += 7;
+    } while (C & 0x80);
+
+    /* Return the result */
+    return V;
+}
+
+
+
 static void SkipExpr (unsigned char** Buf)
 /* Skip an expression in Buf */
 {
@@ -339,20 +363,26 @@ static void SkipExpr (unsigned char** Buf)
 
 
 
+static void SkipFilePos (unsigned char** Buf)
+/* Skip a file position in Buf */
+{
+    (void) GetVar (Buf);       /* Line */
+    (void) GetVar (Buf);       /* Col */
+    (void) GetVar (Buf);       /* Name */
+}
+
+
+
 static void LibCheckExports (ObjData* O)
 /* Insert all exports from the given object file into the global list
  * checking for duplicates.
  */
 {
-    char Name [256];
-
     /* Get a pointer to the buffer */
     unsigned char* Exports = O->Exports;
 
-    /* First two bytes are export count */
-    unsigned Lo = *Exports++;
-    unsigned Hi = *Exports++;
-    unsigned Count = (Hi << 8) + Lo;
+    /* Get the export count */
+    unsigned Count = GetVar (&Exports);
 
     /* Read the exports */
     if (Verbose > 1) {
@@ -360,13 +390,12 @@ static void LibCheckExports (ObjData* O)
     }
     while (Count--) {
 
-       unsigned char Len;
-
        /* Get the export tag */
        unsigned char Tag = *Exports++;
 
                /* Next thing is name of symbol */
-       Len = *Exports++;
+       unsigned Len = GetVar (&Exports);
+       char* Name = xmalloc (Len + 1);
        memcpy (Name, Exports, Len);
        Name [Len] = '\0';
        Exports += Len;
@@ -381,13 +410,16 @@ static void LibCheckExports (ObjData* O)
        }
 
        /* Skip the position */
-       Exports += POS_SIZE;
+               SkipFilePos (&Exports);
 
        /* Insert the name into the hash table */
        if (Verbose > 1) {
                printf ("  %s\n", Name);
        }
        ExpInsert (Name, O->Index);
+
+       /* Free the name */
+       xfree (Name);
     }
 }
 
index 5c979e8f54582a00b73c014f7cd0c0561a91259b..6b42f33a809c7ccb77dda5818051bf406199e5e6 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -38,7 +38,7 @@
 /* common */
 #include "check.h"
 #include "xmalloc.h"
-                 
+
 /* ar65 */
 #include "error.h"
 #include "objdata.h"
@@ -189,7 +189,7 @@ void MakeObjPool (void)
 
        /* Set the pool pointer */
        ObjPool [Index] = O;
-
+                                                                            
        /* Next object */
        ++Index;
        O = O->Next;
index ef1cd97525f8377f0d665e59c7fc91cb4e099954..33362aca3682a7cf403b79e2db9486646ea100ac 100644 (file)
@@ -81,3 +81,19 @@ void DbgInfoFile (void)
 
 
 
+void DbgInfoLine (void)
+/* Parse and handle LINE subcommand of the .dbg pseudo instruction */
+{
+    ErrorSkip (ERR_NOT_IMPLEMENTED);
+}
+
+
+
+void DbgInfoSym (void)
+/* Parse and handle SYM subcommand of the .dbg pseudo instruction */
+{
+    ErrorSkip (ERR_NOT_IMPLEMENTED);
+}
+
+
+
index 7d236e1c36c58b1df54da4d9ebb7a36e33a7005b..77e21cdfd5f5a74b49f60763cb81d525c395c03a 100644 (file)
 
 
 void DbgInfoFile (void);
-/* Parse and handle the .REPEAT statement */
+/* Parse and handle FILE subcommand of the .dbg pseudo instruction */
+
+void DbgInfoLine (void);
+/* Parse and handle LINE subcommand of the .dbg pseudo instruction */
+
+void DbgInfoSym (void);
+/* Parse and handle SYM subcommand of the .dbg pseudo instruction */
 
 
 
@@ -56,4 +62,4 @@ void DbgInfoFile (void);
 
 
 
-              
+
index c65c833ce0cf3dc11b525572f1dfc4754ccc61e8..5b31fff3dc8475bc7fcdadc6789cdf18bb5498b3 100644 (file)
@@ -119,7 +119,7 @@ void WriteFiles (void)
     ObjStartFiles ();
 
     /* Write the file count */
-    ObjWrite16 (FileCount);
+    ObjWriteVar (FileCount);
 
     /* Write the file data */
     for (I = 0; I < FileCount; ++I) {
index 5ad68f41eccf77cd21e512e1398e24464f86d550..b1ae6f84159c868c9c94f85cbf7f98e2eb2833c7 100644 (file)
@@ -486,19 +486,8 @@ static void WriteOneSeg (Segment* Seg)
                    Size += F->Len;
                    F = F->Next;
                }
-               if (Size < 0x100) {
-                   ObjWrite8 (FRAG_LITERAL8);
-                   ObjWrite8 (Size);
-               } else if (Size < 0x10000) {
-                   ObjWrite8 (FRAG_LITERAL16);
-                   ObjWrite16 (Size);
-               } else if (Size < 0x1000000) {
-                   ObjWrite8 (FRAG_LITERAL24);
-                   ObjWrite24 (Size);
-               } else {
-                   ObjWrite8 (FRAG_LITERAL32);
-                   ObjWrite32 (Size);
-               }
+               ObjWrite8 (FRAG_LITERAL);
+               ObjWriteVar (Size);
 
                /* Now write the literal data */
                F = Frag;
@@ -533,7 +522,7 @@ static void WriteOneSeg (Segment* Seg)
 
            case FRAG_FILL:
                ObjWrite8 (FRAG_FILL);
-               ObjWrite16 (Frag->Len);
+                       ObjWriteVar (Frag->Len);
                break;
 
            default:
@@ -560,7 +549,7 @@ void WriteSegments (void)
     ObjStartSegments ();
 
     /* First thing is segment count */
-    ObjWrite8 (SegmentCount);
+    ObjWriteVar (SegmentCount);
 
     /* Now walk through all segments and write them to the object file */
     Seg = SegmentList;
@@ -578,7 +567,7 @@ void WriteSegments (void)
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                          Code                                    */
 /*****************************************************************************/
 
 
index 5308580dd68e7da03c2f0284022b3bfc57fe73bb..30f6c2c8795a3e0a8f69e78acb120466d65efe86 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -41,7 +41,7 @@
 /* common */
 #include "fname.h"
 #include "objdefs.h"
-         
+
 /* ca65 */
 #include "global.h"
 #include "error.h"
@@ -210,19 +210,36 @@ void ObjWrite32 (unsigned long V)
 
 
 
+void ObjWriteVar (unsigned long V)
+/* Write a variable sized value to the file in special encoding */
+{
+    /* We will write the value to the file in 7 bit chunks. If the 8th bit
+     * is clear, we're done, if it is set, another chunk follows. This will
+     * allow us to encode smaller values with less bytes, at the expense of
+     * needing 5 bytes if a 32 bit value is written to file.
+     */
+    do {
+       unsigned char C = (V & 0x7F);
+       V >>= 7;
+       if (V) {
+           C |= 0x80;
+       }
+       ObjWrite8 (C);
+    } while (V != 0);
+}
+
+
+
 void ObjWriteStr (const char* S)
 /* Write a string to the object file */
 {
     unsigned Len = strlen (S);
-    if (Len > 255) {
-       Internal ("String too long in ObjWriteStr");
-    }
 
-    /* Write the string with a length byte preceeded (this is easier for
+    /* Write the string with the length preceeded (this is easier for
      * the reading routine than the C format since the length is known in
      * advance).
      */
-    ObjWrite8 ((unsigned char) Len);
+    ObjWriteVar (Len);
     ObjWriteData (S, Len);
 }
 
@@ -241,15 +258,15 @@ void ObjWriteData (const void* Data, unsigned Size)
 void ObjWritePos (const FilePos* Pos)
 /* Write a file position to the object file */
 {
-    /* Write the line number as 24 bit value to save one byte */
-    ObjWrite24 (Pos->Line);
-    ObjWrite (Pos->Col);
+    /* Write the data entries */
+    ObjWriteVar (Pos->Line);
+    ObjWriteVar (Pos->Col);
     if (Pos->Name == 0) {
-       /* Position is outside file scope, use the main file instead */
-       ObjWrite8 (0);
+       /* Position is outside file scope, use the main file instead */
+       ObjWriteVar (0);
     } else {
-        ObjWrite (Pos->Name - 1);
-    }
+        ObjWriteVar (Pos->Name - 1);
+    }             
 }
 
 
index 364cab97fa369613a56f87e8be7de03de21dee86..cf726e81db527714c71b62c49592642483d2b860 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -38,7 +38,8 @@
 
 
 
-#include "../common/filepos.h"
+/* common */
+#include "filepos.h"
 
 
 
@@ -65,6 +66,9 @@ void ObjWrite24 (unsigned long V);
 
 void ObjWrite32 (unsigned long V);
 /* Write a 32 bit value to the file */
+         
+void ObjWriteVar (unsigned long V);
+/* Write a variable sized value to the file in special encoding */
 
 void ObjWriteStr (const char* S);
 /* Write a string to the object file */
index 0af381818b0a76c734cd2efcc7584956fa804019..ed1bd2405c96794aac3064bb5ade4b7101eb6fe9 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 
 
-#include "../common/optdefs.h"
-#include "../common/xmalloc.h"
+/* common */
+#include "optdefs.h"
+#include "xmalloc.h"
 
+/* ca65 */
 #include "error.h"
 #include "objfile.h"
 #include "options.h"
@@ -164,7 +166,7 @@ void WriteOptions (void)
     ObjStartOptions ();
 
     /* Write the option count */
-    ObjWrite16 (OptCount);
+    ObjWriteVar (OptCount);
 
     /* Walk through the list and write the options */
     O = OptRoot;
index 94a5c3e4c7600679cd523fdb49a4e8bf5161d46a..d5e76901f335d8b12f5706043cfdf87962cc19cd 100644 (file)
@@ -370,14 +370,15 @@ static void DoDbg (void)
 
     /* Skip the subkey */
     NextTok ();
-           
+
     /* Parameters are separated by a comma */
     ConsumeComma ();
 
     /* Check the key and dispatch to a handler */
     switch (Key) {
        case 0:     DbgInfoFile ();             break;
-       case 1:
+       case 1:     DbgInfoLine ();             break;
+       case 2:     DbgInfoSym ();              break;
        default:    ErrorSkip (ERR_SYNTAX);     break;
     }
 }
index 027f715ddf224f7b811d34bd944719d0dcf3a6dc..23ce5d1217166b04537db3c0a07fb1964c754c0f 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -978,12 +978,12 @@ void WriteImports (void)
 /* Write the imports list to the object file */
 {
     SymEntry* S;
-
+                  
     /* Tell the object file module that we're about to start the imports */
     ObjStartImports ();
 
     /* Write the import count to the list */
-    ObjWrite16 (ImportCount);
+    ObjWriteVar (ImportCount);
 
     /* Walk throught list and write all imports to the file */
     S = SymList;
@@ -1015,7 +1015,7 @@ void WriteExports (void)
     ObjStartExports ();
 
     /* Write the export count to the list */
-    ObjWrite16 (ExportCount);
+    ObjWriteVar (ExportCount);
 
     /* Walk throught list and write all exports to the file */
     S = SymList;
@@ -1076,13 +1076,8 @@ void WriteDbgSyms (void)
            S = S->List;
        }
 
-       /* Safety check */
-       if (Count > 0xFFFF) {
-           Fatal (FAT_TOO_MANY_SYMBOLS);
-       }
-
        /* Write the symbol count to the list */
-       ObjWrite16 (Count);
+               ObjWriteVar (Count);
 
                /* Walk through list and write all symbols to the file */
        S = SymList;
@@ -1118,7 +1113,7 @@ void WriteDbgSyms (void)
     } else {
 
        /* No debug symbols */
-       ObjWrite16 (0);
+       ObjWriteVar (0);
 
     }
 
index 8378fd4b84f626f12e90d3d3584dcbeb0ef0d07b..fc938c6747af1dfc5d7c869036b7e311a57c737c 100644 (file)
 
 
 
-/* Size of position in file */
-#define POS_SIZE       5
-
 /* Type of a file position */
 typedef struct FilePos_ FilePos;
 struct FilePos_ {
     unsigned long   Line;              /* Line */
-    unsigned char   Col;               /* Column */
-    unsigned char   Name;              /* File */
+    unsigned       Col;                /* Column */
+    unsigned       Name;               /* File */
 };
 
 
index 5da311bccf126dc1c6e39685add289b1baca3dd3..0a0b8c0655da077cb10398616a212109d65401a6 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #define FRAG_BYTEMASK   0x07           /* Mask for byte count */
 
 #define FRAG_LITERAL   0x00            /* Literal data */
-#define FRAG_LITERAL8          0x01            /* Literal data with 8 bit length */
-#define FRAG_LITERAL16 0x02            /* Literal data with 16 bit length */
-#define FRAG_LITERAL24 0x03            /* Literal data with 24 bit length */
-#define FRAG_LITERAL32  0x04           /* Literal data with 32 bit length */
 
 #define FRAG_EXPR      0x08            /* Expression */
 #define FRAG_EXPR8             0x09            /* 8 bit expression */
index 911dedab9239d518311446ba321f550fb14a6651..5c649ce766577189c6e509fdda19760ca843a9ee 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -39,7 +39,7 @@
 #include "check.h"
 #include "symdefs.h"
 #include "xmalloc.h"
-         
+
 /* ld65 */
 #include "global.h"
 #include "error.h"
@@ -69,14 +69,11 @@ static DbgSym*      DbgSymPool [256];
 
 
 
-static DbgSym* NewDbgSym (unsigned char Type, const char* Name, ObjData* O)
+static DbgSym* NewDbgSym (unsigned char Type, ObjData* O)
 /* Create a new DbgSym and return it */
 {
-    /* Get the length of the symbol name */
-    unsigned Len = strlen (Name);
-
     /* Allocate memory */
-    DbgSym* D = xmalloc (sizeof (DbgSym) + Len);
+    DbgSym* D = xmalloc (sizeof (DbgSym));
 
     /* Initialize the fields */
     D->Next     = 0;
@@ -84,8 +81,7 @@ static DbgSym* NewDbgSym (unsigned char Type, const char* Name, ObjData* O)
     D->Obj      = O;
     D->Expr            = 0;
     D->Type            = Type;
-    memcpy (D->Name, Name, Len);
-    D->Name [Len] = '\0';
+    D->Name    = 0;
 
     /* Return the new entry */
     return D;
@@ -143,17 +139,16 @@ DbgSym* ReadDbgSym (FILE* F, ObjData* O)
 /* Read a debug symbol from a file, insert and return it */
 {
     unsigned char Type;
-    char Name [256];
     DbgSym* D;
 
     /* Read the type */
     Type = Read8 (F);
 
-    /* Read the name */
-    ReadStr (F, Name);
+    /* Create a new debug symbol */
+    D = NewDbgSym (Type, O);
 
-    /* Create a new export */
-    D = NewDbgSym (Type, Name, O);
+    /* Read and assign the name */
+    D->Name = ReadStr (F);
 
     /* Read the value */
     if (Type & EXP_EXPR) {
index a8dc29d29bd31c0a6231009afedad72d2da53efe..1c65a5501b71b2589834504f0d53db5afe5d60df 100644 (file)
 
 #include <stdio.h>
 
-#include "../common/exprdefs.h"
-#include "../common/filepos.h"
-
+/* common */
+#include "exprdefs.h"
+#include "filepos.h"
+         
+/* ld65 */
 #include "objdata.h"
 
 
@@ -62,7 +64,7 @@ struct DbgSym_ {
     FilePos                    Pos;            /* File position of definition */
     ExprNode*                  Expr;           /* Expression (0 if not def'd) */
     unsigned char      Type;           /* Type of symbol */
-    char                       Name [1];       /* Name - dynamically allocated */
+    char*                      Name;           /* Name - dynamically allocated */
 };
 
 
@@ -90,3 +92,4 @@ void PrintDbgSymLabels (ObjData* O, FILE* F);
 
 
 
+                               
index 93681465b4e9e9acef9bc828671bb643e0b4f406..8f0427a6d145232b3320845ebe18273df8a416d7 100644 (file)
@@ -42,7 +42,7 @@
 #include "hashstr.h"
 #include "symdefs.h"
 #include "xmalloc.h"
-         
+
 /* ld65 */
 #include "global.h"
 #include "error.h"
@@ -175,7 +175,7 @@ Import* ReadImport (FILE* F, ObjData* Obj)
     I = NewImport (Type, Obj);
 
     /* Read the name */
-    I->V.Name = ReadMallocedStr (F);
+    I->V.Name = ReadStr (F);
 
     /* Read the file position */
     ReadFilePos (F, &I->Pos);
@@ -195,22 +195,23 @@ Import* ReadImport (FILE* F, ObjData* Obj)
 static Export* NewExport (unsigned char Type, const char* Name, ObjData* Obj)
 /* Create a new export and initialize it */
 {
-    /* Get the length of the symbol name */
-    unsigned Len = strlen (Name);
-
     /* Allocate memory */
-    Export* E = xmalloc (sizeof (Export) + Len);
+    Export* E = xmalloc (sizeof (Export));
 
     /* Initialize the fields */
     E->Next     = 0;
-    E->Flags   = 0;
+    E->Flags   = 0;
     E->Obj      = Obj;
     E->ImpCount = 0;
     E->ImpList  = 0;
     E->Expr            = 0;
     E->Type            = Type;
-    memcpy (E->Name, Name, Len);
-    E->Name [Len] = '\0';
+    if (Name) {
+        E->Name = xstrdup (Name);
+    } else {
+       /* Name will get added later */
+       E->Name = 0;
+    }
 
     /* Return the new entry */
     return E;
@@ -250,7 +251,7 @@ void InsertExport (Export* E)
                    if (Last) {
                        Last->Next = E;
                    } else {
-                       HashTab [HashVal] = E;
+                       HashTab [HashVal] = E;
                    }
                            ImpOpen -= E->ImpCount;     /* Decrease open imports now */
                    xfree (L);
@@ -285,17 +286,16 @@ Export* ReadExport (FILE* F, ObjData* O)
 /* Read an export from a file */
 {
     unsigned char Type;
-    char Name [256];
     Export* E;
 
     /* Read the type */
     Type = Read8 (F);
 
-    /* Read the name */
-    ReadStr (F, Name);
+    /* Create a new export without a name */
+    E = NewExport (Type, 0, O);
 
-    /* Create a new export */
-    E = NewExport (Type, Name, O);
+    /* Read the name */
+    E->Name = ReadStr (F);
 
     /* Read the value */
     if (Type & EXP_EXPR) {
index 46a9646b0e30a95cdce2e09492a1552ef6cfebcc..075c5ca489029429cf233b68df5c0af9d2f11610 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 #include <stdio.h>
 
-#include "../common/exprdefs.h"
-#include "../common/filepos.h"
-
+/* common */
+#include "exprdefs.h"
+#include "filepos.h"
+         
+/* ld65 */
 #include "objdata.h"
 #include "config.h"
 
@@ -80,7 +82,7 @@ struct Export_ {
     FilePos            Pos;            /* File position of definition */
     ExprNode*                  Expr;           /* Expression (0 if not def'd) */
     unsigned char      Type;           /* Type of export */
-    char               Name [1];       /* Name - dynamically allocated */
+    char*                      Name;           /* Name - dynamically allocated */
 };
 
 
index de80d5facc478a1e96d164066e93fa4637e296b0..c13a202f264f18f56105d443f5e4c56a99454339 100644 (file)
 
 #include <string.h>
 
-#include "../common/xmalloc.h"
+/* common */
+#include "xmalloc.h"
 
+/* ld65 */
 #include "error.h"
 #include "fileio.h"
 
@@ -117,14 +119,31 @@ void WriteVal (FILE* F, unsigned long Val, unsigned Size)
 
 
 
+void WriteVar (FILE* F, unsigned long V)
+/* Write a variable sized value to the file in special encoding */
+{
+    /* We will write the value to the file in 7 bit chunks. If the 8th bit
+     * is clear, we're done, if it is set, another chunk follows. This will
+     * allow us to encode smaller values with less bytes, at the expense of
+     * needing 5 bytes if a 32 bit value is written to file.
+     */
+    do {
+       unsigned char C = (V & 0x7F);
+       V >>= 7;
+       if (V) {
+           C |= 0x80;
+       }
+       Write8 (F, C);
+    } while (V != 0);
+}
+
+
+
 void WriteStr (FILE* F, const char* S)
 /* Write a string to the file */
 {
     unsigned Len = strlen (S);
-    if (Len > 255) {
-               Internal ("String too long");
-    }
-    Write8 (F, (unsigned char) Len);
+    WriteVar (F, Len);
     WriteData (F, S, Len);
 }
 
@@ -210,37 +229,43 @@ long Read32Signed (FILE* F)
 
 
 
-char* ReadStr (FILE* F, char* Str)
-/* Read a string from the file. Str must hold 256 chars at max */
+unsigned long ReadVar (FILE* F)
+/* Read a variable size value from the file */
 {
-    /* Read the length byte */
-    unsigned Len = Read8 (F);
-
-    /* Read the string itself */
-    ReadData (F, Str, Len);
-
-    /* Terminate the string and return it */
-    Str [Len] = '\0';
-    return Str;
+    /* The value was written to the file in 7 bit chunks LSB first. If there
+     * are more bytes, bit 8 is set, otherwise it is clear.
+     */
+    unsigned char C;
+    unsigned long V = 0;
+    unsigned Shift = 0;
+    do {
+       /* Read one byte */
+       C = Read8 (F);
+       /* Encode it into the target value */
+       V |= ((unsigned long)(C & 0x7F)) << Shift;
+       /* Next value */
+       Shift += 7;
+    } while (C & 0x80);
+
+    /* Return the value read */
+    return V;
 }
 
 
 
-char* ReadMallocedStr (FILE* F)
-/* Read a string from the file into a malloced area */
+char* ReadStr (FILE* F)
+/* Read a string from the file (the memory will be malloc'ed) */
 {
-    /* Read the length byte */
-    unsigned Len = Read8 (F);
+    /* Read the length */
+    unsigned Len = ReadVar (F);
 
-    /* Allocate memory */
-    char* Str = xmalloc (Len + 1);
-
-    /* Read the string itself */
-    ReadData (F, Str, Len);
+    /* Allocate memory and read the string itself */
+    char* S = xmalloc (Len + 1);
+    ReadData (F, S, Len);
 
     /* Terminate the string and return it */
-    Str [Len] = '\0';
-    return Str;
+    S [Len] = '\0';
+    return S;
 }
 
 
@@ -248,10 +273,10 @@ char* ReadMallocedStr (FILE* F)
 FilePos* ReadFilePos (FILE* F, FilePos* Pos)
 /* Read a file position from the file */
 {
-    /* The line number is encoded as 24 bit value to save some space */
-    Pos->Line =        Read24 (F);
-    Pos->Col  = Read8 (F);
-    Pos->Name = Read8 (F);
+    /* Read the data fields */
+    Pos->Line =        ReadVar (F);
+    Pos->Col  = ReadVar (F);
+    Pos->Name = ReadVar (F);
     return Pos;
 }
 
@@ -268,4 +293,4 @@ void* ReadData (FILE* F, void* Data, unsigned Size)
 
 
 
-                
+
index 44b3e789fe4a8fe56a6ced0ddecdab4d20a64153..3da7e86a3f224e4728544fd9e366b434e6a36640 100644 (file)
@@ -40,7 +40,8 @@
 
 #include <stdio.h>
 
-#include "../common/filepos.h"
+/* common */
+#include "filepos.h"
 
 
 
@@ -65,6 +66,9 @@ void Write32 (FILE* F, unsigned long Val);
 void WriteVal (FILE* F, unsigned long Val, unsigned Size);
 /* Write a value of the given size to the output file */
 
+void WriteVar (FILE* F, unsigned long V);
+/* Write a variable sized value to the file in special encoding */
+
 void WriteStr (FILE* F, const char* S);
 /* Write a string to the file */
 
@@ -89,10 +93,10 @@ unsigned long Read32 (FILE* F);
 long Read32Signed (FILE* F);
 /* Read a 32 bit value from the file. Sign extend the value. */
 
-char* ReadStr (FILE* F, char* Str);
-/* Read a string from the file. Str must hold 256 chars at max */
+unsigned long ReadVar (FILE* F);
+/* Read a variable size value from the file */
 
-char* ReadMallocedStr (FILE* F);
+char* ReadStr (FILE* F);
 /* Read a string from the file into a malloced area */
 
 FilePos* ReadFilePos (FILE* F, FilePos* Pos);
index b73e8015b351219a88118736f54cff8ac2f72283..4a9d8a7e71256eecc5632b38886db86a4b55e754 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                          */
 /*                                                                          */
 /*                                                                          */
-/* (C) 1998    Ullrich von Bassewitz                                        */
-/*             Wacholderweg 14                                              */
-/*             D-70597 Stuttgart                                            */
-/* EMail:      uz@musoftware.de                                             */
+/* (C) 1998-2000 Ullrich von Bassewitz                                      */
+/*              Wacholderweg 14                                             */
+/*              D-70597 Stuttgart                                           */
+/* EMail:       uz@musoftware.de                                            */
 /*                                                                          */
 /*                                                                          */
 /* This software is provided 'as-is', without any expressed or implied      */
 #include <string.h>
 #include <errno.h>
 
-#include "../common/exprdefs.h"
-#include "../common/filepos.h"
-#include "../common/libdefs.h"
-#include "../common/objdefs.h"
-#include "../common/symdefs.h"
-#include "../common/xmalloc.h"
+/* common */
+#include "exprdefs.h"
+#include "filepos.h"
+#include "libdefs.h"
+#include "objdefs.h"
+#include "symdefs.h"
+#include "xmalloc.h"
 
+/* ld65 */
 #include "error.h"
 #include "exports.h"
 #include "fileio.h"
@@ -54,7 +56,7 @@
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
@@ -111,7 +113,7 @@ static ObjData* ReadIndexEntry (void)
     ObjData* O = NewObjData ();
 
     /* Module name/flags/MTime/Start/Size */
-    O->Name    = ReadMallocedStr (Lib);
+    O->Name            = ReadStr (Lib);
     O->Flags   = Read16 (Lib);
     Read32 (Lib);                      /* Skip MTime */
     O->Start   = Read32 (Lib);
@@ -119,7 +121,7 @@ static ObjData* ReadIndexEntry (void)
 
     /* Skip the export size, then read the exports */
     Read16 (Lib);
-    O->ExportCount = Read16 (Lib);
+    O->ExportCount = ReadVar (Lib);
     O->Exports = xmalloc (O->ExportCount * sizeof (Export*));
     for (I = 0; I < O->ExportCount; ++I) {
        O->Exports [I] = ReadExport (Lib, O);
@@ -127,7 +129,7 @@ static ObjData* ReadIndexEntry (void)
 
     /* Skip the import size, then read the imports */
     Read16 (Lib);
-    O->ImportCount = Read16 (Lib);
+    O->ImportCount = ReadVar (Lib);
     O->Imports = xmalloc (O->ImportCount * sizeof (Import*));
     for (I = 0; I < O->ImportCount; ++I) {
        O->Imports [I] = ReadImport (Lib, O);
index 91d994a1d870214139e12fdb9e909599cb6bd942..5db0848d8e7ea5a362aa9f8cd8478a21b201059b 100644 (file)
@@ -38,7 +38,8 @@
 
 
 
-#include "../common/objdefs.h"
+/* common */
+#include "objdefs.h"
 
 
 
@@ -104,3 +105,4 @@ void FreeObjData (ObjData* O);
 
 
 
+         
index 6f38a038fcf07f572e0f73053e72ade11b2feed1..26d7132e77c371a6c256fdc4a846cd3aa3aafa11 100644 (file)
@@ -40,7 +40,7 @@
 
 /* common */
 #include "xmalloc.h"
-         
+
 /* ld65 */
 #include "dbgsyms.h"
 #include "error.h"
@@ -107,14 +107,14 @@ void ObjReadFiles (FILE* F, ObjData* O)
 {
     unsigned I;
 
-    O->FileCount  = Read16 (F);
+    O->FileCount  = ReadVar (F);
     O->Files      = xmalloc (O->FileCount * sizeof (char*));
     for (I = 0; I < O->FileCount; ++I) {
                /* Skip MTime and size */
                Read32 (F);
                Read32 (F);
                /* Read the filename */
-               O->Files [I] = ReadMallocedStr (F);
+               O->Files [I] = ReadStr (F);
     }
 }
 
@@ -125,7 +125,7 @@ void ObjReadImports (FILE* F, ObjData* O)
 {
     unsigned I;
 
-    O->ImportCount = Read16 (F);
+    O->ImportCount = ReadVar (F);
     O->Imports     = xmalloc (O->ImportCount * sizeof (Import*));
     for (I = 0; I < O->ImportCount; ++I) {
        O->Imports [I] = ReadImport (F, O);
@@ -140,7 +140,7 @@ void ObjReadExports (FILE* F, ObjData* O)
 {
     unsigned I;
 
-    O->ExportCount = Read16 (F);
+    O->ExportCount = ReadVar (F);
     O->Exports     = xmalloc (O->ExportCount * sizeof (Export*));
     for (I = 0; I < O->ExportCount; ++I) {
        O->Exports [I] = ReadExport (F, O);
@@ -155,7 +155,7 @@ void ObjReadDbgSyms (FILE* F, ObjData* O)
 {
     unsigned I;
 
-    O->DbgSymCount = Read16 (F);
+    O->DbgSymCount = ReadVar (F);
     O->DbgSyms    = xmalloc (O->DbgSymCount * sizeof (DbgSym*));
     for (I = 0; I < O->DbgSymCount; ++I) {
        O->DbgSyms [I] = ReadDbgSym (F, O);
@@ -169,7 +169,7 @@ void ObjReadSections (FILE* F, ObjData* O)
 {
     unsigned I;
 
-    O->SectionCount = Read8 (F);
+    O->SectionCount = ReadVar (F);
     O->Sections     = xmalloc (O->SectionCount * sizeof (Section*));
     for (I = 0; I < O->SectionCount; ++I) {
        O->Sections [I] = ReadSection (F, O);
@@ -226,3 +226,4 @@ void ObjAdd (FILE* Obj, const char* Name)
 
 
 
+                            
index 17976e52d804514084187442744e32bd99fc623b..7758358180228c2db2bb3f7f46e09f3ff1cc5c0b 100644 (file)
@@ -215,7 +215,7 @@ Section* ReadSection (FILE* F, ObjData* O)
 /* Read a section from a file */
 {
     unsigned HashVal;
-    char Name [256];
+    char* Name;
     unsigned long Size;
     unsigned char Align;
     unsigned char Type;
@@ -223,7 +223,7 @@ Section* ReadSection (FILE* F, ObjData* O)
     Section* Sec;
 
     /* Read the name */
-    ReadStr (F, Name);
+    Name = ReadStr (F);
 
     /* Read the size */
     Size = Read32 (F);
@@ -237,7 +237,7 @@ Section* ReadSection (FILE* F, ObjData* O)
     /* Print some data */
     if (Verbose > 1) {
                printf ("Module `%s': Found segment `%s', size = %lu, align = %u, type = %u\n",
-               O->Name, Name, Size, Align, Type);
+               O->Name, Name, Size, Align, Type);
     }
 
     /* Create a hash over the name and try to locate the segment in the table */
@@ -254,6 +254,9 @@ Section* ReadSection (FILE* F, ObjData* O)
        HashTab [HashVal] = S;
     }
 
+    /* We have the segment and don't need the name any longer */
+    xfree (Name);
+
     /* Allocate the section we will return later */
     Sec = NewSection (S, Align, Type);
 
@@ -281,20 +284,8 @@ Section* ReadSection (FILE* F, ObjData* O)
        /* Handle the different fragment types */
        switch (Type) {
 
-           case FRAG_LITERAL8:
-               Frag = NewFragment (FRAG_LITERAL, Read8 (F), Sec);
-               break;
-
-           case FRAG_LITERAL16:
-               Frag = NewFragment (FRAG_LITERAL, Read16 (F), Sec);
-               break;
-
-           case FRAG_LITERAL24:
-               Frag = NewFragment (FRAG_LITERAL, Read24 (F), Sec);
-               break;
-
-           case FRAG_LITERAL32:
-               Frag = NewFragment (FRAG_LITERAL, Read32 (F), Sec);
+           case FRAG_LITERAL:
+               Frag = NewFragment (Type, ReadVar (F), Sec);
                break;
 
            case FRAG_EXPR8:
@@ -310,7 +301,7 @@ Section* ReadSection (FILE* F, ObjData* O)
 
            case FRAG_FILL:
                /* Will allocate memory, but we don't care... */
-               Frag = NewFragment (FRAG_FILL, Read16 (F), Sec);
+               Frag = NewFragment (Type, ReadVar (F), Sec);
                break;
 
            default:
index 106f5c8a839ce31eae98e7e9538c1bd179b78abc..b9bf7f1224b3b647b662255b5b4be0ca9e6abfad 100644 (file)
@@ -143,20 +143,8 @@ static unsigned SkipFragment (FILE* F)
     /* Handle the different fragment types */
     switch (Type) {
 
-       case FRAG_LITERAL8:
-                   Size = Read8 (F);
-           break;
-
-       case FRAG_LITERAL16:
-           Size = Read16 (F);
-           break;
-
-       case FRAG_LITERAL24:
-           Size = Read24 (F);
-           break;
-
-       case FRAG_LITERAL32:
-           Size = Read32 (F);
+       case FRAG_LITERAL:
+                   Size = ReadVar (F);
            break;
 
        case FRAG_EXPR8:
@@ -171,7 +159,7 @@ static unsigned SkipFragment (FILE* F)
            break;
 
        case FRAG_FILL:
-           Size = Read16 (F);
+           Size = ReadVar (F);
            break;
 
        default:
@@ -277,7 +265,7 @@ void DumpObjOptions (FILE* F, unsigned long Offset)
     printf ("  Options:\n");
 
     /* Read the number of options and print it */
-    Count = Read16 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all options */
@@ -313,7 +301,7 @@ void DumpObjOptions (FILE* F, unsigned long Offset)
        switch (ArgType) {
 
            case OPT_ARGSTR:
-               ArgStr = ReadMallocedStr (F);
+               ArgStr = ReadStr (F);
                ArgLen = strlen (ArgStr);
                printf ("      Data:%*s\"%s\"\n", 24-ArgLen, "", ArgStr);
                xfree (ArgStr);
@@ -361,7 +349,7 @@ void DumpObjFiles (FILE* F, unsigned long Offset)
     printf ("  Files:\n");
 
     /* Read the number of files and print it */
-    Count = Read16 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all files */
@@ -370,7 +358,7 @@ void DumpObjFiles (FILE* F, unsigned long Offset)
        /* Read the data for one file */
        unsigned long MTime = Read32 (F);
        unsigned long Size  = Read32 (F);
-       char*         Name  = ReadMallocedStr (F);
+       char*         Name  = ReadStr (F);
        unsigned      Len   = strlen (Name);
 
        /* Print the header */
@@ -409,14 +397,14 @@ void DumpObjSegments (FILE* F, unsigned long Offset)
     printf ("  Segments:\n");
 
     /* Read the number of segments and print it */
-    Count = Read8 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all segments */
     for (I = 0; I < Count; ++I) {
 
        /* Read the data for one segments */
-       char*         Name  = ReadMallocedStr (F);
+       char*         Name  = ReadStr (F);
        unsigned      Len   = strlen (Name);
        unsigned long Size  = Read32 (F);
        unsigned      Align = (1U << Read8 (F));
@@ -484,7 +472,7 @@ void DumpObjImports (FILE* F, unsigned long Offset)
     printf ("  Imports:\n");
 
     /* Read the number of imports and print it */
-    Count = Read16 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all imports */
@@ -494,7 +482,7 @@ void DumpObjImports (FILE* F, unsigned long Offset)
 
                /* Read the data for one import */
                unsigned char Type  = Read8 (F);
-       char*         Name  = ReadMallocedStr (F);
+       char*         Name  = ReadStr (F);
        unsigned      Len   = strlen (Name);
        ReadFilePos (F, &Pos);
 
@@ -540,7 +528,7 @@ void DumpObjExports (FILE* F, unsigned long Offset)
     printf ("  Exports:\n");
 
     /* Read the number of exports and print it */
-    Count = Read16 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all exports */
@@ -552,7 +540,7 @@ void DumpObjExports (FILE* F, unsigned long Offset)
 
                /* Read the data for one export */
                unsigned char Type  = Read8 (F);
-       char*         Name  = ReadMallocedStr (F);
+       char*         Name  = ReadStr (F);
        unsigned      Len   = strlen (Name);
        if (Type & EXP_EXPR) {
            SkipExpr (F);
@@ -617,19 +605,19 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
     }
 
     /* Read the number of exports and print it */
-    Count = Read16 (F);
+    Count = ReadVar (F);
     printf ("    Count:%27u\n", Count);
 
     /* Read and print all debug symbols */
     for (I = 0; I < Count; ++I) {
 
        unsigned long   Value = 0;
-       int             HaveValue;
+       int             HaveValue;
        const char*     TypeDesc;
 
                /* Read the data for one symbol */
                unsigned char Type  = Read8 (F);
-       char*         Name  = ReadMallocedStr (F);
+       char*         Name  = ReadStr (F);
        unsigned      Len   = strlen (Name);
        if (Type & EXP_EXPR) {
            SkipExpr (F);
@@ -666,3 +654,4 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
 
 
 
+
index c8ccc773dc623f188ba86fe03dd567c041cf8303..f700f3186b9e0a77e97e6fd4e419313f64432d1d 100644 (file)
@@ -67,7 +67,7 @@ unsigned Read8 (FILE* F)
     int C = getc (F);
     if (C == EOF) {
        Error ("Read error (file corrupt?)");
-    }            
+    }
     return C;
 }
 
@@ -121,27 +121,35 @@ long Read32Signed (FILE* F)
 
 
 
-char* ReadStr (FILE* F, char* Str)
-/* Read a string from the file. Str must hold 256 chars at max */
+unsigned long ReadVar (FILE* F)
+/* Read a variable size value from the file */
 {
-    /* Read the length byte */
-    unsigned Len = Read8 (F);
-
-    /* Read the string itself */
-    ReadData (F, Str, Len);
-
-    /* Terminate the string and return it */
-    Str [Len] = '\0';
-    return Str;
+    /* The value was written to the file in 7 bit chunks LSB first. If there
+     * are more bytes, bit 8 is set, otherwise it is clear.
+     */
+    unsigned char C;
+    unsigned long V = 0;
+    unsigned Shift = 0;
+    do {
+       /* Read one byte */
+       C = Read8 (F);
+       /* Encode it into the target value */
+       V |= ((unsigned long)(C & 0x7F)) << Shift;
+       /* Next value */
+       Shift += 7;
+    } while (C & 0x80);
+
+    /* Return the value read */
+    return V;
 }
 
 
 
-char* ReadMallocedStr (FILE* F)
+char* ReadStr (FILE* F)
 /* Read a string from the file into a malloced area */
 {
-    /* Read the length byte */
-    unsigned Len = Read8 (F);
+    /* Read the length */
+    unsigned Len = ReadVar (F);
 
     /* Allocate memory */
     char* Str = xmalloc (Len + 1);
@@ -159,10 +167,10 @@ char* ReadMallocedStr (FILE* F)
 FilePos* ReadFilePos (FILE* F, FilePos* Pos)
 /* Read a file position from the file */
 {
-    /* The line number is encoded as 24 bit value to save some space */
-    Pos->Line =        Read24 (F);
-    Pos->Col  = Read8 (F);
-    Pos->Name = Read8 (F);
+    /* Read the data fields */
+    Pos->Line =        ReadVar (F);
+    Pos->Col  = ReadVar (F);
+    Pos->Name = ReadVar (F);
     return Pos;
 }
 
index 06d55fcfbbc2de7d22fdf66c8cf338d859a7ab91..862c9b2063342f35d14de8cec320ba3fcaefbf78 100644 (file)
@@ -70,10 +70,10 @@ unsigned long Read32 (FILE* F);
 long Read32Signed (FILE* F);
 /* Read a 32 bit value from the file. Sign extend the value. */
 
-char* ReadStr (FILE* F, char* Str);
-/* Read a string from the file. Str must hold 256 chars at max */
+unsigned long ReadVar (FILE* F);
+/* Read a variable size value from the file */
 
-char* ReadMallocedStr (FILE* F);
+char* ReadStr (FILE* F);
 /* Read a string from the file into a malloced area */
 
 FilePos* ReadFilePos (FILE* F, FilePos* Pos);