|
|
1.1 root 1: /*
2: * pCopy.c
3: * a collection of functions
4: * to copy pi's tree nodes
5: * to pTree pNodes.
6: */
7:
8: #include "whoami"
9:
10: #ifdef PTREE
11:
12: #include "0.h"
13:
14: /*
15: * get all the pi tree tags
16: */
17: #include "tree.h"
18:
19: /* constructs a ThreadNode to a declaration
20: * given an identifier char * symbol
21: */
22: pPointer
23: ThreadSymbol( symbol )
24: char *symbol;
25: {
26: pPointer Thread;
27: struct nl *symbp = nllook( symbol );
28:
29: if ( symbp == NIL || symbp -> inTree == pNIL )
30: return pNIL;
31: Thread = pNewNode( ThreadTAG , sizeof( struct ThreadNode ) );
32: pDEF( Thread ).ThreadPointer = symbp -> inTree;
33: return Thread;
34: }
35:
36: /* constructs a ThreadNode to a declaration
37: * given a namelist pointer
38: */
39: pPointer
40: ThreadName( nlp )
41: struct nl *nlp;
42: {
43: pPointer Thread;
44:
45: if ( nlp == NIL || nlp -> inTree == pNIL )
46: return pNIL;
47: Thread = pNewNode( ThreadTAG , sizeof( struct ThreadNode ) );
48: pDEF( Thread ).ThreadPointer = nlp -> inTree;
49: return Thread;
50: }
51:
52: /*
53: * copies a unary operator node to an appropriate pNode.
54: * unary operators come in two flavors,
55: * those with known constant operands (T_PLUSC and T_MINUSC),
56: * and those (T_PLUS, T_MINUS, and T_NOT)
57: * which carry around with them whether they have a constant operand
58: * unop [0] T_PLUSC, T_MINUSC or [0] T_PLUS, T_MINUS, T_NOT
59: * [1] expression [1] constant operand?
60: * [2] expression
61: */
62: pPointer
63: UnOpCopy( unop )
64: int *unop;
65: {
66: pPointer UnOp;
67: pPointer Expr;
68:
69: switch ( unop[0] ) {
70: case T_PLUSC:
71: case T_PLUS:
72: UnOp = pNewNode( PlusTAG , sizeof( struct PlusNode ) );
73: break;
74: case T_MINUSC:
75: case T_MINUS:
76: UnOp = pNewNode( MinusTAG , sizeof( struct MinusNode ) );
77: break;
78: case T_NOT:
79: UnOp = pNewNode( NotTAG , sizeof( struct NotNode ) );
80: break;
81: default:
82: panic("UnOpCopy");
83: }
84: switch ( unop[0] ) {
85: case T_PLUSC:
86: case T_MINUSC:
87: Expr = tCopy( unop[1] );
88: break;
89: case T_PLUS:
90: case T_MINUS:
91: case T_NOT:
92: Expr = tCopy( unop[2] );
93: break;
94: default:
95: panic("UnOpCopy");
96: }
97: pDEF( UnOp ).UnOpExpr = Expr;
98: return UnOp;
99: }
100:
101: /*
102: * returns an empty PtrTNode
103: * to be filled in by foredecl
104: * typtr [0] T_TYPTR
105: * [1] lineof "^"
106: * [2][0] T_ID
107: * [1] type name
108: */
109: pPointer
110: PtrTCopy( typtr )
111: int *typtr;
112: {
113: pPointer PtrT = pNewNode( PtrTTAG , sizeof( struct PtrTNode ) );
114:
115: pDEF( PtrT ).PtrTType = pNIL;
116: return PtrT;
117: }
118:
119: /*
120: * copy a PACKED declaration to a PackTNode
121: * typack [0] T_TYPACK
122: * [1] lineof "packed"
123: * [2] structured type
124: */
125: pPointer
126: PackTCopy( typack )
127: int *typack;
128: {
129: pPointer PackT = pNewNode( PackTTAG , sizeof( struct PackTNode ) );
130: pPointer Type = tCopy( typack[2] );
131:
132: pDEF( PackT ).PackTType = Type;
133: return PackT;
134: }
135:
136: /*
137: * copy a T_TYRANG node to a RangeTNode
138: * tyrang [0] T_TYRANG
139: * [1] lineof ".."
140: * [2] lower const
141: * [3] upper const
142: */
143: pPointer
144: RangeTCopy( tyrang )
145: int *tyrang;
146: {
147: pPointer RangeT = pNewNode( RangeTTAG , sizeof ( struct RangeTNode ) );
148: pPointer Lower = tCopy( tyrang[2] );
149: pPointer Upper = tCopy( tyrang[3] );
150:
151: pDEF( RangeT ).RangeTLower = Lower;
152: pDEF( RangeT ).RangeTUpper = Upper;
153: return RangeT;
154: }
155:
156: /*
157: * ArrayTCopy
158: * copy a T_TYARY node to an ArrayTNode
159: * tyary [0] T_TYARY
160: * [1] lineof "array"
161: * [2] simple_type_list
162: * [3] type
163: */
164: pPointer
165: ArrayTCopy( tyary )
166: int *tyary;
167: {
168: pPointer ArrayT = pNewNode( ArrayTTAG , sizeof( struct ArrayTNode ) );
169: pPointer Dims = tCopy( tyary[2] );
170: pPointer Type = tCopy( tyary[3] );
171:
172: pDEF( ArrayT ).ArrayTDims = Dims;
173: pDEF( ArrayT ).ArrayTType = Type;
174: return ArrayT;
175: }
176:
177: /*
178: * copy a T_TYFILE node to a FileTNode
179: * tyfile [0] T_TYFILE
180: * [1] lineof file
181: * [2] type
182: */
183: pPointer
184: FileTCopy( tyfile )
185: int *tyfile;
186: {
187: pPointer FileT = pNewNode( FileTTAG , sizeof( struct FileTNode ) );
188: pPointer Type = tCopy( tyfile[2] );
189:
190: pDEF( FileT ).FileTType = Type;
191: return FileT;
192: }
193:
194: /*
195: * copy a T_TYSET node of a SetTNode
196: * tyset [0] T_TYSET
197: * [1] lineof "set"
198: * [2] simple type
199: */
200: pPointer
201: SetTCopy( tyset )
202: int *tyset;
203: {
204: pPointer SetT = pNewNode( SetTTAG , sizeof( struct SetTNode ) );
205: pPointer Type = tCopy( tyset[2] );
206:
207: pDEF( SetT ).SetTType = Type;
208: return SetT;
209: }
210:
211: /*
212: * copy an extended T_TYREC node to a RecTNode
213: * tyrec [0] T_TYREC
214: * [1] lineof field_list
215: * [2] pointer to field_list
216: * [3] >>pTree extension<< struct nl * to record in namelist
217: * sets extern inrecord so fields know in which record they are.
218: * saved previous inrecord to deal with nested records.
219: */
220: pPointer
221: RecTCopy( tyrec )
222: int *tyrec;
223: {
224: extern struct nl *inrecord;
225: struct nl *saverecord;
226: pPointer RecT = pNewNode( RecTTAG , sizeof( struct RecTNode ) );
227: pPointer Fldlst;
228:
229: saverecord = inrecord;
230: inrecord = (struct nl *) tyrec[3];
231: Fldlst = tCopy( tyrec[2] );
232: pDEF( RecT ).RecTFldlst = Fldlst;
233: inrecord = saverecord;
234: return RecT;
235: }
236:
237: /*
238: * copy an extended T_FLDLST node to a FldlstNode
239: * fldlst [0] T_FLDLST
240: * [1] 0
241: * [2] fixed part (list of T_RFIELDs)
242: * [3] variant part (pointer to T_TYVARPT node)
243: */
244: pPointer
245: FldlstCopy( fldlst )
246: int *fldlst;
247: {
248: pPointer Fldlst = pNewNode( FldlstTAG , sizeof( struct FldlstNode ) );
249: pPointer Fixed;
250: pPointer Varpt;
251:
252: Fixed = tCopy( fldlst[2] );
253: Varpt = tCopy( fldlst[3] );
254: pDEF( Fldlst ).FldlstFixed = Fixed;
255: pDEF( Fldlst ).FldlstVariant = Varpt;
256: return Fldlst;
257: }
258:
259: /*
260: * copies a T_TYVARNT to a VCaseNode
261: * tyvarnt [0] T_TYVARNT
262: * [1] lineof ":"
263: * [2] constant list
264: * [3] nil or &(T_FLDLST node)
265: */
266: pPointer
267: VCaseCopy( tyvarnt )
268: int *tyvarnt;
269: {
270: pPointer VCase = pNewNode( VCaseTAG , sizeof( struct VCaseNode ) );
271: pPointer Consts = tCopy( tyvarnt[2] );
272: pPointer Rec = tCopy( tyvarnt[3] );
273:
274: pDEF( VCase ).VCaseConsts = Consts;
275: pDEF( VCase ).VCaseRec = Rec;
276: return VCase;
277: }
278:
279: /*
280: * copy a T_CSTAT to a CasedNode
281: * cstat [0] T_CSTAT
282: * [1] lineof ":"
283: * [2] constant list
284: * [3] statement
285: */
286: pPointer
287: CasedCopy( cstat )
288: int *cstat;
289: {
290: pPointer Cased = pNewNode( CasedTAG , sizeof( struct CasedNode ) );
291: pPointer Label = tCopy( cstat[2] );
292: pPointer Stat = tCopy( cstat[3] );
293:
294: pDEF( Cased ).CasedLabel = Label;
295: pDEF( Cased ).CasedStat = Stat;
296: return Cased;
297: }
298:
299: /*
300: * copy a T_LABEL to a ListNode
301: * whose ListUp is a LabelNode and
302: * whose ListDown is the labelled statement
303: * (cf. the hack in ListAppend )
304: * label [0] T_LABEL
305: * [1] lineof :
306: * [2] hash of integer label
307: * [3] statement
308: */
309: pPointer
310: LabelCopy( label )
311: int *label;
312: {
313: pPointer List;
314: pPointer Label = pNewNode( LabelTAG , sizeof( struct LabelNode ) );
315: pPointer Stat;
316:
317: Stat = tCopy( label[3] );
318: pDEF( Label ).LabelLabel = nllook( label[2] ) -> inTree;
319: List = ListAppend( pNIL , Stat );
320: pDEF( List ).ListUp = Label;
321: return List;
322: }
323:
324: /*
325: * copy a T_PCALL node to a PCallNode
326: * pcall [0] T_PCALL
327: * [1] lineof yyline or "("
328: * [2] proc_id
329: * [3] actual list
330: */
331: pPointer
332: PCallCopy( pcall )
333: int *pcall;
334: {
335: pPointer PCall = pNewNode( PCallTAG , sizeof( struct PCallNode ) );
336: pPointer Id = ThreadSymbol( pcall[2] );
337: pPointer Actuals = tCopy( pcall[3] );
338:
339: pDEF( PCall ).PCallId = Id;
340: pDEF( PCall ).PCallActuals = Actuals;
341: return PCall;
342: }
343:
344: /*
345: * copy a T_CASE node to a CaseSNode
346: * tcase [0] T_CASE
347: * [1] lineof "case"
348: * [2] expression
349: * [3] list of cases
350: */
351: pPointer
352: CaseSCopy( tcase )
353: int *tcase;
354: {
355: pPointer CaseS = pNewNode( CaseSTAG , sizeof( struct CaseSNode ) );
356: pPointer Expr = tCopy( tcase[2] );
357: pPointer Caselist = tCopy( tcase[3] );
358:
359: pDEF( CaseS ).CaseSExpr = Expr;
360: pDEF( CaseS ).CaseSStat = Caselist;
361: return CaseS;
362: }
363:
364: /*
365: * copy a T_WITH node to a WithNode
366: * with [0] T_WITH
367: * [1] lineof "with"
368: * [2] variable list
369: * [3] statement
370: */
371: pPointer
372: WithCopy( with )
373: int *with;
374: {
375: pPointer With = pNewNode( WithTAG , sizeof( struct WithNode ) );
376: pPointer Vars = tCopy( with[2] );
377: pPointer Stat = tCopy( with[3] );
378:
379: pDEF( With ).WithVars = Vars;
380: pDEF( With ).WithStat = Stat;
381: return With;
382: }
383:
384: /*
385: * copy a T_WHILE node to a WhileNode
386: * twhile [0] T_WHILE
387: * [1] lineof "while"
388: * [2] expression
389: * [3] statement
390: */
391: pPointer
392: WhileCopy( twhile )
393: int *twhile;
394: {
395: pPointer While = pNewNode( WhileTAG , sizeof( struct WhileNode ) );
396: pPointer Expr = tCopy( twhile[2] );
397: pPointer Stat = tCopy( twhile[3] );
398:
399: pDEF( While ).WhileExpr = Expr;
400: pDEF( While ).WhileStat = Stat;
401: return While;
402: }
403:
404: /*
405: * copy a T_REPEAT node to a RepeatNode
406: * trepeat [0] T_REPEAT
407: * [1] lineof "repeat"
408: * [2] statement list
409: * [3] expression
410: */
411: pPointer
412: RepeatCopy( trepeat )
413: int *trepeat;
414: {
415: pPointer Repeat = pNewNode( RepeatTAG , sizeof( struct RepeatNode ) );
416: pPointer Stat = tCopy( trepeat[2] );
417: pPointer Expr = tCopy( trepeat[3] );
418:
419: pDEF( Repeat ).RepeatStat = Stat;
420: pDEF( Repeat ).RepeatExpr = Expr;
421: return Repeat;
422: }
423:
424: /*
425: * copy a T_FORU or T_FORD node to a ForUNode or a ForDNode
426: * tfor [0] T_FORU or T_FORD
427: * [1] lineof "for"
428: * [2] assignment
429: * [3] termination expression
430: * [4] statement
431: */
432: pPointer
433: ForCopy( tfor )
434: int *tfor;
435: {
436: pPointer For;
437: pPointer Assign;
438: pPointer Expr;
439: pPointer Stat;
440:
441: switch ( tfor[0] ) {
442: case T_FORU:
443: For = pNewNode( ForUTAG , sizeof( struct ForUNode ) );
444: break;
445: case T_FORD:
446: For = pNewNode( ForDTAG , sizeof( struct ForDNode ) );
447: break;
448: default:
449: panic("ForCopy");
450: }
451: Assign = tCopy( tfor[2] );
452: Expr = tCopy( tfor[3] );
453: Stat = tCopy( tfor[4] );
454: pDEF( For ).ForUAssign = Assign;
455: pDEF( For ).ForUExpr = Expr;
456: pDEF( For ).ForUStat = Stat;
457: return For;
458: }
459:
460: /*
461: * copy a T_FORD node to a ForDNode
462: * ford [0] T_FORD
463: * [1] lineof "for"
464: * [2] assignment
465: * [3] termination expression
466: * [4] statement
467: */
468: pPointer
469: ForDCopy( ford )
470: int *ford;
471: {
472: pPointer ForD = pNewNode( ForDTAG , sizeof( struct ForDNode ) );
473: pPointer Assign = tCopy( ford[2] );
474: pPointer Expr = tCopy( ford[3] );
475: pPointer Stat = tCopy( ford[4] );
476:
477: pDEF( ForD ).ForDAssign = Assign;
478: pDEF( ForD ).ForDExpr = Expr;
479: pDEF( ForD ).ForDStat = Stat;
480: return ForD;
481: }
482:
483: /*
484: * copy a T_GOTO node to a GotoNode
485: * tgoto [0] T_GOTO
486: * [1] lineof "goto"
487: * [2] hash of integer label
488: */
489: pPointer
490: GotoCopy( tgoto )
491: int *tgoto;
492: {
493: pPointer Goto = pNewNode( GotoTAG , sizeof( struct GotoNode ) );
494:
495: pDEF( Goto ).GotoLabel = nllook( tgoto[2] ) -> inTree;
496: return Goto;
497: }
498:
499: /*
500: * copy T_IF or T_IFEL nodes to IfNodes
501: * tif [0] T_IF or T_IFEL
502: * [1] lineof "if"
503: * [2] expression
504: * [3] then statement
505: * [4] else statement
506: */
507: pPointer
508: IfCopy( tif )
509: int *tif;
510: {
511: pPointer If = pNewNode( IfTAG , sizeof( struct IfNode ) );
512: pPointer Cond = tCopy( tif[2] );
513: pPointer Then = tCopy( tif[3] );
514: pPointer Else = tCopy( tif[4] );
515:
516: pDEF( If ).IfCond = Cond;
517: pDEF( If ).IfThen = Then;
518: pDEF( If ).IfElse = Else;
519: return If;
520: }
521:
522: /*
523: * copy a T_ASRT node to an AssertNode
524: * asrt [0] T_ASRT
525: * [1] lineof "assert"
526: * [2] expression
527: */
528: pPointer
529: AssertCopy( asrt )
530: int *asrt;
531: {
532: pPointer Assert = pNewNode( AssertTAG , sizeof( struct AssertNode ) );
533: pPointer Expr = tCopy( asrt[2] );
534:
535: pDEF( Assert ).AssertExpr = Expr;
536: return Assert;
537: }
538:
539: /*
540: * copy a T_ASGN node to an AssignNode
541: * asgn [0] T_ASGN
542: * [1] lineof ":" (of ":=")
543: * [2] variable
544: * [3] expression
545: */
546: pPointer
547: AssignCopy( asgn )
548: int *asgn;
549: {
550: pPointer Assign = pNewNode( AssignTAG , sizeof( struct AssignNode ) );
551: pPointer Var = tCopy( asgn[2] );
552: pPointer Expr = tCopy( asgn[3] );
553:
554: pDEF( Assign ).AssignVar = Var;
555: pDEF( Assign ).AssignExpr = Expr;
556: return Assign;
557: }
558:
559: /*
560: * copy a binary operator to an appropriate pNode
561: * binop [0] T_EQ, T_LT, T_GT, T_LE, T_GE, T_NE,
562: * T_ADD, T_SUB, T_MULT, T_DIV, T_DIVD, T_MOD
563: * T_IN, T_OR, T_AND
564: * [1] SAWCON
565: * [2] left operand expression
566: * [3] right operand expression
567: */
568: pPointer
569: BinOpCopy( binop )
570: int *binop;
571: {
572: pPointer BinOp;
573: pPointer Left;
574: pPointer Right;
575:
576: switch ( binop[0] ) {
577: case T_EQ:
578: BinOp = pNewNode( EqTAG , sizeof( struct EqNode ) );
579: break;
580: case T_LT:
581: BinOp = pNewNode( LtTAG , sizeof( struct LtNode ) );
582: break;
583: case T_GT:
584: BinOp = pNewNode( GtTAG , sizeof( struct GtNode ) );
585: break;
586: case T_LE:
587: BinOp = pNewNode( LeTAG , sizeof( struct LeNode ) );
588: break;
589: case T_GE:
590: BinOp = pNewNode( GeTAG , sizeof( struct GeNode ) );
591: break;
592: case T_NE:
593: BinOp = pNewNode( NeTAG , sizeof( struct NeNode ) );
594: break;
595: case T_ADD:
596: BinOp = pNewNode( AddTAG , sizeof( struct AddNode ) );
597: break;
598: case T_SUB:
599: BinOp = pNewNode( SubTAG , sizeof( struct SubNode ) );
600: break;
601: case T_MULT:
602: BinOp = pNewNode( MultTAG , sizeof( struct MultNode ) );
603: break;
604: case T_DIV:
605: BinOp = pNewNode( DivTAG , sizeof( struct DivNode ) );
606: break;
607: case T_DIVD:
608: BinOp = pNewNode( DivdTAG , sizeof( struct DivdNode ) );
609: break;
610: case T_MOD:
611: BinOp = pNewNode( ModTAG , sizeof( struct ModNode ) );
612: break;
613: case T_IN:
614: BinOp = pNewNode( InTAG , sizeof( struct InNode ) );
615: break;
616: case T_OR:
617: BinOp = pNewNode( OrTAG , sizeof( struct OrNode ) );
618: break;
619: case T_AND:
620: BinOp = pNewNode( AndTAG , sizeof( struct AndNode ) );
621: break;
622: default:
623: panic("BinOpCopy");
624: }
625: Left = tCopy( binop[2] );
626: Right = tCopy( binop[3] );
627: pDEF( BinOp ).BinOpLeft = Left;
628: pDEF( BinOp ).BinOpRight = Right;
629: return BinOp;
630: }
631:
632: /*
633: * copy a T_NIL node to a NilNode
634: * tnil [0] T_NIL
635: * [1] NOCON
636: */
637: pPointer
638: NilCopy( tnil )
639: int *tnil;
640: {
641: pPointer Nil = pNewNode( NilTAG , 0 );
642:
643: return Nil;
644: }
645:
646: /*
647: * copy an T_FCALL node to an FCallNode
648: * fcall [0] T_FCALL
649: * [1] NOCON
650: * [2] func_id
651: * [3] actual expression list
652: */
653: pPointer
654: FCallCopy( fcall )
655: int *fcall;
656: {
657: pPointer FCall = pNewNode( FCallTAG , sizeof( struct FCallNode ) );
658: pPointer Id = ThreadSymbol( fcall[2] );
659: pPointer Actuals = tCopy( fcall[3] );
660:
661: pDEF( FCall ).FCallId = Id;
662: pDEF( FCall ).FCallActuals = Actuals;
663: return FCall;
664: }
665:
666: /*
667: * copy a T_CSET node to a SetNode
668: * cset [0] T_CSET
669: * [1] SAWCON
670: * [2] element list
671: */
672: pPointer
673: SetCopy( cset )
674: int *cset;
675: {
676: pPointer Set = pNewNode( SetTAG , sizeof( struct SetNode ) );
677: pPointer Elements = tCopy( cset[2] );
678:
679: pDEF( Set ).SetElements = Elements;
680: return Set;
681: }
682:
683: /*
684: * copy a T_RANG node to a RangeNode
685: * rang [0] T_RANG
686: * [1] lower limit
687: * [2] upper limit
688: */
689: pPointer
690: RangeCopy( rang )
691: int *rang;
692: {
693: pPointer Range = pNewNode( RangeTAG , sizeof( struct RangeNode ) );
694: pPointer Lower = tCopy( rang[1] );
695: pPointer Upper = tCopy( rang[2] );
696:
697: pDEF( Range ).RangeLower = Lower;
698: pDEF( Range ).RangeUpper = Upper;
699: return Range;
700: }
701:
702: /*
703: * copies an extended T_VAR node to a VarNode
704: * var [0] T_VAR
705: * [1] NOCON
706: * [2] variable id (may be variable or field name in WITH)
707: * [3] qualifications list
708: * [4] >>pTree extension<< struct nl * or NIL.
709: * NIL if this is a real variable,
710: * struct nl * to field,
711: * otherwise we'd never find it in the right record.
712: * see setupvar
713: */
714: pPointer
715: VarCopy( var )
716: int *var;
717: {
718: pPointer Var = pNewNode( VarTAG , sizeof( struct VarNode ) );
719: pPointer Id;
720: pPointer Quals = tCopy( var[3] );
721:
722: if ( var[4] == NIL )
723: Id = ThreadSymbol( var[2] );
724: else Id = ThreadName( var[4] );
725: pDEF( Var ).VarId = Id;
726: pDEF( Var ).VarQuals = Quals;
727: return Var;
728: }
729:
730: /*
731: * copy a T_ARY qualification to a SubscNode
732: * ary [0] T_ARY
733: * [1] subscript expression list
734: */
735: pPointer
736: SubscCopy( ary )
737: int *ary;
738: {
739: pPointer Subsc = pNewNode( SubscTAG , sizeof( struct SubscNode ) );
740: pPointer Exprs = tCopy( ary[1] );
741:
742: pDEF( Subsc ).SubscSubsc = Exprs;
743: return Subsc;
744: }
745:
746: /*
747: * copy an extended T_FIELD qualification to a SelNode
748: * field [0] T_FIELD
749: * [1] field_id
750: * [2] NIL
751: * [3] >>pTree extension<< struct nl * to field
752: * otherwise we'd never know where it is
753: * put in by lvalue
754: */
755: pPointer
756: SelCopy( field )
757: int *field;
758: {
759: pPointer Sel = pNewNode( SelTAG , sizeof( struct SelNode ) );
760: pPointer Field = ThreadName( field[3] );
761:
762: pDEF( Sel ).SelField = Field;
763: return Sel;
764: }
765:
766: /*
767: * copy a T_PTR qualification to a PtrNode
768: * ptr [0] T_PTR
769: */
770: pPointer
771: PtrCopy( ptr )
772: int *ptr;
773: {
774: pPointer Ptr = pNewNode( PtrTAG , 0 );
775:
776: return Ptr;
777: }
778:
779: /*
780: * copy a T_WEXP node to a WidthNode and maybe an OctNode or a HexNode
781: * for expr : width
782: * or expr : width : places
783: * or expr radix
784: * or expr : width radix
785: * wexp [0] T_WEXP
786: * [1] expr
787: * [2] width or NIL
788: * [3] places or OCT or HEX
789: */
790: pPointer
791: WidthCopy( wexp )
792: int *wexp;
793: {
794: pPointer Width = pNewNode( WidthTAG , sizeof( struct WidthNode ) );
795: pPointer expr = tCopy( wexp[1] );
796: pPointer width = tCopy( wexp[2] );
797: pPointer places;
798: pPointer radix;
799:
800: pDEF( Width ).WidthExpr = expr;
801: pDEF( Width ).WidthWidth = width;
802: switch ( wexp[3] ) {
803: default:
804: places = tCopy( wexp[3] );
805: radix = pNIL;
806: break;
807: case OCT:
808: places = pNIL;
809: radix = pNewNode( OctTAG , 0 );
810: break;
811: case HEX:
812: places = pNIL;
813: radix = pNewNode( HexTAG , 0 );
814: break;
815: }
816: pDEF( Width ).WidthPlaces = places;
817: pDEF( Width ).WidthRadix = radix;
818: return Width;
819: }
820:
821: #endif PTREE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.