/** return ref'd entities */ static void SCHEMA_get_entities_ref( Scope scope, Linked_List result ) { Rename * rename; DictionaryEntry de; if( scope->search_id == __SCOPE_search_id ) { return; } scope->search_id = __SCOPE_search_id; ENTITY_MARK++; /* fully REF'd schema */ LISTdo( scope->u.schema->ref_schemas, schema, Schema ) SCOPE_get_entities( schema, result ); /* don't go down remote schema's ref_schemas */ LISTod /* partially REF'd schema */ DICTdo_init( scope->u.schema->refdict, &de ); while( 0 != ( rename = ( Rename * )DICTdo( &de ) ) ) { if( DICT_type == OBJ_ENTITY ) { LISTadd_last( result, rename->object ); } } }
/** * \sa SCOPEget_rules() */ void SCOPE_get_rules( Scope scope, Linked_List result ) { DictionaryEntry de; Generic x; DICTdo_type_init( scope->symbol_table, &de, OBJ_RULE ); while( 0 != ( x = DICTdo( &de ) ) ) { LISTadd_last( result, x ); } }
void SCHEMAadd_use( Schema cur_schema, Symbol * ref_schema, Symbol * old, Symbol * snnew ) { Rename * r = REN_new(); r->schema_sym = ref_schema; r->old = old; r->nnew = snnew; r->rename_type = use; if( !cur_schema->u.schema->uselist ) { cur_schema->u.schema->uselist = LISTcreate(); } LISTadd_last( cur_schema->u.schema->uselist, ( Generic )r ); }
/** * \sa SCOPEget_entities_superclass_order() */ void SCOPE_dfs( Dictionary symbols, Entity root, Linked_List result ) { Entity ent; if( ( ENTITYget_mark( root ) != ENTITY_MARK ) ) { ENTITYput_mark( root, ENTITY_MARK ); LISTdo( ENTITYget_supertypes( root ), super, Entity ) /* if super explicitly defined in scope, recurse. */ /* this chops out USEd and REFd entities */ if( ( ent = ( Entity )DICTlookup( symbols, ENTITYget_name( super ) ) ) != ENTITY_NULL ) { SCOPE_dfs( symbols, ent, result ); } LISTod LISTadd_last( result, ( Generic )root ); }
Generic LISTadd_before( Linked_List list, Link link, Generic item ) { Link node; if( link == LINK_NULL ) { LISTadd_last( list, item ); } else { node = LINK_new(); node->data = item; link->prev->next = node; /* fix up previous link */ node->prev = link->prev; node->next = link; link->prev = node; /* fix up next link */ } return item; }
Linked_List SELgetnew_dmlist( const Type type ) { Linked_List complete = SEL_TYPEget_items( type ); Linked_List newlist = LISTcreate(); LISTdo( complete, t, Type ) /* if t\'s underlying type is not already in newlist, */ if( ! utype_member( newlist, t, 0 ) ) { LISTadd_last( newlist, t ); } LISTod; return newlist; }
static void SCHEMA_get_entities_use( Scope scope, Linked_List result ) { DictionaryEntry de; Rename * rename; if( scope->search_id == __SCOPE_search_id ) { return; } scope->search_id = __SCOPE_search_id; /* fully USE'd schema */ LISTdo( scope->u.schema->use_schemas, schema, Schema ) SCOPE_get_entities( schema, result ); SCHEMA_get_entities_use( schema, result ); LISTod /* partially USE'd schema */ if( scope->u.schema->usedict ) { DICTdo_init( scope->u.schema->usedict, &de ); while( 0 != ( rename = ( Rename * )DICTdo( &de ) ) ) { LISTadd_last( result, rename->object ); } } }