Doxygen Source Code Documentation
thd_intlist.c File Reference
#include "mrilib.h"Go to the source code of this file.
| Defines | |
| #define | ISEND(c) ( (c)==']' || (c)=='}' || (c)=='\0' ) | 
| Functions | |
| void | MCW_intlist_allow_negative (int iii) | 
| int * | MCW_get_intlist (int nvals, char *str) | 
| Variables | |
| int | allow_negative = 0 | 
Define Documentation
| 
 | 
| Stopping criterion for MCW_get_intlist() Definition at line 20 of file thd_intlist.c. Referenced by MCW_get_intlist(). | 
Function Documentation
| 
 | ||||||||||||
| Get an integer list in the range 0..(nvals-1), from the character string str. If we call the output pointer fred, then fred[0] = number of integers in the list (> 0), and fred[i] = i-th integer in the list for i=1..fred[0]. If on return, fred == NULL or fred[0] == 0, then something is wrong, and the caller must deal with that. Syntax of input string: 
 Definition at line 46 of file thd_intlist.c. References allow_negative, free, ISEND, malloc, and realloc. Referenced by CALC_read_opts(), main(), mri_read_1D(), SYM_expand_ranges(), and THD_open_dataset(). 
 00047 {
00048    int *subv = NULL ;
00049    int ii , ipos , nout , slen ;
00050    int ibot,itop,istep , nused ;
00051    char *cpt ;
00052 
00053    /* Meaningless input? */
00054 
00055    if( nvals < 1 ) return NULL ;
00056 
00057    /* No selection list? */
00058 
00059    if( str == NULL || str[0] == '\0' ) return NULL ;
00060 
00061    /* skip initial '[' or '{' */
00062 
00063    subv    = (int *) malloc( sizeof(int) * 2 ) ;
00064    subv[0] = nout = 0 ;
00065 
00066    ipos = 0 ;
00067    if( str[ipos] == '[' || str[ipos] == '{' ) ipos++ ;
00068 
00069    /*** loop through each sub-selector until end of input ***/
00070 
00071    slen = strlen(str) ;
00072    while( ipos < slen && !ISEND(str[ipos]) ){
00073 
00074       while( isspace(str[ipos]) ) ipos++ ;   /* skip blanks */
00075       if( ISEND(str[ipos]) ) break ;         /* done */
00076 
00077       /** get starting value **/
00078 
00079       if( str[ipos] == '$' ){  /* special case */
00080          ibot = nvals-1 ; ipos++ ;
00081       } else {                 /* decode an integer */
00082          ibot = strtol( str+ipos , &cpt , 10 ) ;
00083          if( ibot < 0 && !allow_negative ){
00084            fprintf(stderr,"** ERROR: sub-brick index %d is out of range 0..%d\n",
00085                    ibot,nvals-1) ;
00086            free(subv) ; return NULL ;
00087          }
00088          if( ibot >= nvals ){
00089            fprintf(stderr,"** ERROR: sub-brick index %d is out of range 0..%d\n",
00090                    ibot,nvals-1) ;
00091            free(subv) ; return NULL ;
00092          }
00093          nused = (cpt-(str+ipos)) ;
00094          if( ibot == 0 && nused == 0 ){
00095            fprintf(stderr,"** ERROR: sub-brick syntax error '%s'\n",str+ipos) ;
00096            free(subv) ; return NULL ;
00097          }
00098          ipos += nused ;
00099       }
00100 
00101       while( isspace(str[ipos]) ) ipos++ ;   /* skip blanks */
00102 
00103       /** if that's it for this sub-selector, add one value to list **/
00104 
00105       if( str[ipos] == ',' || ISEND(str[ipos]) ){
00106          nout++ ;
00107          subv = (int *) realloc( (char *)subv , sizeof(int) * (nout+1) ) ;
00108          subv[0]    = nout ;
00109          subv[nout] = ibot ;
00110          if( ISEND(str[ipos]) ) break ; /* done */
00111          ipos++ ; continue ;            /* re-start loop at next sub-selector */
00112       }
00113 
00114       /** otherwise, must have '..' or '-' as next inputs **/
00115 
00116       if( str[ipos] == '-' ){
00117          ipos++ ;
00118       } else if( str[ipos] == '.' && str[ipos+1] == '.' ){
00119          ipos++ ; ipos++ ;
00120       } else {
00121          fprintf(stderr,"** ERROR: sub-brick selector syntax is bad: '%s'\n",
00122                  str+ipos) ;
00123          free(subv) ; return NULL ;
00124       }
00125 
00126       /** get ending value for loop now **/
00127 
00128       if( str[ipos] == '$' ){  /* special case */
00129          itop = nvals-1 ; ipos++ ;
00130       } else {                 /* decode an integer */
00131          itop = strtol( str+ipos , &cpt , 10 ) ;
00132          if( itop < 0 && !allow_negative ){
00133            fprintf(stderr,"** ERROR: sub-brick index %d is out of range 0..%d\n",
00134                    itop,nvals-1) ;
00135            free(subv) ; return NULL ;
00136          }
00137          if( itop >= nvals ){
00138            fprintf(stderr,"** ERROR: sub-brick index %d is out of range 0..%d\n",
00139                    itop,nvals-1) ;
00140            free(subv) ; return NULL ;
00141          }
00142          nused = (cpt-(str+ipos)) ;
00143          if( itop == 0 && nused == 0 ){
00144            fprintf(stderr,"** ERROR: sub-brick syntax error '%s'\n",str+ipos) ;
00145            free(subv) ; return NULL ;
00146          }
00147          ipos += nused ;
00148       }
00149 
00150       /** set default loop step **/
00151 
00152       istep = (ibot <= itop) ? 1 : -1 ;
00153 
00154       while( isspace(str[ipos]) ) ipos++ ;                  /* skip blanks */
00155 
00156       /** check if we have a non-default loop step **/
00157 
00158       if( str[ipos] == '(' ){  /* decode an integer */
00159          ipos++ ;
00160          istep = strtol( str+ipos , &cpt , 10 ) ;
00161          if( istep == 0 ){
00162            fprintf(stderr,"** ERROR: sub-brick loop step is 0!\n") ;
00163            free(subv) ; return NULL ;
00164          }
00165          nused = (cpt-(str+ipos)) ;
00166          ipos += nused ;
00167          if( str[ipos] == ')' ) ipos++ ;
00168          if( (ibot-itop)*istep > 0 ){
00169            fprintf(stderr,"** WARNING: sub-brick count '%d..%d(%d)' means nothing!\n",
00170                    ibot,itop,istep ) ;
00171          }
00172       }
00173 
00174       /** add values to output **/
00175 
00176       for( ii=ibot ; (ii-itop)*istep <= 0 ; ii += istep ){
00177          nout++ ;
00178          subv = (int *) realloc( (char *)subv , sizeof(int) * (nout+1) ) ;
00179          subv[0]    = nout ;
00180          subv[nout] = ii ;
00181       }
00182 
00183       /** check if we have a comma to skip over **/
00184 
00185       while( isspace(str[ipos]) ) ipos++ ;                  /* skip blanks */
00186       if( str[ipos] == ',' ) ipos++ ;                       /* skip commas */
00187 
00188    }  /* end of loop through selector string */
00189 
00190    if( subv[0] == 0 ){ free(subv); subv = NULL; }
00191    return subv ;
00192 }
 | 
| 
 | 
| Allow negative indexes in MCW_get_intlist() Definition at line 13 of file thd_intlist.c. References allow_negative. Referenced by CALC_read_opts(), and SYM_expand_ranges(). 
 00014 {
00015    allow_negative = iii ; return ;
00016 }
 | 
Variable Documentation
| 
 | 
| 
 Definition at line 9 of file thd_intlist.c. Referenced by MCW_get_intlist(), and MCW_intlist_allow_negative(). | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  