From 7f3c28a438a2f08cb82edefec606b0f90c5fbc20 Mon Sep 17 00:00:00 2001 From: cuz Date: Sat, 6 Dec 2003 14:29:16 +0000 Subject: [PATCH] Make .sizeof work with code scopes. First support for segment ranges. git-svn-id: svn://svn.cc65.org/cc65/trunk@2719 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/segrange.c | 113 ++++++++++++++++++++++++++++++++++++++++++++ src/ca65/segrange.h | 102 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+) create mode 100644 src/ca65/segrange.c create mode 100644 src/ca65/segrange.h diff --git a/src/ca65/segrange.c b/src/ca65/segrange.c new file mode 100644 index 000000000..2e71bd10c --- /dev/null +++ b/src/ca65/segrange.c @@ -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 index 000000000..fb550b331 --- /dev/null +++ b/src/ca65/segrange.h @@ -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 + + + -- 2.39.5