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 }