|
|
1.1 root 1: /*
2: * tCopy.c
3: *
4: * functions to copy pi trees to pTrees
5: */
6:
7: #include "whoami"
8:
9: #ifdef PTREE
10:
11: #include "0.h"
12:
13: #include "tree.h"
14:
15: /*
16: * tCopy
17: * a mongo switch statement to farm out the actual copying
18: * to the appropriate routines.
19: * given a pointer to a pi tree branch, it returns a pPointer to
20: * a pTree copy of that branch.
21: */
22: pPointer
23: tCopy( node )
24: int *node;
25: {
26:
27: if ( node == NIL )
28: return pNIL;
29: switch ( node[ 0 ] ) {
30: case T_PROG:
31: case T_PDEC:
32: case T_FDEC:
33: return PorFCopy( node );
34: case T_TYPTR:
35: return PtrTCopy( node );
36: case T_TYPACK:
37: return PackTCopy( node );
38: case T_TYSCAL:
39: return EnumTCopy( node );
40: case T_TYRANG:
41: return RangeTCopy( node );
42: case T_TYARY:
43: return ArrayTCopy( node );
44: case T_TYFILE:
45: return FileTCopy( node );
46: case T_TYSET:
47: return SetTCopy( node );
48: case T_TYREC:
49: return RecTCopy( node );
50: case T_FLDLST:
51: return FldlstCopy( node );
52: case T_RFIELD:
53: return FieldCopy( node );
54: case T_TYVARPT:
55: return VarntCopy( node );
56: case T_TYVARNT:
57: return VCaseCopy( node );
58: case T_CSTAT:
59: return CasedCopy( node );
60: case T_PVAL:
61: case T_PVAR:
62: return ParamCopy( node );
63: case T_CSTRNG:
64: return sCopy( node[1] );
65: case T_STRNG:
66: return sCopy( node[2] );
67: case T_PLUSC:
68: case T_PLUS:
69: case T_MINUSC:
70: case T_MINUS:
71: case T_NOT:
72: return UnOpCopy( node );
73: case T_ID:
74: return ThreadSymbol( node[1] );
75: case T_TYID:
76: return ThreadSymbol( node[2] );
77: case T_CINT:
78: case T_CBINT:
79: return iCopy( node[1] );
80: case T_INT:
81: case T_BINT:
82: return iCopy( node[2] );
83: case T_CFINT:
84: return fCopy( node[1] );
85: case T_FINT:
86: return fCopy( node[2] );
87: case T_LISTPP:
88: return ListCopy( node );
89: case T_PCALL:
90: return PCallCopy( node );
91: case T_BLOCK:
92: case T_BSTL:
93: return ListCopy( node[2] );
94: case T_CASE:
95: return CaseSCopy( node );
96: case T_WITH:
97: return WithCopy( node );
98: case T_WHILE:
99: return WhileCopy( node );
100: case T_REPEAT:
101: return RepeatCopy( node );
102: case T_FORU:
103: case T_FORD:
104: return ForCopy( node );
105: case T_IF:
106: case T_IFEL:
107: return IfCopy( node );
108: case T_GOTO:
109: return GotoCopy( node );
110: case T_LABEL:
111: return LabelCopy( node );
112: case T_ASRT:
113: return AssertCopy( node );
114: case T_ASGN:
115: return AssignCopy( node );
116: case T_NIL:
117: return NilCopy( node );
118: case T_FCALL:
119: return FCallCopy( node );
120: case T_CSET:
121: return SetCopy( node );
122: case T_RANG:
123: return RangeCopy( node );
124: case T_VAR:
125: return VarCopy( node );
126: case T_ARY:
127: return SubscCopy( node );
128: case T_FIELD:
129: return SelCopy( node );
130: case T_PTR:
131: return PtrCopy( node );
132: case T_EQ:
133: case T_LT:
134: case T_GT:
135: case T_LE:
136: case T_GE:
137: case T_NE:
138: case T_IN:
139: case T_ADD:
140: case T_SUB:
141: case T_MULT:
142: case T_DIVD:
143: case T_DIV:
144: case T_MOD:
145: case T_OR:
146: case T_AND:
147: return BinOpCopy( node );
148: case T_WEXP:
149: return WidthCopy( node );
150: default:
151: panic("tCopy");
152: }
153: }
154:
155:
156: /*
157: * copy a list of nodes into ListNodes
158: * (with a hack for appending one list to another
159: * for example: labelled statements)
160: * listnode[0] T_LISTPP
161: * [1] "list_element"
162: * [2] "list_next"
163: */
164: pPointer
165: ListCopy( listnode )
166: int *listnode;
167: {
168: pPointer First;
169: pPointer After;
170: int *listp;
171: pPointer Item;
172: pPointer List;
173: pPointer Furthur;
174:
175: First = pNIL;
176: After = pNIL;
177: for ( listp = listnode ; listp != NIL ; listp = (int *) listp[2] ) {
178: List = pNewNode( ListTAG , sizeof( struct ListNode ) );
179: if ( First == pNIL )
180: First = List;
181: Item = tCopy( listp[1] );
182: pDEF( List ).ListItem = Item;
183: pDEF( List ).ListDown = pNIL;
184: pDEF( List ).ListUp = After;
185: if ( After != pNIL )
186: pDEF( After ).ListDown = List;
187: After = List;
188: /*
189: * if ListItem is a ListNode whose ListUp is non-pNIL
190: * append that list to this list, using that ListUp
191: * as an additional ListItem.
192: */
193: Furthur = Item;
194: if ( Furthur != pNIL
195: && pTAG( Furthur ) == ListTAG
196: && pUSE( Furthur ).ListUp != pNIL ) {
197: Item = pUSE( Furthur ).ListUp;
198: pDEF( List ).ListItem = Item;
199: pDEF( Furthur ).ListUp = List;
200: pDEF( List ).ListDown = Furthur;
201: do {
202: After = Furthur;
203: Furthur = pUSE( After ).ListDown;
204: } while ( Furthur != pNIL );
205: }
206: }
207: return First;
208: }
209:
210: /*
211: * ListAppend
212: * append a random item to the end of a list
213: * (with a hack for appending one list to another
214: * e.g. labelled statments)
215: */
216: pPointer
217: ListAppend( list , item )
218: pPointer list;
219: pPointer item;
220: {
221: pPointer List = pNewNode( ListTAG , sizeof( struct ListNode ) );
222: pPointer First;
223: pPointer After;
224: pPointer Furthur;
225:
226: pDEF( List ).ListItem = item;
227: pDEF( List ).ListDown = pNIL;
228: First = After = list;
229: if ( First == pNIL ) {
230: First = List;
231: } else {
232: while ( ( Furthur = pUSE( After ).ListDown ) != pNIL )
233: After = Furthur;
234: pDEF( After ).ListDown = List;
235: }
236: pDEF( List ).ListUp = After;
237: /*
238: * if item is a ListNode whose ListUp is non-pNIL
239: * append that list to this list, using that ListUp
240: * as an additional ListItem.
241: */
242: Furthur = item;
243: if ( Furthur != pNIL
244: && pTAG( Furthur ) == ListTAG
245: && pUSE( Furthur ).ListUp != pNIL ) {
246: pDEF( List ).ListDown = Furthur;
247: pDEF( List ).ListItem = pUSE( Furthur ).ListUp;
248: pDEF( Furthur ).ListUp = List;
249: }
250: return First;
251: }
252:
253: /*
254: * iCopy
255: * copy an integer (string) to an IntNode
256: */
257: pPointer
258: iCopy( intstring )
259: char *intstring;
260: {
261: pPointer Int = pNewNode( IntTAG , sizeof( struct IntNode ) );
262:
263: pDEF( Int ).IntValue = atol( intstring );
264: return Int;
265: }
266:
267: /*
268: * fCopy
269: * copy a float (string) to a RealNode
270: */
271: pPointer
272: fCopy( realstring )
273: char *realstring;
274: {
275: pPointer Real = pNewNode( RealTAG , sizeof( struct RealNode ) );
276:
277: pDEF( Real ).RealValue = atof( realstring );
278: return Real;
279: }
280:
281: /*
282: * sCopy
283: * copy a string to a StringNode
284: */
285: pPointer
286: sCopy( string )
287: char *string;
288: {
289: pPointer String;
290:
291: if ( string == NIL )
292: return pNIL;
293: String = pNewNode( StringTAG , strlen( string ) + 1 );
294: strcpy( pDEF( String ).StringValue , string );
295: return String;
296: }
297:
298: #endif PTREE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.