1 |
/* ASCEND modelling environment |
2 |
Copyright (C) 2006 Carnegie Mellon University |
3 |
Copyright (C) 1996 Ben Allan |
4 |
Copyright (C) 1990, 1993, 1994 Thomas Guthrie Epperly |
5 |
|
6 |
This program is free software; you can redistribute it and/or modify |
7 |
it under the terms of the GNU General Public License as published by |
8 |
the Free Software Foundation; either version 2, or (at your option) |
9 |
any later version. |
10 |
|
11 |
This program is distributed in the hope that it will be useful, |
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
GNU General Public License for more details. |
15 |
|
16 |
You should have received a copy of the GNU General Public License |
17 |
along with this program; if not, write to the Free Software |
18 |
Foundation, Inc., 59 Temple Place - Suite 330, |
19 |
Boston, MA 02111-1307, USA. |
20 |
*//** |
21 |
@file |
22 |
Ascend Instance Tree Link Implementation. |
23 |
|
24 |
General comments on parents: |
25 |
|
26 |
- Parents are numbered from 1 up, so zero is never a valid |
27 |
parent number |
28 |
|
29 |
- Parent lists are kept sorted by address. |
30 |
|
31 |
- The ordering of the parents list is not predictable in |
32 |
any usefull way. |
33 |
|
34 |
- The number of parents for a given instance can be modified |
35 |
by ARE_THE_SAME's. |
36 |
|
37 |
- The number of parents is NOT constant for a given type. |
38 |
|
39 |
- Parent lists will contain no duplications. |
40 |
(when AddParent is used correctly, that is.) |
41 |
|
42 |
- DummyInstances don't track parents -- they play a reference |
43 |
count game. |
44 |
|
45 |
General comments on children: |
46 |
|
47 |
- Children are number from 1 up, so zero is never a valid child |
48 |
number. |
49 |
|
50 |
- Children numbers will remain constant for a given type except |
51 |
for arrays which can have varying numbers of children. |
52 |
|
53 |
- Children numbers may or may not change will an instance is |
54 |
refined. |
55 |
|
56 |
- Children are always sorted in increasing order either |
57 |
alphabetically or numerically depending on the type of |
58 |
naming. |
59 |
|
60 |
- Children don't know what their name is. Only a parent |
61 |
knows the names of the children below it. |
62 |
|
63 |
- DummyInstances have no children. |
64 |
|
65 |
based on instance.c |
66 |
|
67 |
Requires: |
68 |
#include "utilities/ascConfig.h" |
69 |
#include "instance_enum.h" |
70 |
#include "compiler.h" |
71 |
*//* |
72 |
by Tom Epperly 8/16/89, Ben Allan |
73 |
Version: $Revision: 1.11 $ |
74 |
Version control file: $RCSfile: parentchild.h,v $ |
75 |
Date last modified: $Date: 1998/02/05 16:37:24 $ |
76 |
Last modified by: $Author: ballan $ |
77 |
*/ |
78 |
|
79 |
#ifndef ASC_PARENTCHILD_H |
80 |
#define ASC_PARENTCHILD_H |
81 |
|
82 |
#include <utilities/ascConfig.h> |
83 |
#include <compiler/compiler.h> |
84 |
#include <compiler/instance_enum.h> |
85 |
#include <compiler/instance_name.h> |
86 |
|
87 |
/* Parent routines */ |
88 |
|
89 |
ASC_DLLSPEC unsigned long NumberParents(CONST struct Instance *i); |
90 |
/**< |
91 |
* Return the number of parents that instance i has. |
92 |
* DummyInstances have no parents, apparently. |
93 |
*/ |
94 |
|
95 |
ASC_DLLSPEC struct Instance *InstanceParent(CONST struct Instance *i, unsigned long n); |
96 |
/**< |
97 |
* Return a pointer to parent number n. Parents are numbered from |
98 |
* 1 to NumberParents(i). 0(zero) is not a valid parent number. |
99 |
* DummyInstances have no parents, apparently. |
100 |
*/ |
101 |
|
102 |
extern unsigned long SearchForParent(CONST struct Instance *i, |
103 |
CONST struct Instance *p); |
104 |
/**< |
105 |
* Look in instance "i"'s parent list for parent "p". If "p" is not |
106 |
* found, it will return 0; otherwise, it will return the parent number of |
107 |
* "p" in instance "i"'s parent list. |
108 |
* DummyInstance never has parents, it thinks. |
109 |
*/ |
110 |
|
111 |
extern void DeleteParent(struct Instance *i, unsigned long pos); |
112 |
/**< |
113 |
* Remove parent in pos from i's parent list. |
114 |
* DummyInstance just reduces its reference count. |
115 |
*/ |
116 |
|
117 |
ASC_DLLSPEC struct InstanceName ParentsName(CONST struct Instance *p, |
118 |
CONST struct Instance *c); |
119 |
/**< |
120 |
* This will returns parent "p"'s name for "c". This assumes that |
121 |
* "c" is actually a child of "p", and it will return a bad value if |
122 |
* "c" is not a child of "p". Note this is actually a combination of |
123 |
* ChildIndex and ChildName defined below. It is defined separately |
124 |
* because it will be call alot. This is not a fast routine taking time |
125 |
* proportional to the number of children p has. |
126 |
* DummyInstance may have several names and which you get is arbitrary |
127 |
* because you aren't supposed to care about dummy instances. |
128 |
*/ |
129 |
|
130 |
extern void AddParent(struct Instance *i, struct Instance *p); |
131 |
/**< |
132 |
* This will add parent "p" to instance "i"'s parent list. This only |
133 |
* creates the link from "i" to "p"; it doesn't create the link from |
134 |
* "p" to "i" which must be done with the routines below. |
135 |
* This doesn't <-***** |
136 |
* check if p is already a parent of "i"; you should know that it isn't |
137 |
* before calling this. |
138 |
* Exception: |
139 |
* Every reference to DummyInstance should call this, and since |
140 |
* SearchForParent will always say that p is not a parent of dummy, |
141 |
* things work out ok. |
142 |
*/ |
143 |
|
144 |
/* Children routines */ |
145 |
|
146 |
ASC_DLLSPEC unsigned long NumberChildren(CONST struct Instance *i); |
147 |
/**< |
148 |
* Return the number of children that instance i has. |
149 |
*/ |
150 |
|
151 |
|
152 |
ASC_DLLSPEC struct Instance*InstanceChild(CONST struct Instance *i, |
153 |
unsigned long n); |
154 |
/**< |
155 |
* Return a pointer to children number n. Do not confuse the child number |
156 |
* n with an integer index. The two numbers may have no correlation. |
157 |
* Child number range from 1 to NumberChildren(i). 0(zero) is not a valid |
158 |
* child number. |
159 |
* May exit on improper i. |
160 |
*/ |
161 |
|
162 |
ASC_DLLSPEC struct InstanceName ChildName(CONST struct Instance *i, unsigned long n); |
163 |
/**< |
164 |
* Returns the name of the n'th child of i. Assumes that i has an |
165 |
* n'th child. |
166 |
*/ |
167 |
|
168 |
ASC_DLLSPEC CONST struct Statement *ChildDeclaration(CONST struct Instance *i, |
169 |
unsigned long n); |
170 |
/**< |
171 |
* Returns the declaration statement (IS_A,ALIASE,ARRAY) of the n'th child |
172 |
* of i, if i has an n'th child. May return NULL under very odd circumstances. |
173 |
* Does not return redeclarations (refinement) statements. |
174 |
* i must not be NULL! The nth child may be NULL, but we don't care. |
175 |
* (Note that as of 2/97 this function cannot return NULL because |
176 |
* the ascend language is basetype safe semantically.) |
177 |
*/ |
178 |
|
179 |
extern CONST struct TypeDescription *ChildRefines(CONST struct Instance *i, |
180 |
unsigned long n); |
181 |
/**< |
182 |
* Returns the type of the n'th child of i as determined at parse time. |
183 |
* The nth child of the instance i doesn't need to exist yet. (may be null) |
184 |
* The nth child of the instance will be of at least this type if the |
185 |
* child is not an array. |
186 |
* If the child is an array, the type returned here |
187 |
* will be the type of the array elements as determined at parse time. |
188 |
* This function may return NULL -- this merely means that at parse |
189 |
* time we couldn't quite untwist the naming to determine a type.<br><br> |
190 |
* |
191 |
* Warning: Unselected parts will yield instances of type DUMMYINST |
192 |
* instead of whatever type this returns. |
193 |
*/ |
194 |
|
195 |
ASC_DLLSPEC unsigned long ChildSearch(CONST struct Instance *i, |
196 |
CONST struct InstanceName *name); |
197 |
/**< |
198 |
* This procedure will search instance i for a child that matches "name". |
199 |
* It it is unsuccessful, it will return 0; otherwise, it will return the |
200 |
* index of the child that matches. It is assumed that all children have |
201 |
* unique names and that there is no need to worry about more than one child |
202 |
* matching "name". This can be called on childless instance without |
203 |
* error. The strings in the InstanceName must come from the symbol table. |
204 |
*/ |
205 |
|
206 |
ASC_DLLSPEC struct Instance*ChildByChar(CONST struct Instance *i, |
207 |
symchar *str); |
208 |
/**< |
209 |
* This returns to the pointer to a child, c, of parent,p, named by str. |
210 |
* str must be a simple name. If child not found, returns NULL. |
211 |
* str must be from the symbol table. If AscFindSymbol(str)==NULL, |
212 |
* then this function should not be called because NO instance |
213 |
* can have a child with a name which is not in the symbol table. |
214 |
*/ |
215 |
|
216 |
/* |
217 |
* extern unsigned long ChildSearchRegExp(); NOT IMPLEMENTED. |
218 |
* unsigned long ChildSearchRegExp(i,name,start) |
219 |
* struct Instance *i; |
220 |
* char *name; |
221 |
* unsigned long start; |
222 |
* |
223 |
* This is an unplanned extension to the initial implementation to add regular |
224 |
* expression searches. The function will search from child number "start" |
225 |
* to the first match. If no match is found, it will return 0; otherwise |
226 |
* it will return the first match of the regular expression. Examples of |
227 |
* regular expressions are: |
228 |
* f* which means all strings starting with the letter f |
229 |
* f? which means all two character long strings starting with |
230 |
* f |
231 |
*/ |
232 |
|
233 |
ASC_DLLSPEC unsigned long ChildIndex(CONST struct Instance *i, |
234 |
CONST struct Instance *child); |
235 |
/**< |
236 |
* This procedure searches through the child list of instance i for child. |
237 |
* If it does not find a match, it returns 0; otherwise, it will return |
238 |
* the child number of "child". |
239 |
*/ |
240 |
|
241 |
extern void StoreChildPtr(struct Instance *i, |
242 |
unsigned long n, |
243 |
struct Instance *child); |
244 |
/**< |
245 |
* Store the child pointer "child" in position n of i. This only creates |
246 |
* the link from i to child, and not the back link which is created by |
247 |
* add parent. Instance "i" cannot be a fundamental atom; atoms are |
248 |
* created in a special way. |
249 |
*/ |
250 |
|
251 |
#endif /* ASC_PARENTCHILD_H */ |