Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
NLfit_model.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "NLfit_model.h"
00021 
00022 
00023 #ifndef ALLOW_PLUGINS
00024 #  error "Plugins not properly set up -- see machdep.h"
00025 #endif
00026 
00027 #define EMPTY_STRING "\0"
00028 #define NL_DEBUG 0
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 NLFIT_MODEL_array * NLFIT_get_all_MODELs( char * dname )
00038 {
00039    THD_string_array * flist , * rlist ;
00040    int ir , ii ;
00041    char * fname , * suff ;
00042    NLFIT_MODEL_array * outar ;
00043    NLFIT_MODEL       * model ;
00044 
00045    
00046 
00047    if( dname == NULL || strlen(dname) == 0 )  return (NULL) ;
00048    if( ! THD_is_directory(dname) )            return (NULL) ;
00049 
00050    INIT_MODEL_ARRAY( outar ) ;
00051 
00052    if (NL_DEBUG)
00053      { 
00054        char str[256] ; 
00055        sprintf (str,"scanning directory %s \n",dname) ; 
00056        printf (str) ; 
00057      }
00058 
00059    
00060 
00061    flist = THD_get_all_filenames( dname ) ;
00062    if( flist == NULL || flist->num <= 0 ){
00063       DESTROY_SARR(flist) ;
00064       DESTROY_MODEL_ARRAY(outar) ;
00065       return (NULL) ;
00066    }
00067 
00068    rlist = THD_extract_regular_files( flist ) ;
00069    DESTROY_SARR(flist) ;
00070    if( rlist == NULL || rlist->num <= 0 ){
00071       DESTROY_SARR(rlist) ;
00072       DESTROY_MODEL_ARRAY(outar) ;
00073       return (NULL) ;
00074    }
00075 
00076   if (NL_DEBUG)
00077     { 
00078       char str[256] ; 
00079       sprintf(str,"%d files to scan \n",rlist->num) ; 
00080       printf (str) ; 
00081     }
00082 
00083 
00084    
00085 
00086    for( ir=0 ; ir < rlist->num ; ir++ ){
00087       fname = rlist->ar[ir] ; if( fname == NULL ) continue ;
00088       if (strstr(fname, "model") == NULL)  continue;
00089 
00090       suff = strstr(fname,DYNAMIC_suffix) ;
00091       if( suff != NULL  &&  strlen(suff) == strlen(DYNAMIC_suffix)){
00092          model  = NLFIT_read_MODEL( fname ) ;
00093          if( model != NULL ) ADDTO_MODEL_ARRAY( outar , model ) ;
00094       }
00095    }
00096 
00097   if (NL_DEBUG)
00098     { 
00099       char str[256] ;
00100       sprintf (str,"directory %s has %d MODELs \n",dname,outar->num) ; 
00101       printf (str) ; 
00102     }
00103 
00104 
00105    DESTROY_SARR(rlist) ;
00106    if( outar->num == 0 ) DESTROY_MODEL_ARRAY(outar) ;
00107    return (outar) ;
00108 }
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 NLFIT_MODEL * NLFIT_read_MODEL( char * fname )
00117 {
00118    NLFIT_MODEL * model ;
00119    static int firsterr=1 ;
00120 
00121    
00122 
00123    if( fname == NULL || strlen(fname) == 0 )  return (NULL) ;
00124    if( ! THD_is_file(fname) )                 return (NULL) ;
00125 
00126    
00127 
00128    model = (NLFIT_MODEL *) XtMalloc( sizeof(NLFIT_MODEL) ) ;
00129    model->type = NLFIT_MODEL_TYPE ;
00130 
00131    
00132 
00133    MCW_strncpy( model->libname , fname , MAX_MODEL_NAME ) ;
00134 
00135    
00136 
00137    DYNAMIC_OPEN( fname , model->libhandle ) ;
00138    if( ! ISVALID_DYNAMIC_handle( model->libhandle ) ){
00139       char *er ;
00140       if( firsterr ){ fprintf(stderr,"\n"); firsterr=0; }
00141       fprintf (stderr,"failed to open library %s ",fname); 
00142       er = (char *)DYNAMIC_ERROR_STRING ;
00143       if( er != NULL ) fprintf(stderr," -- %s\n",er) ;
00144       else             fprintf(stderr,"\n") ;
00145       myXtFree(model) ;
00146       return (NULL) ;
00147    }
00148 
00149    if (NL_DEBUG)
00150      { 
00151        char str[256] ;
00152        sprintf (str,"opened library %s with handle %p \n" , 
00153                fname,model->libhandle ) ;
00154        printf (str) ; 
00155      }
00156 
00157 
00158    
00159    
00160    
00161 
00162 #ifndef NEED_UNDERSCORE
00163    DYNAMIC_SYMBOL(model->libhandle, "initialize_model" , 
00164                   model->libinit_func );
00165 #else
00166    DYNAMIC_SYMBOL(model->libhandle, "_initialize_model" , 
00167                   model->libinit_func );
00168 #endif
00169 
00170    
00171 
00172    if( model->libinit_func == (vptr_func *) NULL ){
00173       char *er = (char *)DYNAMIC_ERROR_STRING ;
00174       if( firsterr ){ fprintf(stderr,"\n"); firsterr=0; }
00175       fprintf(stderr,"model %s lacks initialize_model() function\n",fname) ;
00176       if( er != NULL ) fprintf(stderr," -- %s\n",er) ;
00177       DYNAMIC_CLOSE( model->libhandle ) ;
00178       myXtFree(model) ;
00179       return (NULL) ;
00180    }
00181 
00182    
00183 
00184    model->interface = (MODEL_interface *) model->libinit_func() ;
00185    if( model->interface == NULL ) 
00186      {
00187        DYNAMIC_CLOSE( model->libhandle ) ;
00188        myXtFree(model) ;
00189        return (NULL) ;
00190      }
00191 
00192    if (NL_DEBUG)
00193      { 
00194        char str[256] ;
00195        sprintf (str,"Interface created for %s model\n",
00196                 model->interface->label) ; 
00197        printf (str) ; 
00198      }
00199 
00200    
00201 
00202    return (model) ;
00203 }
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 NLFIT_MODEL_array * NLFIT_get_many_MODELs(void)
00212 {
00213    char * epath , * elocal , * eee ;
00214    char ename[THD_MAX_NAME] , efake[]="/usr/local/lib/afni:./" ;
00215    NLFIT_MODEL_array * outar , * tmpar ;
00216    int epos , ll , ii , id ;
00217    THD_string_array *qlist ;  
00218 
00219    
00220 
00221    epath = my_getenv("AFNI_MODELPATH") ;     
00222 
00223    if( epath == NULL )
00224       epath = my_getenv("AFNI_PLUGINPATH") ; 
00225 
00226    if( epath == NULL )
00227       epath = my_getenv("PATH") ;             
00228 
00229    if( epath == NULL ) epath = efake ;     
00230 
00231    
00232 
00233    ll = strlen(epath) ;
00234    elocal = (char *) XtMalloc( sizeof(char) * (ll+2) ) ;
00235 
00236    
00237 
00238    strcpy( elocal , epath ) ; elocal[ll] = ' ' ; elocal[ll+1] = '\0' ;
00239 
00240    
00241 
00242    for( ii=0 ; ii < ll ; ii++ )
00243       if( elocal[ii] == ':' ) elocal[ii] = ' ' ;
00244 
00245    if (NL_DEBUG)
00246      { 
00247        printf ("paths to be searched for MODELs follow:") ;
00248        printf("%s\n",elocal) ; 
00249        fflush(stdout) ; 
00250      }
00251 
00252 
00253    INIT_SARR(qlist) ; 
00254 
00255    
00256 
00257 
00258    INIT_MODEL_ARRAY( outar ) ;
00259    epos = 0 ;
00260 
00261    do{
00262       ii = sscanf( elocal+epos , "%s%n" , ename , &id ) ; 
00263       if( ii < 1 || id < 1 ) break ;                     
00264       epos += id ;                               
00265 
00266       if( !THD_is_directory(ename) ) continue ;  
00267 
00268       
00269 
00270       for( ii=0 ; ii < qlist->num ; ii++ )
00271          if( THD_equiv_files(qlist->ar[ii],ename) ) break ;
00272       if( ii < qlist->num ) continue ;
00273       ADDTO_SARR(qlist,ename) ;
00274 
00275       ii = strlen(ename) ;                           
00276       if( ename[ii-1] != '/' ){                     
00277         ename[ii]  = '/' ; ename[ii+1] = '\0' ; 
00278       }
00279 
00280       tmpar = NLFIT_get_all_MODELs( ename ) ;        
00281       if( tmpar != NULL ){
00282          for( ii=0 ; ii < tmpar->num ; ii++ )     
00283             ADDTO_MODEL_ARRAY( outar , tmpar->modar[ii] ) ;
00284 
00285          FREE_MODEL_ARRAY(tmpar) ;                      
00286       }
00287    } while( epos < ll ) ;  
00288 
00289    myXtFree(elocal) ;
00290 
00291    if (NL_DEBUG)
00292      { 
00293        char str[256] ; 
00294        sprintf (str,"found %d MODELs \n",outar->num) ; 
00295        printf (str) ; 
00296      }
00297 
00298    if( outar->num == 0 ) DESTROY_MODEL_ARRAY(outar) ;
00299 
00300    DESTROY_SARR(qlist) ; 
00301    return (outar) ;
00302 }
00303 
00304