/[ascend]/trunk/base/generic/compiler/parentchild.h
ViewVC logotype

Contents of /trunk/base/generic/compiler/parentchild.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 502 - (show annotations) (download) (as text)
Tue Apr 18 12:57:30 2006 UTC (13 years, 10 months ago) by johnpye
File MIME type: text/x-chdr
File size: 9359 byte(s)
Added check to see that YACC runs OK.
Fixing build with MSVC++ 2005.
All builds now except for some problems in the SWIG-generated code.
1 /* ASCEND modelling environment
2 Copyright (C) 1996 Ben Allan
3 Copyright (C) 1990, 1993, 1994 Thomas Guthrie Epperly
4 Copyright (C) 2006 Carnegie Mellon University
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 & Ben Allan
73 8/16/89
74 Version: $Revision: 1.11 $
75 Version control file: $RCSfile: parentchild.h,v $
76 Date last modified: $Date: 1998/02/05 16:37:24 $
77 Last modified by: $Author: ballan $
78 */
79
80 #ifndef ASC_PARENTCHILD_H
81 #define ASC_PARENTCHILD_H
82
83 #include <utilities/ascConfig.h>
84 #include <compiler/compiler.h>
85 #include <compiler/instance_name.h>
86
87 /* Parent routines */
88
89 extern 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 extern 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 extern 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 extern 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 extern 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 extern 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 */

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22