BSD 3 development
[unix-history] / usr / src / cmd / pi / pCopy.c
CommitLineData
bd98e2ac
CH
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 */
22pPointer
23ThreadSymbol( 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 */
39pPointer
40ThreadName( 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 */
62pPointer
63UnOpCopy( 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 */
109pPointer
110PtrTCopy( 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 */
125pPointer
126PackTCopy( 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 */
143pPointer
144RangeTCopy( 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 */
164pPointer
165ArrayTCopy( 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 */
183pPointer
184FileTCopy( 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 */
200pPointer
201SetTCopy( 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 */
220pPointer
221RecTCopy( 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 */
244pPointer
245FldlstCopy( 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 */
266pPointer
267VCaseCopy( 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 */
286pPointer
287CasedCopy( 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 */
309pPointer
310LabelCopy( 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 */
331pPointer
332PCallCopy( 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 */
351pPointer
352CaseSCopy( 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 */
371pPointer
372WithCopy( 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 */
391pPointer
392WhileCopy( 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 */
411pPointer
412RepeatCopy( 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 */
432pPointer
433ForCopy( 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 */
468pPointer
469ForDCopy( 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 */
489pPointer
490GotoCopy( 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 */
507pPointer
508IfCopy( 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 */
528pPointer
529AssertCopy( 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 */
546pPointer
547AssignCopy( 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 */
568pPointer
569BinOpCopy( 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 */
637pPointer
638NilCopy( 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 */
653pPointer
654FCallCopy( 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 */
672pPointer
673SetCopy( 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 */
689pPointer
690RangeCopy( 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 */
714pPointer
715VarCopy( 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 */
735pPointer
736SubscCopy( 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 */
755pPointer
756SelCopy( 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 */
770pPointer
771PtrCopy( 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 */
790pPointer
791WidthCopy( 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