Annotation of 3BSD/cmd/pi/dCopy.c, revision 1.1

1.1     ! root        1:     /*
        !             2:      * dCopy.c
        !             3:      *
        !             4:      * functions to copy pi declarations to pTrees
        !             5:      * these should be all the functions
        !             6:      * that mark the inTree field of the namelist
        !             7:      */
        !             8: 
        !             9: #include       "whoami"
        !            10: 
        !            11: #ifdef PTREE
        !            12: 
        !            13: #include       "0.h"
        !            14: 
        !            15: #include       "tree.h"
        !            16: 
        !            17:     /*
        !            18:      * copy a T_PROG, T_PDEC, or T_FDEC into a PorFNode
        !            19:      * porf    [0]     T_PROG T_PDEC or T_FDEC
        !            20:      *         [1]     lineof "program" or trailing ";"
        !            21:      *         [2]     program, procedure, or function name
        !            22:      *         [3]     file or formal parameter list
        !            23:      *         [4]     function return type or pNIL
        !            24:      */
        !            25: pPointer
        !            26: PorFCopy( porf )
        !            27:     int        *porf;
        !            28:     {
        !            29:        pPointer                PorF;
        !            30:        union pNodeBodies       *PorFp;
        !            31:        struct nl               *nlporf;
        !            32:        extern struct nl        *program;
        !            33: 
        !            34:            /*
        !            35:             *  programs are defnl'ed but not entered, but extern program works
        !            36:             */
        !            37:        if ( porf[0] == T_PROG )
        !            38:                nlporf = program;
        !            39:          else  nlporf = nllook( porf[2] );
        !            40:        if ( nlporf -> inTree != pNIL ) {
        !            41:            pDEF( nlporf -> inTree ).PorFForward = TRUE;
        !            42:            return;
        !            43:        }
        !            44:        PorF = pNewNode( PorFTAG , sizeof( struct PorFNode ) );
        !            45:        pSeize( PorF );
        !            46:        PorFp = &( pDEF( PorF ) );
        !            47:        PorFp -> PorFName = sCopy( porf[2] );
        !            48:        PorFHeader[ ++ nesting ] = PorF;
        !            49:        if ( porf[0] != T_PROG )
        !            50:                PorFp -> PorFParams = tCopy( porf[3] );
        !            51:          else  PorFp -> PorFParams = FileCopy( porf[3] );
        !            52:        nesting --;
        !            53:        PorFp -> PorFLabels = pNIL;
        !            54:        PorFp -> PorFConsts = pNIL;
        !            55:        PorFp -> PorFTypes = pNIL;
        !            56:        PorFp -> PorFVars = pNIL;
        !            57:        PorFp -> PorFPFs = pNIL;
        !            58:        PorFp -> PorFBody = pNIL;
        !            59:        PorFp -> PorFReturns = tCopy( porf[4] );
        !            60:        PorFp -> PorFForward = FALSE;
        !            61:        pRelease( PorF );
        !            62:        nlporf -> inTree = PorF;
        !            63:        return PorF;
        !            64:     }
        !            65: 
        !            66:     /*
        !            67:      * looks for defined (but not entered) symbols
        !            68:      * (either files or formal parameters)
        !            69:      * which hang down the chain field of
        !            70:      * program, procedure or function namelist entry.
        !            71:      */
        !            72: struct nl *
        !            73: chainlookup( porf , symb )
        !            74:     struct nl  *porf;
        !            75:     char       *symb;
        !            76:     {
        !            77:        struct nl *paramp;
        !            78:        
        !            79:        for ( paramp = porf->chain ; paramp != NIL ; paramp = paramp->chain )
        !            80:            if ( paramp -> symbol == symb )
        !            81:                break;
        !            82:        return paramp;
        !            83:     }
        !            84: 
        !            85:     /*
        !            86:      * copy a list of file names to a list of threads to VarDNodes
        !            87:      * (or threads to the BVarNodes for input or output)
        !            88:      * for later inclusion in the variable declaration list.
        !            89:      * as a special case, the files are found chained to the program nl entry.
        !            90:      */
        !            91: pPointer
        !            92: FileCopy( files )
        !            93:     int        *files;
        !            94:     {
        !            95:        int                 *filep;
        !            96:        pPointer            Thread;
        !            97:        pPointer            List;
        !            98:        pPointer            First;
        !            99:        pPointer            After;
        !           100:        extern struct nl    *program;
        !           101:        extern struct nl    *input;
        !           102:        extern struct nl    *output;
        !           103: 
        !           104:        First = After = pNIL;
        !           105:        for ( filep = files ; filep != NIL ; filep = (int *) filep[2] ) {
        !           106:            struct nl   *file = chainlookup( program , filep[1] );
        !           107: 
        !           108:                    if ( filep[1] == input -> symbol ) {
        !           109:                        file -> inTree = input -> inTree;
        !           110:                        Thread = ThreadName( input );
        !           111:            } else  if ( filep[1] == output -> symbol ) {
        !           112:                        file -> inTree = output -> inTree;
        !           113:                        Thread = ThreadName( output );
        !           114:            } else  {
        !           115:                        pPointer File = pNewNode( VarDTAG
        !           116:                                                , sizeof( struct VarDNode ) );
        !           117:                        pPointer Name = sCopy( filep[1] );
        !           118: 
        !           119:                        pDEF( File ).VarDName = Name;
        !           120:                        pDEF( File ).VarDType = pNIL;
        !           121:                        file -> inTree = File;
        !           122:                        Thread = ThreadName( file );
        !           123:            }
        !           124:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           125:            pDEF( List ).ListItem = Thread;
        !           126:            pDEF( List ).ListUp = After;
        !           127:            pDEF( List ).ListDown = pNIL;
        !           128:            if ( After == pNIL )
        !           129:                    First = List;
        !           130:              else  pDEF( After ).ListDown = List;
        !           131:            After = List;
        !           132:        }
        !           133:        return First;
        !           134:     }
        !           135: 
        !           136:     /*
        !           137:      * copy a formal parameter declaration to a TypedNode
        !           138:      * and a list of ValPNodes or VarPNodes.
        !           139:      * param   [0]     T_PVAL or T_PVAR
        !           140:      *         [1]     id_list
        !           141:      *         [2]     type
        !           142:      */
        !           143: pPointer
        !           144: ParamCopy( param )
        !           145:     int     *param;
        !           146:     {
        !           147:        int         *idl;
        !           148:        pPointer    Param;
        !           149:        pPointer    Name;
        !           150:        pPointer    Typed = pNewNode( TypedTAG , sizeof( struct TypedNode ) );
        !           151:        pPointer    Type = tCopy( param[2] );
        !           152:        pPointer    List;
        !           153:        pPointer    After;
        !           154:        char        *name;
        !           155:        struct nl   *porf;
        !           156: 
        !           157:        Name = pUSE( PorFHeader[ nesting ] ).PorFName;
        !           158:        name = *hash( pUSE( Name ).StringValue , 0 );
        !           159:        porf = nllook( name );
        !           160:        if ( porf == NIL )
        !           161:            panic( "ParamCopy:nllook" );
        !           162:        pDEF( Typed ).TypedType = Type;
        !           163:        After = pNIL;
        !           164:        for ( idl = (int *)param[1] ; idl != NIL ; idl = (int *)idl[2] ) {
        !           165:            switch ( param[0] ) {
        !           166:                case T_PVAL:
        !           167:                    Param = pNewNode( ValPTAG , sizeof( struct ValPNode ) );
        !           168:                    break;
        !           169:                case T_PVAR:
        !           170:                    Param = pNewNode( VarPTAG , sizeof( struct VarPNode ) );
        !           171:                    break;
        !           172:                default:
        !           173:                    panic("ParamCopy:param[0]");
        !           174:            };
        !           175:            Name = sCopy( idl[1] );
        !           176:            pDEF( Param ).ParamDName = Name;
        !           177:            pDEF( Param ).ParamDType = Type;
        !           178:            chainlookup( porf , idl[1] ) -> inTree = Param;
        !           179:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           180:            pDEF( List ).ListItem = Param;
        !           181:            pDEF( List ).ListUp = After;
        !           182:            pDEF( List ).ListDown = pNIL;
        !           183:            if ( After == pNIL )
        !           184:                    pDEF( Typed ).TypedNames = List;
        !           185:              else  pDEF( After ).ListDown = List;
        !           186:            After = List;
        !           187:        }
        !           188:        return Typed;
        !           189:     }
        !           190: 
        !           191:     /*
        !           192:      * construct a list of LabelDNodes from a list of YINTs
        !           193:      */
        !           194: pPointer
        !           195: LabelDCopy( labels )
        !           196:     int        *labels;
        !           197:     {
        !           198:        int             *labelp;
        !           199:        pPointer        Label;
        !           200:        pPointer        Name;
        !           201:        pPointer        List;
        !           202:        pPointer        First;
        !           203:        pPointer        After;
        !           204: 
        !           205:        After = pNIL;
        !           206:        for ( labelp = labels ; labelp != NIL ; labelp = (int *) labelp[2] ) {
        !           207:            Label = pNewNode( LabelDTAG , sizeof( struct LabelDNode ) );
        !           208:            Name = sCopy( labelp[1] );
        !           209:            pDEF( Label ).LabelDName = Name;
        !           210:            nllook( labelp[1] ) -> inTree = Label;
        !           211:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           212:            pDEF( List ).ListItem = Label;
        !           213:            pDEF( List ).ListUp = After;
        !           214:            pDEF( List ).ListDown = pNIL;
        !           215:            if ( After == pNIL )
        !           216:                    First = List;
        !           217:              else  pDEF( After ).ListDown = List;
        !           218:            After = List;
        !           219:        }
        !           220:        return First;
        !           221:     }
        !           222: 
        !           223:     /*
        !           224:      * copy a constant declaration to a ConstDNode
        !           225:      */
        !           226: pPointer
        !           227: ConstDecl( id , decl )
        !           228:     char       *id;
        !           229:     int                *decl;
        !           230:     {
        !           231:        pPointer    Const = pNewNode( ConstDTAG , sizeof( struct ConstDNode ) );
        !           232:        pPointer    Name = sCopy( id );
        !           233:        pPointer    ConstValue = tCopy( decl );
        !           234: 
        !           235:        pDEF( Const ).ConstDName = Name;
        !           236:        pDEF( Const ).ConstDValue = ConstValue;
        !           237:        nllook( id ) -> inTree = Const;
        !           238:        return Const;
        !           239:     }
        !           240: 
        !           241:     /*
        !           242:      * copy a type declaration to a TypeDNode.
        !           243:      * note that pointers' types are filled in later.
        !           244:      */
        !           245: pPointer
        !           246: TypeDecl( id , decl )
        !           247:     char       *id;
        !           248:     int                *decl;
        !           249:     {
        !           250:        pPointer    Type = pNewNode( TypeDTAG , sizeof( struct TypeDNode ) );
        !           251:        pPointer    Name = sCopy( id );
        !           252:        pPointer    TypeType = tCopy( decl );
        !           253:        struct nl   *np = nllook( id );
        !           254:                
        !           255:        pDEF( Type ).TypeDName = Name;
        !           256:        pDEF( Type ).TypeDType = TypeType;
        !           257:        np -> inTree = Type;
        !           258:        if ( ( np -> type ) -> class == PTR ) {
        !           259:            ( np -> type ) -> inTree = TypeType;
        !           260:        }
        !           261:        return Type;
        !           262:     }
        !           263: 
        !           264:     /*
        !           265:      * copies a T_RFIELD node to a TypedNode
        !           266:      * with a type and a list of FieldDNodes
        !           267:      * rfield[0]       T_RFIELD
        !           268:      *       [1]       lineof ":"
        !           269:      *       [2]       id_list
        !           270:      *       [3]       type
        !           271:      * uses the extern inrecord to know which record its in.
        !           272:      */
        !           273: pPointer
        !           274: FieldCopy( rfield )
        !           275:     int        *rfield;
        !           276:     {
        !           277:        extern struct nl *inrecord;
        !           278:        pPointer    Typed = pNewNode( TypedTAG , sizeof( struct TypedNode ) );
        !           279:        int         *idlp;
        !           280:        pPointer    Type = tCopy( rfield[3] );
        !           281:        pPointer    List;
        !           282:        pPointer    After;
        !           283: 
        !           284:        pDEF( Typed ).TypedNames = pNIL;
        !           285:        pDEF( Typed ).TypedType = Type;
        !           286:        After = pNIL;
        !           287:        for ( idlp = (int *)rfield[2] ; idlp != NIL ; idlp = (int *)idlp[2] ) {
        !           288:            pPointer FieldD
        !           289:                        = pNewNode( FieldDTAG , sizeof( struct FieldDNode ) );
        !           290:            pPointer Name = sCopy( idlp[1] );
        !           291:            struct nl *field;
        !           292: 
        !           293:            if ( inrecord == NIL )
        !           294:                panic( "FieldCopy:inrecord" );
        !           295:            field = reclook( inrecord , idlp[1] );
        !           296:            if ( field == NIL )
        !           297:                panic( "FieldCopy:reclook" );
        !           298:            pDEF( FieldD ).FieldDName = Name;
        !           299:            pDEF( FieldD ).FieldDType = Type;
        !           300:            field -> inTree = FieldD;
        !           301:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           302:            pDEF( List ).ListItem = FieldD;
        !           303:            pDEF( List ).ListUp = After;
        !           304:            pDEF( List ).ListDown = pNIL;
        !           305:            if ( After == pNIL )
        !           306:                    pDEF( Typed ).TypedNames = List;
        !           307:              else  pDEF( After ).ListDown = List;
        !           308:            After = List;
        !           309:        }
        !           310:        return Typed;
        !           311:     }
        !           312: 
        !           313:     /*
        !           314:      * copies a T_VARPT node to a VarntNode and a FieldDNode
        !           315:      * varpt   [0]     T_TYVARPT
        !           316:      *         [1]     lineof "case"
        !           317:      *         [2]     tag id (or nil)
        !           318:      *         [3]     tag type
        !           319:      *         [4]     list of variant cases
        !           320:      * uses the extern inrecord to know which record its in.
        !           321:      */
        !           322: pPointer
        !           323: VarntCopy( tyvarpt )
        !           324:     int        *tyvarpt;
        !           325:     {
        !           326:        extern struct nl *inrecord;
        !           327:        pPointer Varnt = pNewNode( VarntTAG , sizeof( struct VarntNode ) );
        !           328:        pPointer Tag = pNewNode( FieldDTAG , sizeof( struct FieldDNode ) );
        !           329:        pPointer Name = sCopy( tyvarpt[2] );
        !           330:        pPointer Type = tCopy( tyvarpt[3] );
        !           331:        pPointer Cases = tCopy( tyvarpt[4] );
        !           332: 
        !           333:        pDEF( Tag ).FieldDName = Name;
        !           334:        pDEF( Tag ).FieldDType = Type;
        !           335:        if ( tyvarpt[2] != NIL )
        !           336:            reclook( inrecord , tyvarpt[2] ) -> inTree = Tag;
        !           337:        pDEF( Varnt ).VarntTag = Tag;
        !           338:        pDEF( Varnt ).VarntCases = Cases;
        !           339:        return Varnt;
        !           340:     }
        !           341: 
        !           342:     /*
        !           343:      * copies a T_TYSCAL node to an EnumTNode and a list of ScalDNodes
        !           344:      * tyscal  [0]     T_TYSCAL
        !           345:      *         [1]     lineof "("
        !           346:      *         [2]     id_list
        !           347:      */
        !           348: pPointer
        !           349: EnumTCopy( tyscal )
        !           350:     int *tyscal;
        !           351:     {
        !           352:        pPointer    EnumT = pNewNode( EnumTTAG , sizeof( struct EnumTNode ) );
        !           353:        pPointer    ScalD;
        !           354:        pPointer    Name;
        !           355:        int         *idp;
        !           356:        pPointer    List;
        !           357:        pPointer    After;
        !           358: 
        !           359:        After = pNIL;
        !           360:        for ( idp = (int *) tyscal[2] ; idp != NIL ; idp = (int *) idp[2] ) {
        !           361:            ScalD = pNewNode( ScalDTAG , sizeof( struct ScalDNode ) );
        !           362:            Name = sCopy( idp[1] );
        !           363:            pDEF( ScalD ).ScalDName = Name;
        !           364:            nllook( idp[1] ) -> inTree = ScalD;
        !           365:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           366:            pDEF( List ).ListItem = ScalD;
        !           367:            pDEF( List ).ListUp = After;
        !           368:            pDEF( List ).ListDown = pNIL;
        !           369:            if ( After == pNIL )
        !           370:                    pDEF( EnumT ).EnumTScalars = List;
        !           371:              else  pDEF( After ).ListDown = List;
        !           372:            After = List;
        !           373:        }
        !           374:        return EnumT;
        !           375:     }
        !           376: 
        !           377:     /*
        !           378:      * copies a variable declaration to a TypedNode
        !           379:      * with a type and a list of VarDNodes
        !           380:      * also, deals with previously declared (e.g. program files) variables.
        !           381:      */
        !           382: pPointer
        !           383: VarDecl( idl , type )
        !           384:     int        *idl;
        !           385:     int        *type;
        !           386:     {
        !           387:        pPointer    Typed = pNewNode( TypedTAG , sizeof( struct TypedNode ) );
        !           388:        int         *idlp;
        !           389:        struct nl   *var;
        !           390:        pPointer    VarD;
        !           391:        pPointer    Name;
        !           392:        pPointer    Type = tCopy( type );
        !           393:        pPointer    List;
        !           394:        pPointer    After;
        !           395: 
        !           396:        pDEF( Typed ).TypedNames = pNIL;
        !           397:        pDEF( Typed ).TypedType = Type;
        !           398:        After = pNIL;
        !           399:        for ( idlp = (int *) idl ; idlp != NIL ; idlp = (int *) idlp[2] ) {
        !           400:            if ( ( var = nllook( idlp[1] ) ) -> inTree == pNIL ) {
        !           401:                    /*
        !           402:                     *  usual case, a new variable
        !           403:                     */
        !           404:                    VarD = pNewNode( VarDTAG , sizeof( struct VarDNode ) );
        !           405:                    Name = sCopy( idlp[1] );
        !           406:                    pDEF( VarD ).VarDName = Name;
        !           407:                    var -> inTree = VarD;
        !           408:            } else {
        !           409:                    /*
        !           410:                     *  previously declared (file) variable, already in tree
        !           411:                     *  gets hung on list of variables, in addition
        !           412:                     */
        !           413:                    VarD = var -> inTree;
        !           414:            }
        !           415:            pDEF( VarD ).VarDType = Type;
        !           416:            if ( ( var -> type ) -> class == PTR ) {
        !           417:                ( var -> type ) -> inTree = Type;
        !           418:            }
        !           419:            List = pNewNode( ListTAG , sizeof( struct ListNode ) );
        !           420:            pDEF( List ).ListItem = VarD;
        !           421:            pDEF( List ).ListUp = After;
        !           422:            pDEF( List ).ListDown = pNIL;
        !           423:            if ( After == pNIL )
        !           424:                    pDEF( Typed ).TypedNames = List;
        !           425:              else  pDEF( After ).ListDown = List;
        !           426:            After = List;
        !           427:        }
        !           428:        return Typed;
        !           429:     }
        !           430: 
        !           431: 
        !           432:     /*
        !           433:      * initialize the pTree
        !           434:      * including cheapo versions of all the builtins (eech!)
        !           435:      */
        !           436: pTreeInit()
        !           437:     {
        !           438:        extern char     *in_consts[];
        !           439:        extern char     *in_types[];
        !           440:        extern char     *in_ctypes[];
        !           441:        extern char     *in_vars[];
        !           442:        extern char     *in_funcs[];
        !           443:        extern char     *in_procs[];
        !           444:        union pNodeBodies       *Glob;
        !           445:        pPointer        List;
        !           446:        char            **cp;
        !           447: 
        !           448:        nesting = 0;
        !           449:        PorFHeader[ nesting ] = pNewNode( GlobTAG , sizeof( struct GlobNode ) );
        !           450:        pWorld = PorFHeader[ nesting ];
        !           451:        pSeize( PorFHeader[ nesting ] );
        !           452:        Glob = &( pDEF( PorFHeader[ nesting ] ) );
        !           453:            /*
        !           454:             *  built in constants
        !           455:             */
        !           456:        dumpnl( NIL , "pTreeInit" );
        !           457:        List = pNIL;
        !           458:        for ( cp = in_consts ; *cp ; cp ++ ) {
        !           459:            pPointer BCon = pNewNode( BConstTAG , sizeof( struct BConstNode ) );
        !           460:            pPointer Name = sCopy( *cp );
        !           461: 
        !           462:            pDEF( BCon ).BConstName = Name;
        !           463:            List = ListAppend( List , BCon );
        !           464:            nllook( *cp ) -> inTree = BCon;
        !           465:        }
        !           466:        Glob -> GlobConsts = List;
        !           467:            /*
        !           468:             *  built in simple and constructed types
        !           469:             */
        !           470:        List = pNIL;
        !           471:            /*
        !           472:             *  simple types
        !           473:             */
        !           474:        for ( cp = in_types ; *cp ; cp ++ ) {
        !           475:            pPointer BType = pNewNode( BTypeTAG , sizeof( struct BTypeNode ) );
        !           476:            pPointer Name = sCopy( *cp );
        !           477: 
        !           478:            pDEF( BType ).BTypeName = Name;
        !           479:            List = ListAppend( List , BType );
        !           480:            nllook( *cp ) -> inTree = BType;
        !           481:        }
        !           482:            /*
        !           483:             *  constructed types (aren't any more difficult)
        !           484:             */
        !           485:        for ( cp = in_ctypes ; *cp ; cp ++ ) {
        !           486:            pPointer BType = pNewNode( BTypeTAG , sizeof( struct BTypeNode ) );
        !           487:            pPointer Name = sCopy( *cp );
        !           488: 
        !           489:            pDEF( BType ).BTypeName = Name;
        !           490:            List = ListAppend( List , BType );
        !           491:            nllook( *cp ) -> inTree = BType;
        !           492:        }
        !           493:        Glob -> GlobType = List;
        !           494:            /*
        !           495:             *  built in variables
        !           496:             */
        !           497:        List = pNIL;
        !           498:        for ( cp = in_vars ; *cp ; cp ++ ) {
        !           499:            pPointer BVar = pNewNode( BVarTAG , sizeof( struct BVarNode ) );
        !           500:            pPointer Name = sCopy( *cp );
        !           501: 
        !           502:            pDEF( BVar ).BVarName = Name;
        !           503:            List = ListAppend( List , BVar );
        !           504:            nllook( *cp ) -> inTree = BVar;
        !           505:        }
        !           506:        Glob -> GlobVars = List;
        !           507:            /*
        !           508:             *  built in functions and procedures
        !           509:             */
        !           510:        List = pNIL;
        !           511:            /*
        !           512:             *  built in functions
        !           513:             */
        !           514:        for ( cp = in_funcs ; *cp ; cp ++ ) {
        !           515:            pPointer BFunc = pNewNode( BFuncTAG , sizeof( struct BFuncNode ) );
        !           516:            pPointer Name = sCopy( *cp );
        !           517: 
        !           518:            pDEF( BFunc ).BFuncName = Name;
        !           519:            List = ListAppend( List , BFunc );
        !           520:            nllook( *cp ) -> inTree = BFunc;
        !           521:        }
        !           522:            /*
        !           523:             *  built in procedures
        !           524:             */
        !           525:        for ( cp = in_procs ; *cp ; cp ++ ) {
        !           526:            pPointer BProc = pNewNode( BProcTAG , sizeof( struct BProcNode ) );
        !           527:            pPointer Name = sCopy( *cp );
        !           528: 
        !           529:            pDEF( BProc ).BProcName = Name;
        !           530:            List = ListAppend( List , BProc );
        !           531:            nllook( *cp ) -> inTree = BProc;
        !           532:        }
        !           533:        Glob -> GlobPFs = List;
        !           534:        pRelease( PorFHeader[ nesting ] );
        !           535:     }
        !           536: 
        !           537:     /*
        !           538:      * find a symbol in the
        !           539:      * block structure symbol
        !           540:      * table and returns a pointer to
        !           541:      * its namelist entry.
        !           542:      * [this is a copy of lookup, except it calls nllook1
        !           543:      * whose only variation from lookup1 is that it doesn't set NUSED]
        !           544:      */
        !           545: struct nl *
        !           546: nllook(s)
        !           547:        register char *s;
        !           548: {
        !           549:        register struct nl *p;
        !           550:        register struct udinfo *udp;
        !           551: 
        !           552:        if (s == NIL) {
        !           553:                nocascade();
        !           554:                return (NIL);
        !           555:        }
        !           556:        p = nllook1(s);
        !           557:        if (p == NIL) {
        !           558:                derror("%s is undefined", s);
        !           559:                return (NIL);
        !           560:        }
        !           561:        if (p->class == FVAR) {
        !           562:                p = p->chain;
        !           563:                bn--;
        !           564:        }
        !           565:        return (p);
        !           566: }
        !           567: 
        !           568: /*
        !           569:  * an internal nllook.
        !           570:  * It is not an error to call nllook1 if the symbol is not defined.
        !           571:  * Also nllook1 will return FVARs while nllook never will.
        !           572:  * [this is a copy of lookup1, except that it doesn't set NUSED]
        !           573:  */
        !           574: 
        !           575: struct nl *
        !           576: nllook1(s)
        !           577:        register char *s;
        !           578: {
        !           579:        register struct nl *p;
        !           580: #      ifndef PI0
        !           581:            register struct nl *q;
        !           582: #      endif
        !           583:        register int i;
        !           584: 
        !           585:        if (s == NIL)
        !           586:                return (NIL);
        !           587:        bn = cbn;
        !           588: #ifndef PI0
        !           589:        /*
        !           590:         * We first check the field names
        !           591:         * of the currently active with
        !           592:         * statements (expensive since they
        !           593:         * are not hashed).
        !           594:         */
        !           595:        for (p = withlist; p != NIL; p = p->nl_next) {
        !           596:                q = p->type;
        !           597:                if (q == NIL)
        !           598:                        continue;
        !           599:                if (reclook(q, s) != NIL)
        !           600:                        /*
        !           601:                         * Return the WITHPTR, lvalue understands.
        !           602:                         */
        !           603:                        return (p);
        !           604:        }
        !           605: #endif
        !           606:        /*
        !           607:         * Symbol table is a 64 way hash
        !           608:         * on the low bits of the character
        !           609:         * pointer value. (Simple, but effective)
        !           610:         */
        !           611:        i = (int) s & 077;
        !           612:        for (p = disptab[i]; p != NIL; p = p->nl_next)
        !           613:                if (p->symbol == s && p->class != FIELD && p->class != BADUSE) {
        !           614:                        bn = (p->nl_block & 037);
        !           615:                        return (p);
        !           616:                }
        !           617:        return (NIL);
        !           618: }
        !           619: 
        !           620: #endif PTREE

unix.superglobalmegacorp.com

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