]> git.sur5r.net Git - cc65/blob - src/ca65/istack.c
Fix problematic code. Use more stuff from the shared modules.
[cc65] / src / ca65 / istack.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                 istack.c                                  */
4 /*                                                                           */
5 /*                        Input stack for the scanner                        */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2000     Ullrich von Bassewitz                                        */
10 /*              Wacholderweg 14                                              */
11 /*              D-70597 Stuttgart                                            */
12 /* EMail:       uz@musoftware.de                                             */
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 #include "../common/xmalloc.h"
37
38 #include "error.h"
39 #include "istack.h"
40
41
42
43 /*****************************************************************************/
44 /*                                   Data                                    */
45 /*****************************************************************************/
46
47
48
49 /* Size of the stack (== maximum nested macro or repeat count) */
50 #define ISTACK_MAX      256
51
52 /* Structure holding a stack element */
53 typedef struct IElement IElement;
54 struct IElement {
55     IElement*   Next;           /* Next stack element */
56     int         (*Func)(void*); /* Function called for input */
57     void*       Data;           /* User data given as argument */
58     const char* Desc;           /* Description */
59 };
60
61 /* The stack */
62 static IElement* IStack = 0;    /* Input stack pointer */
63 static unsigned  ICount = 0;    /* Number of items on the stack */
64
65
66
67 /*****************************************************************************/
68 /*                                   Code                                    */
69 /*****************************************************************************/
70
71
72
73 void PushInput (int (*Func) (void*), void* Data, const char* Desc)
74 /* Push an input function onto the input stack */
75 {
76     IElement* E;
77
78     /* Check for a stack overflow */
79     if (ICount > ISTACK_MAX) {
80         Fatal (FAT_NESTING);
81     }
82
83     /* Create a new stack element */
84     E = xmalloc (sizeof (*E));
85
86     /* Initialize it */
87     E->Func = Func;
88     E->Data = Data;
89     E->Desc = Desc;
90
91     /* Push it */
92     E->Next = IStack;
93     IStack  = E;
94 }
95
96
97
98 void PopInput (void)
99 /* Pop the current input function from the input stack */
100 {
101     IElement* E;
102
103     /* We cannot pop from an empty stack */
104     PRECONDITION (IStack != 0);
105
106     /* Remember the last element */
107     E = IStack;
108
109     /* Pop it */
110     IStack = IStack->Next;
111
112     /* And delete it */
113     xfree (E);
114 }
115
116
117
118 int InputFromStack (void)
119 /* Try to get input from the input stack. Return true if we had such input,
120  * return false otherwise.
121  */
122 {
123     /* Repeatedly call the TOS routine until we have a token or if run out of
124      * routines.
125      */
126     while (IStack) {
127         if (IStack->Func (IStack->Data) != 0) {
128             /* We have a token */
129             return 1;
130         }
131     }
132
133     /* Nothing is on the stack */
134     return 0;
135 }
136
137
138
139 void CheckInputStack (void)
140 /* Called from the scanner before closing an input file. Will check for any
141  * stuff on the input stack.
142  */
143 {
144     if (IStack) {
145         Error (ERR_OPEN_STMT, IStack->Desc);
146     }
147 }
148
149
150