]> git.sur5r.net Git - cc65/blob - src/ca65/segrange.c
New version by Greg King.
[cc65] / src / ca65 / segrange.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                segrange.c                                 */
4 /*                                                                           */
5 /*                              A segment range                              */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2003      Ullrich von Bassewitz                                       */
10 /*               Römerstraße 52                                              */
11 /*               D-70794 Filderstadt                                         */
12 /* EMail:        uz@cc65.org                                                 */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 /* common */
37 #include "xmalloc.h"
38
39 /* ca65 */
40 #include "segment.h"
41 #include "segrange.h"
42
43
44
45 /*****************************************************************************/
46 /*                                   Code                                    */
47 /*****************************************************************************/
48
49
50
51 SegRange* NewSegRange (struct Segment* Seg)
52 /* Create a new segment range. The segment is set to Seg, Start and End are
53  * set to the current PC of the segment.
54  */
55 {
56     /* Allocate memory */
57     SegRange* R = xmalloc (sizeof (SegRange));
58
59     /* Initialize the struct */
60     R->Seg      = Seg;
61     R->Start    = Seg->PC;
62     R->End      = Seg->PC;
63
64     /* Return the new struct */
65     return R;
66 }
67
68
69
70 void AddSegRanges (Collection* Ranges)
71 /* Add a segment range for all existing segments to the given collection of
72  * ranges. The currently active segment will be inserted first with all others
73  * following.
74  */
75 {
76     Segment* Seg;
77
78     /* Add the currently active segment */
79     CollAppend (Ranges, NewSegRange (ActiveSeg));
80
81     /* Walk through the segment list and add all other segments */
82     Seg = SegmentList;
83     while (Seg) {
84         /* Be sure to skip the active segment, since it was already added */
85         if (Seg != ActiveSeg) {
86             CollAppend (Ranges, NewSegRange (Seg));
87         }
88         Seg = Seg->List;
89     }
90 }
91
92
93
94 void CloseSegRanges (Collection* Ranges)
95 /* Close all open segment ranges by setting PC to the current PC for the
96  * segment.
97  */                                     
98 {
99     unsigned I;
100
101     /* Walk over the segment list */
102     for (I = 0; I < CollCount (Ranges); ++I) {
103
104         /* Get the next segment range */
105         SegRange* R = CollAtUnchecked (Ranges, I);
106
107         /* Set the end offset */
108         R->End = R->Seg->PC;
109     }
110 }
111
112
113