!+ ! Tools Group ! Space Telescope Science Institute ! 3700 San Martin Drive ! Baltimore, MD 21218 ! ! NAME ! FIND_MODULE_IN_LIBRARY ! ! DESCRIPTION ! This routine searches a library for some module. ! It is used to build up library dependencies for ! source. It opens a library as infrequent as ! possible via use of SCAN STATICs. ! ! RETURN VALUE ! ! HISTORY ! 11/88 Bauer First cut. !- MODULE FIND_MODULE_IN_LIBRARY; ! ! Constant Declarations ! CONSTANT LBR$_NORMAL EXTERNAL INTEGER; CONSTANT LBR$_KEYNOTFND EXTERNAL INTEGER; CONSTANT LBR$_ILLFUNC EXTERNAL INTEGER; CONSTANT LBR$_ILLTYP EXTERNAL INTEGER; CONSTANT LBR$_TOOMNYLIB EXTERNAL INTEGER; CONSTANT LBR$C_READ = 1; ! EXTERNAL INTEGER; CONSTANT LBR$C_TYP_MLB = 2; ! EXTERNAL INTEGER; CONSTANT LBR$C_TYP_OBJ = 1; ! EXTERNAL INTEGER; CONSTANT LBR$C_TYP_HLP = 3; ! EXTERNAL INTEGER; CONSTANT LBR$C_TYP_TXT = 4; ! EXTERNAL INTEGER; CONSTANT LBR$C_TYP_UNK = 0; ! EXTERNAL INTEGER; CONSTANT SS$_NORMAL EXTERNAL INTEGER; EXTERNAL PROCEDURE LBR$INI_CONTROL (INTEGER, INTEGER, INTEGER) OF INTEGER; EXTERNAL PROCEDURE LBR$OPEN (INTEGER, STRING) OF INTEGER; EXTERNAL PROCEDURE LBR$CLOSE (INTEGER); EXTERNAL PROCEDURE LBR$LOOKUP_KEY (INTEGER, STRING, INTEGER) OF INTEGER; EXTERNAL PROCEDURE filescan (STRING, STRING, STRING, STRING, STRING, STRING, STRING); ! ! --- Global data --- ! DECLARE library_index, library_func, library_type, dummy : INTEGER; ! ! --- PROCEDURE definitions --- ! PROCEDURE define_library_type (extension : STRING, lib_type : INTEGER); IF extension = '.MLB' THEN lib_type = LBR$C_TYP_MLB; ELSE IF extension = '.OLB' THEN lib_type = LBR$C_TYP_OBJ; ELSE IF extension = '.HLB' THEN lib_type = LBR$C_TYP_HLP; ELSE IF extension = '.TLB' THEN lib_type = LBR$C_TYP_TXT; ELSE lib_type = LBR$C_TYP_UNK; END IF; END IF; END IF; END IF; END PROCEDURE; PROCEDURE find_module_in_library (module_name : STRING, library_name : STRING ) OF BOOLEAN; DECLARE node, disk, directory, filename, extension, version : STRING; DECLARE status : INTEGER; DECLARE old_library : STATIC STRING; CALL filescan (library_name, node, disk, directory, filename, extension, version); CALL define_library_type (extension, library_type); library_func = LBR$C_READ; status = LBR$_NORMAL; IF old_library <> library_name THEN IF old_library <> '' THEN CALL LBR$CLOSE(library_index); END IF; status = LBR$INI_CONTROL (library_index, library_func, library_type); END IF; ! write 'Status 1 = ', status; IF status = LBR$_NORMAL THEN status = LBR$_NORMAL; IF old_library <> library_name THEN status = LBR$OPEN (library_index, library_name); END IF; ! write 'Status 2 = ', status; IF status = LBR$_NORMAL THEN status = LBR$LOOKUP_KEY (library_index, module_name, dummy); IF status = SS$_NORMAL THEN old_library = library_name; RETURN TRUE; END IF; END IF; END IF; old_library = library_name; RETURN FALSE; END PROCEDURE; PROCEDURE search_libraries_for_module (module_name : STRING, found_in_library : STRING); DECLARE library_tree_count : EXTERNAL INTEGER; DECLARE library_tree : EXTERNAL TREE (INTEGER) OF STRING; DECLARE i : INTEGER; FOR i = 1 to library_tree_count STEP 1; IF find_module_in_library (module_name, library_tree(i)) THEN found_in_library = library_tree(i); RETURN; END IF; END FOR; found_in_library = ''; END PROCEDURE; END MODULE;