Pastey A portable dsearch.exw
- Posted by SDPringle Apr 17, 2013
--**** -- === win32/dsearch.exw -- -- search for a .DLL that contains a given routine -- ==== Usage -- {{{ -- eui dsearch [routine] -- }}} -- -- If you don't supply a string on the command line you will be prompted -- for it. -- -- A list of files and directories located where we expect to find -- dynamic loading libraries sequence dll_list dll_list = {} include std/filesys.e include std/dll.e include std/machine.e -- because various operating systems use distinct extensions for dlls we cannot -- use *.so in the library listing. So, we must later ignore if it cannot open -- files (as we don't know which ones are valid) sequence file_list = dir(`c:\windows\system32\*.dll`) & dir(`/usr/lib/*`) & dir(`/usr/local/lib/*`) for i = 1 to length(file_list) do if atom(file_list[i]) then continue end if dll_list = append( dll_list, file_list[i][D_NAME] ) end for constant KEYBOARD = 0, SCREEN = 1 type enum boolean TRUE = 1, FALSE = 0 end type sequence cmd, orig_string integer scanned, no_open scanned = 0 no_open = 0 atom string_pointer sequence routine_name function scan(sequence file_name) -- as boolean -- process an eligible file atom lib lib = open_dll(file_name) if lib = 0 then no_open += 1 ifdef WINDOWS then puts(SCREEN, file_name & ": Couldn't open.\n") end ifdef return FALSE end if scanned += 1 if define_c_var(lib, routine_name) != -1 then printf(SCREEN, "%s: ", {file_name}) printf(SCREEN, "\n\n%s was FOUND in %s\n", {routine_name, file_name}) return TRUE end if return FALSE end function function delete_trailing_white(sequence name) -- as sequence -- get rid of blanks, tabs, newlines at end of string while length(name) > 0 do if find(name[length(name)], "\n\r\t ") then name = name[1..length(name)-1] else exit end if end while return name end function cmd = command_line() -- eui dsearch [string] if length(cmd) >= 3 then orig_string = cmd[3] else puts(SCREEN, "C function name:") orig_string = delete_trailing_white(gets(KEYBOARD)) puts(SCREEN, '\n') end if routine_name = orig_string procedure locate(sequence name) routine_name = name puts(1, "Looking for " & routine_name & "\n ") for i = 1 to length(dll_list) do if scan(dll_list[i]) then if getc(KEYBOARD) then end if abort(1) end if end for puts(1, '\n') end procedure if length(routine_name) = 0 then abort(0) end if locate(orig_string) ifdef WINDOWS then locate(orig_string & "A") locate(orig_string & "Ex") locate(orig_string & "ExA") end ifdef puts(1, "\nCouldn't find " & orig_string & '\n') puts(1, "Press Enter\n") if getc(KEYBOARD) then end if


