Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
thd_getpathprogs.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002 #include "thd.h"
00003 
00004 static int               einit = 0 ;
00005 static THD_string_array *elist = NULL ;
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 char * THD_find_executable( char *ename )
00014 {
00015    char *etr , *str ;
00016    int ii ;
00017 
00018 ENTRY("THD_find_executable") ;
00019 
00020    if( !einit ){ einit = 1 ; elist = THD_getpathprogs(NULL) ; }
00021    if( elist == NULL ) RETURN(NULL) ;
00022 
00023    etr = THD_trailname( ename , 0 ) ;
00024 
00025    for( ii=0 ; ii < elist->num ; ii++ ){
00026       str = THD_trailname( elist->ar[ii] , 0 ) ;
00027       if( strcmp(str,etr) == 0 ) RETURN(elist->ar[ii]) ;
00028    }
00029 
00030    RETURN(NULL) ;
00031 }
00032 
00033 
00034 
00035 
00036 THD_string_array * THD_getpathprogs( THD_string_array *dlist )
00037 {
00038    int id , ii , ndir ;
00039    char *epath , *eee ;
00040    THD_string_array *elist , *tlist , *qlist ;
00041 
00042 ENTRY("THD_getpathprogs") ;
00043 
00044    
00045 
00046    epath = my_getenv( "PATH" ) ;
00047    ndir  = (dlist != NULL) ? dlist->num : 0 ;
00048 
00049    if( ndir == 0 && epath == NULL ) RETURN(NULL) ;
00050 
00051    INIT_SARR(elist) ;
00052    INIT_SARR(qlist) ;  
00053 
00054    
00055 
00056    for( id=0 ; id < ndir ; id++ ){
00057 
00058       tlist = THD_get_all_executables( dlist->ar[id] ) ;
00059       if( tlist == NULL ) continue ;
00060 
00061       for( ii=0 ; ii < tlist->num ; ii++ )  
00062          ADDTO_SARR( elist , tlist->ar[ii] ) ;
00063 
00064       ADDTO_SARR(qlist,dlist->ar[id]) ;     
00065 
00066       DESTROY_SARR(tlist) ;
00067    }
00068 
00069    
00070 
00071    if( epath != NULL ){
00072       int epos =0 , ll = strlen(epath) ;
00073       char *elocal ;
00074       char ename[THD_MAX_NAME] ;
00075 
00076       
00077 
00078       elocal = (char *) malloc( sizeof(char) * (ll+2) ) ;
00079       strcpy( elocal , epath ) ; elocal[ll] = ' ' ; elocal[ll+1] = '\0' ;
00080 
00081       
00082 
00083       for( ii=0 ; ii < ll ; ii++ )
00084          if( elocal[ii] == ':' ) elocal[ii] = ' ' ;
00085 
00086       
00087 
00088 
00089       do{
00090          ii = sscanf( elocal+epos , "%s%n" , ename , &id ) ;
00091          if( ii < 1 ) break ;  
00092          epos += id ;          
00093 
00094          ii = strlen(ename) ;                         
00095          if( ename[ii-1] != '/' ){                    
00096             ename[ii]  = '/' ; ename[ii+1] = '\0' ;
00097          }
00098          if( !THD_is_directory(ename) ) continue ;    
00099 
00100          
00101 
00102          for( ii=0 ; ii < qlist->num ; ii++ )
00103             if( THD_equiv_files(qlist->ar[ii],ename) ) break ;
00104          if( ii < qlist->num ) continue ;  
00105          ADDTO_SARR(qlist,ename) ;
00106 
00107          tlist = THD_get_all_executables( ename ) ; 
00108          if( tlist != NULL ){
00109             for( ii=0 ; ii < tlist->num ; ii++ )    
00110                ADDTO_SARR( elist , tlist->ar[ii] ) ;
00111             DESTROY_SARR(tlist) ;
00112          }
00113 
00114       } while( epos < ll ) ;  
00115 
00116       free(elocal) ;
00117    }
00118 
00119    if( SARR_NUM(elist) == 0 ) DESTROY_SARR(elist) ;
00120 
00121    DESTROY_SARR(qlist) ;  
00122    RETURN(elist) ;
00123 }
00124 
00125 
00126 
00127 
00128 THD_string_array * THD_get_all_executables( char *dname )
00129 {
00130    int ir , ll , ii ;
00131    char *fname , *tname ;
00132    float *far ;
00133    THD_string_array *outar, *alist, *rlist ;
00134 
00135 ENTRY("THD_get_all_executables") ;
00136 
00137    
00138 
00139    if( dname == NULL || strlen(dname) == 0 ) RETURN(NULL) ;
00140    INIT_SARR( outar ) ;
00141 
00142    
00143 
00144 if(PRINT_TRACING){
00145 char str[256];sprintf(str,"call THD_get_all_filenames(%s)",dname); STATUS(str);
00146 }
00147    alist = THD_get_all_filenames( dname ) ;
00148 
00149    if( alist == NULL ) RETURN(NULL) ;
00150 STATUS("call THD_extract_regular_files") ;
00151    rlist = THD_extract_regular_files( alist ) ;
00152    DESTROY_SARR( alist ) ;
00153    if( rlist == NULL ) RETURN(NULL) ;
00154 
00155    
00156 
00157    for( ir=0 ; ir < rlist->num ; ir++ ){
00158       fname = rlist->ar[ir] ;
00159       if( THD_is_executable(fname) &&
00160           !strstr(fname,".so")     &&
00161           !strstr(fname,".la")       ) ADDTO_SARR(outar,fname) ;
00162    }
00163 
00164    DESTROY_SARR(rlist) ;
00165 
00166    if( SARR_NUM(outar) == 0 ) DESTROY_SARR(outar) ;
00167 
00168    RETURN( outar );
00169 }