1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* textseg.c */ |
4 | /* */ |
5 | /* Text segment structure */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 2001-2009, Ullrich von Bassewitz */ |
10 | /* Roemerstrasse 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 | /* Note: This is NOT some sort of code segment, it is used to store lines of |
37 | ** output that are textual (not real code) instead. |
38 | */ |
39 | |
40 | |
41 | |
42 | /* common */ |
43 | #include "xmalloc.h" |
44 | #include "xsprintf.h" |
45 | |
46 | /* cc65 */ |
47 | #include "output.h" |
48 | #include "textseg.h" |
49 | |
50 | |
51 | |
52 | /*****************************************************************************/ |
53 | /* Code */ |
54 | /*****************************************************************************/ |
55 | |
56 | |
57 | |
58 | TextSeg* NewTextSeg (SymEntry* Func) |
59 | /* Create a new text segment, initialize and return it */ |
60 | { |
61 | /* Allocate memory for the structure */ |
62 | TextSeg* S = xmalloc (sizeof (TextSeg)); |
63 | |
64 | /* Initialize the fields */ |
65 | S->Func = Func; |
66 | InitCollection (&S->Lines); |
67 | |
68 | /* Return the new struct */ |
69 | return S; |
70 | } |
71 | |
72 | |
73 | |
74 | void TS_AddVLine (TextSeg* S, const char* Format, va_list ap) |
75 | /* Add a line to the given text segment */ |
76 | { |
77 | /* Format the line */ |
78 | char Buf [256]; |
79 | xvsprintf (Buf, sizeof (Buf), Format, ap); |
80 | |
81 | /* Add a copy to the data segment */ |
82 | CollAppend (&S->Lines, xstrdup (Buf)); |
83 | } |
84 | |
85 | |
86 | |
87 | void TS_AddLine (TextSeg* S, const char* Format, ...) |
88 | /* Add a line to the given text segment */ |
89 | { |
90 | va_list ap; |
91 | va_start (ap, Format); |
92 | TS_AddVLine (S, Format, ap); |
93 | va_end (ap); |
94 | } |
95 | |
96 | |
97 | |
98 | void TS_Output (const TextSeg* S) |
99 | /* Output the text segment data to the output file */ |
100 | { |
101 | unsigned I; |
102 | |
103 | /* Get the number of entries in this segment */ |
104 | unsigned Count = CollCount (&S->Lines); |
105 | |
106 | /* If the segment is actually empty, bail out */ |
107 | if (Count == 0) { |
108 | return; |
109 | } |
110 | |
111 | /* Output all entries */ |
112 | for (I = 0; I < Count; ++I) { |
113 | WriteOutput ("%s\n" , (const char*) CollConstAt (&S->Lines, I)); |
114 | } |
115 | |
116 | /* Add an additional newline after the segment output */ |
117 | WriteOutput ("\n" ); |
118 | } |
119 | |