Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
thd_sarr.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "mrilib.h"
00008 #include "thd.h"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 int SARR_find_string( THD_string_array * sar , char * str )
00020 {
00021 return SARR_lookfor_string( sar , str , 0 ) ;
00022 }
00023
00024 int SARR_find_substring( THD_string_array * sar , char * str )
00025 {
00026 return SARR_lookfor_substring( sar , str , 0 ) ;
00027 }
00028
00029 int SARR_lookfor_string( THD_string_array * sar , char * str , int nstart )
00030 {
00031 int ii ;
00032
00033 if( sar == NULL || str == NULL ) return -1 ;
00034
00035 for( ii=nstart ; ii < sar->num ; ii++ ){
00036 if( sar->ar[ii] != NULL && strcmp(sar->ar[ii],str) == 0 )
00037 return ii ;
00038 }
00039 return -1 ;
00040 }
00041
00042 int SARR_lookfor_substring( THD_string_array * sar , char * sub , int nstart )
00043 {
00044 int ii ;
00045
00046 if( sar == NULL || sub == NULL ) return -1 ;
00047
00048 for( ii=nstart ; ii < sar->num ; ii++ ){
00049 if( sar->ar[ii] != NULL && strstr(sar->ar[ii],sub) != NULL )
00050 return ii ;
00051 }
00052 return -1 ;
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062 #ifndef DONT_USE_SCANDIR
00063 # ifdef SCANDIR_WANTS_CONST
00064 int THD_select_dirent( const struct dirent * dp )
00065 # else
00066 int THD_select_dirent( struct dirent * dp )
00067 # endif
00068 {
00069 if( dp == NULL || dp->d_name[0] == '\0' || dp->d_name[0] == '.' )
00070 return 0 ;
00071 return 1 ;
00072 }
00073 #endif
00074
00075 THD_string_array * THD_get_all_filenames( char * dirname )
00076 {
00077 #ifndef DONT_USE_SCANDIR
00078 struct dirent ** dplist=NULL ;
00079 #endif
00080 int nfiles , dlen , ii , n_fname , max_fname ;
00081 THD_string_array * star ;
00082 char * total_dirname , * total_fname ;
00083 char ** gname=NULL ;
00084
00085 ENTRY("THD_get_all_filenames") ;
00086
00087 if( dirname == NULL || (dlen=strlen(dirname)) == 0 ) RETURN( NULL );
00088 if( ! THD_is_directory(dirname) ) RETURN( NULL );
00089
00090 total_dirname = (char*)XtMalloc( dlen+4 ) ;
00091 strcpy( total_dirname , dirname ) ;
00092 if( total_dirname[dlen-1] != '/' ){
00093 total_dirname[dlen] = '/' ;
00094 total_dirname[++dlen] = '\0' ;
00095 }
00096
00097 #ifdef DONT_USE_SCANDIR
00098 total_dirname[dlen] = '*' ;
00099 total_dirname[++dlen] = '\0' ;
00100 MCW_warn_expand(0) ;
00101 if(PRINT_TRACING){
00102 char str[256]; sprintf(str,"MCW_file_expand(%s)",total_dirname); STATUS(str);
00103 }
00104 MCW_file_expand( 1, &total_dirname, &nfiles, &gname ) ;
00105 #else
00106 nfiles = scandir( dirname ,
00107 &dplist ,
00108 THD_select_dirent ,
00109 alphasort ) ;
00110 #endif
00111
00112 if( nfiles < 1 ){
00113 myXtFree( total_dirname ) ;
00114 #ifdef DONT_USE_SCANDIR
00115 if( gname != NULL ) free(gname) ;
00116 #else
00117 if( dplist != NULL ) free(dplist) ;
00118 #endif
00119 RETURN( NULL );
00120 }
00121
00122 INIT_SARR( star ) ;
00123
00124 #ifndef DONT_USE_SCANDIR
00125 max_fname = dlen+64 ;
00126 total_fname = (char*)XtMalloc( max_fname ) ;
00127 #endif
00128
00129 for( ii=0 ; ii < nfiles ; ii++ ){
00130 #ifdef DONT_USE_SCANDIR
00131 ADDTO_SARR( star , gname[ii] ) ;
00132 #else
00133 n_fname = dlen + strlen( dplist[ii]->d_name ) + 4 ;
00134 if( n_fname > max_fname ){
00135 total_fname = AFREALL(total_fname, char, n_fname ) ;
00136 max_fname = n_fname ;
00137 }
00138 strcpy( total_fname , total_dirname ) ;
00139 strcat( total_fname , dplist[ii]->d_name ) ;
00140 ADDTO_SARR( star , total_fname ) ;
00141 free( dplist[ii] ) ;
00142 #endif
00143 }
00144
00145 myXtFree( total_dirname ) ;
00146 #ifdef DONT_USE_SCANDIR
00147 MCW_free_expand( nfiles , gname ) ;
00148 #else
00149 myXtFree( total_fname ) ;
00150 free( dplist ) ;
00151 #endif
00152 RETURN( star );
00153 }
00154
00155
00156
00157
00158
00159
00160 THD_string_array * THD_get_all_subdirs( int lev , char * dirname )
00161 {
00162 int ii , jj , dlen ;
00163 THD_string_array * star , * flist , * dlist ;
00164 char * total_dirname ;
00165
00166 if( dirname == NULL || (dlen=strlen(dirname)) == 0 ) return NULL ;
00167
00168 total_dirname = (char*)XtMalloc( dlen+2 ) ;
00169 strcpy( total_dirname , dirname ) ;
00170 if( total_dirname[dlen-1] != '/' ){
00171 total_dirname[dlen] = '/' ;
00172 total_dirname[++dlen] = '\0' ;
00173 }
00174
00175 INIT_SARR( star ) ;
00176 ADDTO_SARR( star , total_dirname ) ;
00177
00178
00179
00180 if( lev <= 0 ) return star ;
00181
00182
00183
00184 flist = THD_get_all_filenames( total_dirname ) ;
00185 myXtFree(total_dirname) ;
00186
00187 if( flist == NULL ) return star ;
00188 if( flist->num == 0 ){ DESTROY_SARR(flist) ; return star ; }
00189
00190 dlist = THD_extract_directories( flist ) ;
00191 DESTROY_SARR(flist) ;
00192 if( dlist == NULL ) return star ;
00193 if( dlist->num == 0 ){ DESTROY_SARR(dlist) ; return star ; }
00194
00195 for( ii=0 ; ii < dlist->num ; ii++ ){
00196 flist = THD_get_all_subdirs( lev-1 , dlist->ar[ii] ) ;
00197 if( flist == NULL ) continue ;
00198 for( jj=0 ; jj < flist->num ; jj++ ){
00199 ADDTO_SARR( star , flist->ar[jj] ) ;
00200 }
00201 DESTROY_SARR(flist) ;
00202 }
00203
00204 DESTROY_SARR(dlist) ;
00205 return star ;
00206 }
00207
00208
00209
00210
00211
00212
00213 THD_string_array * THD_extract_regular_files( THD_string_array * star_in )
00214 {
00215 THD_string_array * star_out ;
00216 int ii ;
00217
00218 if( star_in == NULL || star_in->num <= 0 ) return NULL ;
00219
00220 INIT_SARR(star_out) ;
00221
00222 for( ii=0 ; ii < star_in->num ; ii++ ){
00223 if( THD_is_file(star_in->ar[ii]) )
00224 ADDTO_SARR( star_out , star_in->ar[ii] ) ;
00225 }
00226
00227 if( star_out->num == 0 ) DESTROY_SARR(star_out) ;
00228 return star_out ;
00229 }
00230
00231
00232
00233
00234
00235
00236 THD_string_array * THD_extract_directories( THD_string_array * star_in )
00237 {
00238 THD_string_array * star_out ;
00239 int ii ;
00240
00241 if( star_in == NULL || star_in->num <= 0 ) return NULL ;
00242
00243 INIT_SARR(star_out) ;
00244
00245 for( ii=0 ; ii < star_in->num ; ii++ ){
00246 if( THD_is_directory(star_in->ar[ii]) )
00247 ADDTO_SARR( star_out , star_in->ar[ii] ) ;
00248 }
00249
00250 if( star_out->num == 0 ) DESTROY_SARR(star_out) ;
00251 return star_out ;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260 THD_string_array * THD_normalize_flist( THD_string_array * star_in )
00261 {
00262 THD_string_array * star_out , * star_qqq ;
00263 static char rpath[2048] ;
00264 char * rp ;
00265 int ii , jj , nleft , skip_realpath=0 ;
00266
00267 if( star_in == NULL || star_in->num <= 0 ) return NULL ;
00268
00269 skip_realpath = AFNI_yesenv("AFNI_NOREALPATH") ;
00270
00271 INIT_SARR(star_out) ;
00272
00273 for( ii=0 ; ii < star_in->num ; ii++ ){
00274 if( skip_realpath ) rp = star_in->ar[ii] ;
00275 else rp = realpath( star_in->ar[ii] , rpath ) ;
00276
00277 if( rp != NULL ) ADDTO_SARR( star_out , rp ) ;
00278 }
00279
00280 if( star_out->num == 0 ){ DESTROY_SARR(star_out) ; return NULL ; }
00281
00282 nleft = 0 ;
00283 for( ii=0 ; ii < star_out->num ; ii++ ){
00284 rp = star_out->ar[ii] ;
00285 if( rp != NULL ){
00286 nleft++ ; jj = ii ;
00287 while( jj >= 0 ){
00288 jj = SARR_lookfor_string( star_out , rp , jj+1 ) ;
00289 if( jj >= 0 ) REMOVEFROM_SARR(star_out,jj) ;
00290 }
00291
00292 for( jj=ii+1 ; jj < star_out->num ; jj++ ){
00293 if( THD_equiv_files(rp,star_out->ar[jj]) )
00294 REMOVEFROM_SARR(star_out,jj) ;
00295 }
00296 }
00297 }
00298
00299 if( nleft == 0 ){ DESTROY_SARR(star_out) ; return NULL ; }
00300
00301 if( nleft == star_out->num ) return star_out ;
00302
00303 INIT_SARR(star_qqq) ;
00304 for( ii=0 ; ii < star_out->num ; ii++ ){
00305 rp = star_out->ar[ii] ;
00306 if( rp != NULL ) ADDTO_SARR(star_qqq,rp) ;
00307 }
00308
00309 #if 0
00310 fprintf(stderr,"\nTHD_normalize_flist: in=%d out=%d qqq=%d\n",
00311 star_in->num , star_out->num , star_qqq->num ) ;
00312 #endif
00313
00314 DESTROY_SARR(star_out) ; return star_qqq ;
00315 }
00316
00317
00318
00319
00320
00321 THD_string_array * THD_get_wildcard_filenames( char * pat )
00322 {
00323 int nfiles , ii ;
00324 THD_string_array * star ;
00325 char ** gname=NULL ;
00326
00327 if( pat == NULL || strlen(pat) == 0 ) return NULL ;
00328
00329 MCW_warn_expand(0) ;
00330 MCW_file_expand( 1, &pat, &nfiles, &gname ) ;
00331
00332 if( nfiles < 1 ){
00333 if( gname != NULL ) free(gname) ;
00334 return NULL ;
00335 }
00336
00337 INIT_SARR( star ) ;
00338
00339 for( ii=0 ; ii < nfiles ; ii++ ){
00340 ADDTO_SARR( star , gname[ii] ) ;
00341 }
00342
00343 MCW_free_expand( nfiles , gname ) ;
00344 return star ;
00345 }