]> git.sur5r.net Git - cc65/commitdiff
Replace single linked list of sections in a segment by a collection.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 18 Aug 2011 11:58:16 +0000 (11:58 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 18 Aug 2011 11:58:16 +0000 (11:58 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5208 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/segments.c
src/ld65/segments.h

index a097d9d0351fd0de053e2bdd927fd60530b3af5a..84c80d0850fad49cb9382d92f27e72e47fa81195 100644 (file)
@@ -92,8 +92,7 @@ static Segment* NewSegment (unsigned Name, unsigned char AddrSize)
     /* Initialize the fields */
     S->Name        = Name;
     S->Next       = 0;
-    S->SecRoot    = 0;
-    S->SecLast    = 0;
+    S->Sections    = EmptyCollection;
     S->PC         = 0;
     S->Size               = 0;
     S->AlignObj           = 0;
@@ -183,13 +182,7 @@ Section* NewSection (Segment* Seg, unsigned char Align, unsigned char AddrSize)
     S->Offs    = Seg->Size;    /* Current size is offset */
 
     /* Insert the section into the segment */
-    if (Seg->SecRoot == 0) {
-       /* First section in this segment */
-               Seg->SecRoot = S;
-    } else {
-       Seg->SecLast->Next = S;
-    }
-    Seg->SecLast = S;
+    CollAppend (&Seg->Sections, S);
 
     /* Return the struct */
     return S;
@@ -311,8 +304,12 @@ int IsBSSType (Segment* S)
  */
 {
     /* Loop over all sections */
-    Section* Sec = S->SecRoot;
-    while (Sec) {
+    unsigned I;
+    for (I = 0; I < CollCount (&S->Sections); ++I) {
+
+        /* Get the next section */
+        Section* Sec = CollAtUnchecked (&S->Sections, I);
+
        /* Loop over all fragments */
        Fragment* F = Sec->FragRoot;
        while (F) {
@@ -331,7 +328,6 @@ int IsBSSType (Segment* S)
            }
            F = F->Next;
        }
-       Sec = Sec->Next;
     }
     return 1;
 }
@@ -341,15 +337,15 @@ int IsBSSType (Segment* S)
 void SegDump (void)
 /* Dump the segments and it's contents */
 {
-    unsigned I;
+    unsigned I, J;
     unsigned long Count;
     unsigned char* Data;
 
     for (I = 0; I < CollCount (&SegmentList); ++I) {
-        const Segment* Seg = CollConstAt (&SegmentList, I);
-       Section* S = Seg->SecRoot;
+        Segment* Seg = CollAtUnchecked (&SegmentList, I);
                printf ("Segment: %s (%lu)\n", GetString (Seg->Name), Seg->Size);
-       while (S) {
+        for (J = 0; J < CollCount (&Seg->Sections); ++J) {
+            Section* S = CollAtUnchecked (&Seg->Sections, J);
             unsigned J;
            Fragment* F = S->FragRoot;
            printf ("  Section:\n");
@@ -393,7 +389,6 @@ void SegDump (void)
                }
                F = F->Next;
            }
-           S = S->Next;
        }
     }
 }
@@ -449,7 +444,7 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void*
  * called (see description of SegWriteFunc above).
  */
 {
-    Section*      Sec;
+    unsigned      I;
     int           Sign;
     unsigned long Offs = 0;
 
@@ -459,8 +454,8 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void*
     S->OutputOffs = (unsigned long) ftell (Tgt);
 
     /* Loop over all sections in this segment */
-    Sec = S->SecRoot;
-    while (Sec) {
+    for (I = 0; I < CollCount (&S->Sections); ++I) {
+        Section* Sec = CollAtUnchecked (&S->Sections, I);
        Fragment* Frag;
 
         /* Output were this section is from */
@@ -535,9 +530,6 @@ void SegWrite (const char* TgtName, FILE* Tgt, Segment* S, SegWriteFunc F, void*
            /* Next fragment */
            Frag = Frag->Next;
        }
-
-       /* Next section */
-       Sec = Sec->Next;
     }
 }
 
index 32d7ab114643113dd41b34998ac13bb8d4be25c5..40b06a9619d95fe596d2938ccc9f96a4cde33f42 100644 (file)
@@ -40,7 +40,8 @@
 
 #include <stdio.h>
 
-/* common */
+/* common */  
+#include "coll.h"
 #include "exprdefs.h"
 
 
@@ -56,9 +57,8 @@ typedef struct Segment Segment;
 struct Segment {
     unsigned            Name;           /* Name index of the segment */
     unsigned            Id;             /* Segment id for debug info */
-    Segment*           Next;           /* Hash list */
-    struct Section*    SecRoot;        /* Section list */
-    struct Section*    SecLast;        /* Pointer to last section */
+    Segment*           Next;           /* Hash list */
+    Collection          Sections;       /* Sections in this segment */
     unsigned long      PC;             /* PC were this segment is located */
     unsigned long      Size;           /* Size of data so far */
     struct ObjData*    AlignObj;       /* Module that requested the alignment */