]> git.sur5r.net Git - cc65/commitdiff
Make .sizeof work with code scopes. First support for segment ranges.
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 6 Dec 2003 14:29:16 +0000 (14:29 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 6 Dec 2003 14:29:16 +0000 (14:29 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2719 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/segrange.c [new file with mode: 0644]
src/ca65/segrange.h [new file with mode: 0644]

diff --git a/src/ca65/segrange.c b/src/ca65/segrange.c
new file mode 100644 (file)
index 0000000..2e71bd1
--- /dev/null
@@ -0,0 +1,113 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                segrange.c                                 */
+/*                                                                           */
+/*                              A segment range                              */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2003      Ullrich von Bassewitz                                       */
+/*               Römerstraße 52                                              */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+/* common */
+#include "xmalloc.h"
+
+/* ca65 */
+#include "segment.h"
+#include "segrange.h"
+
+
+
+/*****************************************************************************/
+/*                                          Code                                    */
+/*****************************************************************************/
+
+
+
+SegRange* NewSegRange (struct Segment* Seg)
+/* Create a new segment range. The segment is set to Seg, Start and End are
+ * set to the current PC of the segment.
+ */
+{
+    /* Allocate memory */
+    SegRange* R = xmalloc (sizeof (SegRange));
+
+    /* Initialize the struct */
+    R->Seg      = Seg;
+    R->Start    = Seg->PC;
+    R->End      = Seg->PC;
+
+    /* Return the new struct */
+    return R;
+}
+
+
+
+void AddSegRanges (Collection* Ranges)
+/* Add a segment range for all existing segments to the given collection of
+ * ranges. The currently active segment will be inserted first with all others
+ * following.
+ */
+{
+    Segment* Seg;
+
+    /* Add the currently active segment */
+    CollAppend (Ranges, NewSegRange (ActiveSeg));
+
+    /* Walk through the segment list and add all other segments */
+    Seg = SegmentList;
+    while (Seg) {
+        /* Be sure to skip the active segment, since it was already added */
+        if (Seg != ActiveSeg) {
+            CollAppend (Ranges, NewSegRange (Seg));
+        }
+        Seg = Seg->List;
+    }
+}
+
+
+
+void CloseSegRanges (Collection* Ranges)
+/* Close all open segment ranges by setting PC to the current PC for the
+ * segment.
+ */                                     
+{
+    unsigned I;
+
+    /* Walk over the segment list */
+    for (I = 0; I < CollCount (Ranges); ++I) {
+
+        /* Get the next segment range */
+        SegRange* R = CollAtUnchecked (Ranges, I);
+
+        /* Set the end offset */
+        R->End = R->Seg->PC;
+    }
+}
+
+
+
diff --git a/src/ca65/segrange.h b/src/ca65/segrange.h
new file mode 100644 (file)
index 0000000..fb550b3
--- /dev/null
@@ -0,0 +1,102 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                segrange.h                                 */
+/*                                                                           */
+/*                              A segment range                              */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2003      Ullrich von Bassewitz                                       */
+/*               Römerstraße 52                                              */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+#ifndef SEGRANGE_H
+#define SEGRANGE_H
+
+
+
+/* common */
+#include "coll.h"
+#include "inline.h"
+
+
+
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+/* Segment range definition */
+typedef struct SegRange SegRange;
+struct SegRange{
+    struct Segment* Seg;                       /* Pointer to segment */
+    unsigned long   Start;              /* Start of range */
+    unsigned long   End;                /* End of range */
+};
+
+
+
+/*****************************************************************************/
+/*                                          Code                                    */
+/*****************************************************************************/
+
+
+
+SegRange* NewSegRange (struct Segment* Seg);
+/* Create a new segment range. The segment is set to Seg, Start and End are
+ * set to the current PC of the segment.
+ */
+                                            
+#if defined(HAVE_INLINE)
+INLINE unsigned long GetSegRangeSize (const SegRange* R)
+/* Return the segment range size in bytes */
+{
+    return (R->End - R->Start);
+}
+#else  
+#  define GetSegRangeSize (R)   ((R)->End - (R)->Start)
+#endif
+
+void AddSegRanges (Collection* Ranges);
+/* Add a segment range for all existing segments to the given collection of
+ * ranges. The currently active segment will be inserted first with all others
+ * following.
+ */
+
+void CloseSegRanges (Collection* Ranges);
+/* Close all open segment ranges by setting PC to the current PC for the
+ * segment.
+ */
+
+
+
+/* End of segrange.h */
+
+#endif
+
+
+