Annotation of 3BSD/cmd/pi/pCopy.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.