]> git.sur5r.net Git - cc65/commitdiff
Add an optional type to a span.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 Aug 2011 19:44:02 +0000 (19:44 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 Aug 2011 19:44:02 +0000 (19:44 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5253 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/span.c
src/ca65/span.h
src/ld65/span.c

index 2fa823a8ba686a6c313af21a95a2da1980f64f2c..217e27149a290920ad687ac0a1e04b33e8e931f1 100644 (file)
@@ -43,6 +43,7 @@
 #include "objfile.h"
 #include "segment.h"
 #include "span.h"
+#include "spool.h"
 
 
 
@@ -155,7 +156,7 @@ static Span* NewSpan (Segment* Seg, unsigned long Start, unsigned long End)
     S->Seg      = Seg;
     S->Start    = Start;
     S->End      = End;
-    S->Type     = 0;
+    S->Type     = EMPTY_STRING_ID;
 
     /* Return the new struct */
     return S;
@@ -183,9 +184,11 @@ static Span* MergeSpan (Span* S)
     Span* E = HT_Find (&SpanTab, S);
     if (E) {
         /* If S has a type and E not, move the type */
-        CHECK (E->Type == 0);
-        E->Type = S->Type;
-        S->Type = 0;
+        if (S->Type != EMPTY_STRING_ID) {
+            CHECK (E->Type == EMPTY_STRING_ID);
+            E->Type = S->Type;
+        }
+
         /* Free S and return E */
         FreeSpan (S);
         return E;
@@ -199,6 +202,14 @@ static Span* MergeSpan (Span* S)
 
 
 
+void SetSpanType (Span* S, const StrBuf* Type)
+/* Set the generic type of the span to Type */
+{
+    S->Type = GetStrBufId (Type);
+}
+
+
+
 Span* OpenSpan (void)
 /* Open a span for the active segment and return it. */
 {
@@ -377,6 +388,7 @@ void WriteSpans (void)
             ObjWriteVar (S->Seg->Num);
             ObjWriteVar (S->Start);
             ObjWriteVar (S->End - S->Start);
+            ObjWriteVar (S->Type);
         }
 
         /* Free the collection with the spans */
index a1b85b2dc2175c261d8ad4107cf5f63782ea6e9a..621267ad3afe265c58a9cb6b482b9481d5938289 100644 (file)
@@ -43,6 +43,7 @@
 #include "gentype.h"
 #include "hashtab.h"
 #include "inline.h"
+#include "strbuf.h"
 
 
 
@@ -84,6 +85,9 @@ INLINE unsigned long GetSpanSize (const Span* R)
 #  define GetSpanSize(R)   ((R)->End - (R)->Start)
 #endif
 
+void SetSpanType (Span* S, const StrBuf* Type);
+/* Set the generic type of the span to Type */
+
 Span* OpenSpan (void);
 /* Open a span for the active segment and return it. */
 
index da8cd83dd609bd02e5d8578a12f7084e4f126047..03765b97e5183ff532e76efa7e7ecf3130be4a7a 100644 (file)
@@ -42,6 +42,7 @@
 #include "objdata.h"
 #include "segments.h"
 #include "span.h"
+#include "spool.h"
 
 
 
@@ -57,6 +58,7 @@ struct Span {
     unsigned            Sec;            /* Section id of this span */
     unsigned long       Offs;           /* Offset of span within segment */
     unsigned long       Size;           /* Size of span */
+    unsigned            Type;           /* Generic type of the data */
 };
 
 
@@ -67,17 +69,14 @@ struct Span {
 
 
 
-static Span* NewSpan (unsigned Id, unsigned Sec, unsigned long Offs, unsigned long Size)
+static Span* NewSpan (unsigned Id)
 /* Create and return a new span */
 {
     /* Allocate memory */
-    Span* S = xmalloc (sizeof (*S));
+    Span* S = xmalloc (sizeof (Span));
 
-    /* Initialize the fields */
+    /* Initialize the fields as necessary */
     S->Id       = Id;
-    S->Sec      = Sec;
-    S->Offs     = Offs;
-    S->Size     = Size;
 
     /* Return the result */
     return S;
@@ -85,14 +84,18 @@ static Span* NewSpan (unsigned Id, unsigned Sec, unsigned long Offs, unsigned lo
 
 
 
-Span* ReadSpan (FILE* F, ObjData* O attribute ((unused)), unsigned Id)
+Span* ReadSpan (FILE* F, ObjData* O, unsigned Id)
 /* Read a Span from a file and return it */
 {
-    /* Create a new Span and return it */
-    unsigned SecId     = ReadVar (F);
-    unsigned long Offs = ReadVar (F);
-    unsigned Size      = ReadVar (F);
-    return NewSpan (Id, SecId, Offs, Size);
+    /* Create a new Span and initialize it */
+    Span* S = NewSpan (Id);
+    S->Sec  = ReadVar (F);
+    S->Offs = ReadVar (F);
+    S->Size = ReadVar (F);
+    S->Type = MakeGlobalStringId (O, ReadVar (F));
+
+    /* Return the new span */
+    return S;
 }