1 /* L O O K U P R O U T I N E S */
17 register struct def *df;
19 struct idf *id= df->df_idf;
20 struct def *df1 = id->id_def;
22 if( df1 == df ) id->id_def = df->df_next;
24 while( df1 && df1->df_next != df ) df1 = df1->df_next;
25 df1->df_next = df->df_next;
31 lookup(id, scope, inuse)
32 register struct idf *id;
36 /* Look up a definition of an identifier in scope "scope".
37 Make the "def" list self-organizing.
38 Return a pointer to its "def" structure if it exists,
41 register struct def *df, *df1;
43 /* Look in the chain of definitions of this "id" for one with scope
46 for( df = id->id_def, df1 = 0;
47 df && df->df_scope != scope;
48 df1 = df, df = df->df_next ) { /* nothing */ }
54 /* Put the definition in front
56 df1->df_next = df->df_next;
57 df->df_next = id->id_def;
60 while( df->df_kind & inuse ) {
61 assert(df->usd_def != 0);
70 lookfor(id, vis, give_error)
71 register struct node *id;
72 struct scopelist *vis;
74 /* Look for an identifier in the visibility range started by "vis".
75 If it is not defined create a dummy definition and
76 if give_error is set, give an error message.
78 register struct def *df, *tmp_df;
79 register struct scopelist *sc = vis;
82 df = lookup(id->nd_IDF, sc->sc_scope, D_INUSE);
84 while( vis->sc_scope->sc_level >
85 sc->sc_scope->sc_level ) {
86 if( tmp_df = define(id->nd_IDF, vis->sc_scope,
89 vis = nextvisible(vis);
91 /* Since the scope-level of standard procedures is the
92 * same as for the user-defined procedures, the procedure
93 * must be marked as used. Not doing so would mean that
94 * such a procedure could redefined after usage.
96 if( (vis->sc_scope == GlobalScope) &&
97 !lookup(id->nd_IDF, GlobalScope, D_INUSE) ) {
98 if( tmp_df = define(id->nd_IDF, vis->sc_scope,
100 tmp_df->usd_def = df;
105 sc = nextvisible(sc);
108 if( give_error ) id_not_declared(id);
110 df = MkDef(id->nd_IDF, vis->sc_scope, D_ERROR);