-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQPBlock.cpp
164 lines (133 loc) · 4.63 KB
/
QPBlock.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*------------------------------------------------------------------------------+
| |
| QP - QSDL Parser |
| |
| (C) 1994-98 Marc Diefenbruch |
| University of Essen, Germany |
| |
+---------------+-------------------+---------------+-------------------+-------+
| Module | File | Created | Project | |
+---------------+-------------------+---------------+-------------------+-------+
| QPBlock | QPBlock.cpp | 9. Aug 1994 | QP | |
+------------------------------------------------------------------------------*/
/* Lineal
000000000011111111112222222222333333333344444444445555555555666666666677777777778
012345678901234567890123456789012345678901234567890123456789012345678901234567890
*/
#ifdef USE_PRAGMA
#pragma interface
#endif
/****************************************************************************
* Includes
****************************************************************************/
#include <stdio.h>
#include <DS/DSRef.h>
#include <DS/DSBlock.h>
#include <DS/DSString.h>
#include "QPObjects.h"
#ifdef DMALLOC
#include <dmalloc.h>
#endif
/****************************************************************************
* Externe Variablen
****************************************************************************/
extern DSObjectRefStack p_stack;
/****************************************************************************
* Globale Variablen
****************************************************************************/
DSBlockRefList p_block_ref_list;
/****************************************************************************
* Funktionen
****************************************************************************/
extern "C" {
#include "QPError.h"
void block_reference_1(const char* symbol)
{
DSBlock *p_block;
assert(symbol);
#ifdef DEBUG
qpDebugLog << "block_reference_1: " << symbol;
qpDebugLog << " (block name + insert block + append reflist)" << endl;
#endif
assert(p_stack.Top());
p_block = NewBlock((DSObject*)p_stack.Top(),
symbol); // Anlegen + Einfuegen
assert(p_block);
assert(p_block_ref_list.Append(p_block) == DS_OK); // Referencen merken
}
void block_definition_1(const char* symbol)
{
DSBlock *p_block;
DSString name(symbol);
DSResult status;
char str[120];
assert(symbol);
if (p_stack.Top()) // Block innerhalb der Hierarchie ?
{
#ifdef DEBUG
qpDebugLog << "block_definition_1: " << symbol;
qpDebugLog << " (block name + push block)" << endl;
#endif
p_block = NewBlock((DSObject*)p_stack.Top(),
symbol); // Anlegen + Einfuegen
assert(p_block);
}
else // referenzierter Block ausserhalb der Hierarchie !
{
#ifdef DEBUG
qpDebugLog << "block_definition_1 (referenced): " << symbol;
qpDebugLog << " (block name + push block)" << endl;
#endif
p_block = NULL;
for (status = p_block_ref_list.MoveFirst();
status == DS_OK;
status = p_block_ref_list.MoveNext())
{
p_block = (DSBlock*)p_block_ref_list.GetCurrentData();
assert(p_block);
if (*(p_block->GetName()) == name) // Referenz gefunden?
{
p_block_ref_list.DeleteElement();
break;
} // if
p_block = NULL;
} // for
if (p_block == NULL) // Block Deklaration nicht gefunden?
{
sprintf(str, "No referenced declaration of block '%s'!", symbol);
yyerror(str);
return;
}
} // else
assert(p_stack.Push((DSObjectRef)p_block) == DS_OK);
}
void block_definition_2(const char *symbol)
{
DSBlock *p_block;
char str[120];
assert(p_stack.Top());
assert((p_stack.Top())->GetType() == DS_BLOCK);
p_block = (DSBlock *)p_stack.Top();
if (symbol)
{
#ifdef DEBUG
qpDebugLog << "block_definition_2: " << symbol;
qpDebugLog << " (check name + pop block)" << endl;
#endif
assert(p_block->GetName());
if (*p_block->GetName() != symbol)
{
sprintf(str, "Wrong block name '%s' (should be '%s')!",
symbol, p_block->GetName()->GetString());
yyerror(str);
}
}
else
{
#ifdef DEBUG
qpDebugLog << "block_definition_2 (pop block)" << endl;
#endif
}
assert(p_stack.Pop()); /* Eingefuegt ist bereits, nur vom Stack entfernen */
}
} // extern "C"