Doxygen Source Code Documentation
l_mcw_glob.h File Reference
#include <string.h>
#include "mcw_malloc.h"
Go to the source code of this file.
Data Structures | |
struct | glob_t |
Defines | |
#define | MCW_free_wildcards(a, b) MCW_free_expand(a,b) |
#define | GLOB_APPEND 0x001 |
#define | GLOB_DOOFFS 0x002 |
#define | GLOB_ERR 0x004 |
#define | GLOB_MAGCHAR 0x008 |
#define | GLOB_MARK 0x010 |
#define | GLOB_NOCHECK 0x020 |
#define | GLOB_NOSORT 0x040 |
#define | GLOB_QUOTE 0x080 |
#define | GLOB_NOMAGIC 0x100 |
#define | GLOB_ALTNOT 0x200 |
#define | GLOB_NOSPACE (-1) |
#define | GLOB_ABEND (-2) |
Functions | |
int | rglob_set_sort_dir (int dir) |
void | MCW_file_expand (int nin, char **fin, int *nout, char ***fout) |
void | MCW_free_expand (int gnum, char **gout) |
void | MCW_warn_expand (int www) |
void | MCW_wildcards (char *fnam, int *nout, char ***fout) |
int | glob (const char *, int, int(*)(char *, int), glob_t *) |
void | globfree (glob_t *) |
Define Documentation
|
Definition at line 74 of file l_mcw_glob.h. |
|
Definition at line 71 of file l_mcw_glob.h. |
|
Definition at line 61 of file l_mcw_glob.h. |
|
Definition at line 62 of file l_mcw_glob.h. |
|
Definition at line 63 of file l_mcw_glob.h. |
|
Definition at line 64 of file l_mcw_glob.h. |
|
Definition at line 65 of file l_mcw_glob.h. |
|
Definition at line 66 of file l_mcw_glob.h. |
|
Definition at line 69 of file l_mcw_glob.h. |
|
Definition at line 67 of file l_mcw_glob.h. |
|
Definition at line 73 of file l_mcw_glob.h. |
|
Definition at line 68 of file l_mcw_glob.h. |
|
Definition at line 50 of file l_mcw_glob.h. |
Function Documentation
|
Definition at line 295 of file mcw_glob.c. References __P, ALTNOT, c, CHAR, Char, compare(), EOS, flags, glob_t::gl_errfunc, glob_t::gl_flags, glob_t::gl_matchc, glob_t::gl_offs, glob_t::gl_pathc, glob_t::gl_pathv, glob1(), globextend(), LBRACKET, M_ALL, M_ALTNOT, M_END, M_NOT, m_not, M_ONE, M_PROTECT, M_RNG, M_SET, MAXPATHLEN, no_match, NOT, pglob, QUESTION, QUOTE, RANGE, RBRACKET, STAR, and Strchr(). Referenced by MCW_file_expand().
00296 { 00297 int err, oldpathc; 00298 Char *bufnext, *bufend, *compilebuf, m_not; 00299 const unsigned char *compilepat, *patnext; 00300 int c, nnot; 00301 Char patbuf[MAXPATHLEN + 1], *qpatnext; 00302 int no_match; 00303 00304 patnext = (unsigned char *) pattern; 00305 if (!(flags & GLOB_APPEND)) { 00306 pglob->gl_pathc = 0; 00307 pglob->gl_pathv = NULL; 00308 if (!(flags & GLOB_DOOFFS)) 00309 pglob->gl_offs = 0; 00310 } 00311 pglob->gl_flags = flags & ~GLOB_MAGCHAR; 00312 pglob->gl_errfunc = errfunc; 00313 oldpathc = pglob->gl_pathc; 00314 pglob->gl_matchc = 0; 00315 00316 if (pglob->gl_flags & GLOB_ALTNOT) { 00317 nnot = ALTNOT; 00318 m_not = M_ALTNOT; 00319 } 00320 else { 00321 nnot = NOT; 00322 m_not = M_NOT; 00323 } 00324 00325 bufnext = patbuf; 00326 bufend = bufnext + MAXPATHLEN; 00327 compilebuf = bufnext; 00328 compilepat = patnext; 00329 00330 no_match = *patnext == nnot; 00331 if (no_match) 00332 patnext++; 00333 00334 if (flags & GLOB_QUOTE) { 00335 /* Protect the quoted characters */ 00336 while (bufnext < bufend && (c = *patnext++) != EOS) 00337 if (c == QUOTE) { 00338 if ((c = *patnext++) == EOS) { 00339 c = QUOTE; 00340 --patnext; 00341 } 00342 *bufnext++ = (Char) (c | M_PROTECT); 00343 } 00344 else 00345 *bufnext++ = (Char) c; 00346 } 00347 else 00348 while (bufnext < bufend && (c = *patnext++) != EOS) 00349 *bufnext++ = (Char) c; 00350 *bufnext = EOS; 00351 00352 bufnext = patbuf; 00353 qpatnext = patbuf; 00354 /* we don't need to check for buffer overflow any more */ 00355 while ((c = *qpatnext++) != EOS) { 00356 switch (c) { 00357 case LBRACKET: 00358 c = *qpatnext; 00359 if (c == nnot) 00360 ++qpatnext; 00361 if (*qpatnext == EOS || 00362 Strchr(qpatnext + 1, RBRACKET) == NULL) { 00363 *bufnext++ = LBRACKET; 00364 if (c == nnot) 00365 --qpatnext; 00366 break; 00367 } 00368 pglob->gl_flags |= GLOB_MAGCHAR; 00369 *bufnext++ = M_SET; 00370 if (c == nnot) 00371 *bufnext++ = m_not; 00372 c = *qpatnext++; 00373 do { 00374 *bufnext++ = CHAR(c); 00375 if (*qpatnext == RANGE && 00376 (c = qpatnext[1]) != RBRACKET) { 00377 *bufnext++ = M_RNG; 00378 *bufnext++ = CHAR(c); 00379 qpatnext += 2; 00380 } 00381 } while ((c = *qpatnext++) != RBRACKET); 00382 *bufnext++ = M_END; 00383 break; 00384 case QUESTION: 00385 pglob->gl_flags |= GLOB_MAGCHAR; 00386 *bufnext++ = M_ONE; 00387 break; 00388 case STAR: 00389 pglob->gl_flags |= GLOB_MAGCHAR; 00390 /* collapse adjacent stars to one, to avoid 00391 * exponential behavior 00392 */ 00393 if (bufnext == patbuf || bufnext[-1] != M_ALL) 00394 *bufnext++ = M_ALL; 00395 break; 00396 default: 00397 *bufnext++ = CHAR(c); 00398 break; 00399 } 00400 } 00401 *bufnext = EOS; 00402 #ifdef DEBUG 00403 qprintf(patbuf); 00404 #endif 00405 00406 if ((err = glob1(patbuf, pglob, no_match)) != 0) 00407 return (err); 00408 00409 /* 00410 * If there was no match we are going to append the pattern 00411 * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified 00412 * and the pattern did not contain any magic characters 00413 * GLOB_NOMAGIC is there just for compatibility with csh. 00414 */ 00415 if (pglob->gl_pathc == oldpathc && 00416 ((flags & GLOB_NOCHECK) || 00417 ((flags & GLOB_NOMAGIC) && !(pglob->gl_flags & GLOB_MAGCHAR)))) { 00418 if (!(flags & GLOB_QUOTE)) { 00419 Char *dp = compilebuf; 00420 const unsigned char *sp = compilepat; 00421 00422 while ((*dp++ = *sp++) != '\0') 00423 continue; 00424 } 00425 else { 00426 /* 00427 * copy pattern, interpreting quotes; this is slightly different 00428 * than the interpretation of quotes above -- which should prevail? 00429 */ 00430 while (*compilepat != EOS) { 00431 if (*compilepat == QUOTE) { 00432 if (*++compilepat == EOS) 00433 --compilepat; 00434 } 00435 *compilebuf++ = (unsigned char) *compilepat++; 00436 } 00437 *compilebuf = EOS; 00438 } 00439 return (globextend(patbuf, pglob)); 00440 } 00441 else if (!(flags & GLOB_NOSORT)) 00442 qsort((char *) (pglob->gl_pathv + pglob->gl_offs + oldpathc), 00443 pglob->gl_pathc - oldpathc, sizeof(char *), 00444 (int (*) __P((const void *, const void *))) compare); 00445 return (0); 00446 } |
|
Definition at line 719 of file mcw_glob.c. References glob_t::gl_offs, glob_t::gl_pathc, glob_t::gl_pathv, i, pglob, ptr_t, and xfree. Referenced by MCW_file_expand().
00720 { 00721 register int i; 00722 register char **pp; 00723 00724 if (pglob->gl_pathv != NULL) { 00725 pp = pglob->gl_pathv + pglob->gl_offs; 00726 for (i = pglob->gl_pathc; i--; ++pp) 00727 if (*pp) 00728 xfree((ptr_t) *pp), *pp = NULL; 00729 xfree((ptr_t) pglob->gl_pathv), pglob->gl_pathv = NULL; 00730 } 00731 } |
|
Routines that allows filename wildcarding to be handled inside to3d. The advantage: limitations of shell command line lengths.
Definition at line 751 of file mcw_glob.c. References fout, glob_t::gl_pathc, glob_t::gl_pathv, glob(), globfree(), ilen, malloc, and realloc. Referenced by AFNI_read_inputs(), main(), MCW_wildcards(), NIH_glob(), read_ge_files(), T3D_read_images(), THD_get_all_filenames(), THD_get_wildcard_filenames(), and THD_init_session().
00752 { 00753 glob_t gl ; 00754 int ii , gnum, gold , ilen ; 00755 char ** gout ; 00756 char * fn ; 00757 char prefix[4] , fpre[128] , fname[256] ; 00758 int b1,b2,b3,b4,b5 , ib,ig , lpre ; 00759 00760 if( nin <= 0 ){ *nout = 0 ; return ; } 00761 00762 gnum = 0 ; 00763 gout = NULL ; 00764 00765 for( ii=0 ; ii < nin ; ii++ ){ 00766 fn = fin[ii] ; 00767 00768 ig = 0 ; 00769 00770 /** look for 3D: prefix **/ 00771 00772 if( strlen(fn) > 9 && fn[0] == '3' && fn[1] == 'D' ){ 00773 ib = 0 ; 00774 prefix[ib++] = '3' ; 00775 prefix[ib++] = 'D' ; 00776 if( fn[2] == ':' ){ prefix[ib++] = '\0' ; } 00777 else { prefix[ib++] = fn[2] ; prefix[ib++] = '\0' ; } 00778 00779 ig = sscanf( fn+ib , "%d:%d:%d:%d:%d:%s" , /* must scan all */ 00780 &b1,&b2,&b3,&b4,&b5 , fname ) ; /* six items OK */ 00781 00782 /** if have all 6 3D: items, then make a 3D: prefix for output **/ 00783 00784 if( ig == 6 ){ 00785 sprintf(fpre , "%s:%d:%d:%d:%d:%d:" , prefix,b1,b2,b3,b4,b5) ; 00786 lpre = strlen(fpre) ; 00787 } else { 00788 ig = 0 ; 00789 } 00790 } 00791 00792 if( strlen(fn) > 9 && fn[0] == '3' && fn[1] == 'A' && fn[3] == ':' ){ 00793 ib = 0 ; 00794 prefix[ib++] = '3' ; 00795 prefix[ib++] = 'A' ; 00796 prefix[ib++] = fn[2] ; 00797 prefix[ib++] = '\0' ; 00798 00799 ig = sscanf( fn+ib , "%d:%d:%d:%s" , /* must scan all */ 00800 &b1,&b2,&b3, fname ) ; /* four items OK */ 00801 00802 /** if have all 4 3A: items, then make a 3A: prefix for output **/ 00803 00804 if( ig == 4 ){ 00805 sprintf(fpre , "%s:%d:%d:%d:" , prefix,b1,b2,b3) ; 00806 lpre = strlen(fpre) ; 00807 } else { 00808 ig = 0 ; 00809 } 00810 } 00811 00812 if( ig > 0 ) (void) glob( fname , 0 , NULL , &gl ) ; /* 3D: was OK */ 00813 else (void) glob( fn , 0 , NULL , &gl ) ; /* not OK */ 00814 00815 /** put each matched string into the output array **/ 00816 00817 if( gl.gl_pathc > 0 ){ 00818 00819 /** make space for output now **/ 00820 gold = gnum ; 00821 gnum += gl.gl_pathc ; 00822 if( gout == NULL ) gout = (char **) malloc ( sizeof(char *)*gnum); 00823 else gout = (char **) realloc(gout, sizeof(char *)*gnum); 00824 00825 for( ib=0 ; ib < gl.gl_pathc ; ib++ ){ 00826 ilen = strlen( gl.gl_pathv[ib] ) + 1 ; /* length of this name */ 00827 if( ig > 0 ) ilen += lpre ; /* plus 3D: prefix? */ 00828 00829 gout[ib+gold] = (char *) malloc( sizeof(char) * ilen ) ; /* output! */ 00830 00831 if( ig > 0 ){ 00832 strcpy( gout[ib+gold] , fpre ) ; /* 3D: prefix */ 00833 strcat( gout[ib+gold] , gl.gl_pathv[ib] ) ; /* then name */ 00834 } 00835 else { 00836 strcpy( gout[ib+gold] , gl.gl_pathv[ib] ) ; /* just name */ 00837 } 00838 } 00839 00840 } else if( ig == 6 && strcmp(fname,"ALLZERO") == 0 ){ /* 06 Mar 2001 */ 00841 00842 gold = gnum ; gnum++ ; 00843 if( gout == NULL ) gout = (char **) malloc ( sizeof(char *)*gnum); 00844 else gout = (char **) realloc(gout, sizeof(char *)*gnum); 00845 00846 ilen = lpre + strlen(fname) + 1 ; 00847 gout[gold] = (char *) malloc( sizeof(char) * ilen ) ; /* output! */ 00848 strcpy( gout[gold] , fpre ) ; 00849 strcat( gout[gold] , fname ) ; 00850 00851 } else { /* 30 Apr 2001 */ 00852 00853 if( warn ) /* 13 Jul 2001 - print only if told to do so */ 00854 fprintf(stderr,"** Can't find file %s\n", (ig>0) ? fname : fn ) ; 00855 } 00856 00857 globfree( &gl ) ; 00858 } 00859 00860 *nout = gnum ; *fout = gout ; return ; 00861 } |
|
make space for output now * Definition at line 908 of file mcw_glob.c. References free. Referenced by AFNI_read_inputs(), main(), NIH_glob_free(), read_ge_files(), T3D_read_images(), THD_get_all_filenames(), THD_get_wildcard_filenames(), and THD_init_session().
|
|
Definition at line 740 of file mcw_glob.c. References warn. Referenced by AFNI_read_inputs(), main(), T3D_read_images(), THD_get_all_filenames(), and THD_get_wildcard_filenames().
00740 { warn = www; return; } /* 13 Jul 2001 */ |
|
Simpler interface to MCW_file_expand().
Definition at line 877 of file mcw_glob.c. References fout, free, MCW_file_expand(), and realloc. Referenced by AFNI_find_jpegs(), and THD_init_session().
00878 { 00879 char **fin=NULL, *fcop ; 00880 int ii , nin , lf , ls ; 00881 00882 if( fnam == NULL || *fnam == '\0' ){ *nout = 0 ; return ; } 00883 fcop = strdup(fnam) ; lf = strlen(fcop) ; 00884 ls = 1 ; 00885 for( nin=ii=0 ; ii < lf ; ii++ ){ 00886 if( isspace(fcop[ii]) ){ /* This is a blank, so next */ 00887 ls = 1 ; /* non-blank is a new word. */ 00888 fcop[ii] = '\0' ; /* Set this char to NUL. */ 00889 00890 } else { /* Not a blank. */ 00891 00892 if( ls ){ /* If last was a blank, is new name. */ 00893 fin = (char **) realloc( fin , sizeof(char *)*(nin+1) ) ; 00894 fin[nin++] = fcop+ii ; 00895 } 00896 ls = 0 ; 00897 } 00898 } 00899 00900 if( nin == 0 ){ *nout = 0 ; free(fcop) ; return ; } 00901 00902 MCW_file_expand( nin , fin , nout , fout ) ; 00903 free(fin) ; free(fcop) ; return ; 00904 } |
|
set the direction of the sort (either small to large, or the reverse) Definition at line 743 of file l_mcw_glob.c. References g_sort_dir. Referenced by init_options().
00744 { 00745 if ( dir == 1 ) g_sort_dir = 1; 00746 else if ( dir == -1 ) g_sort_dir = -1; 00747 else return 1; /* else, ignore and signal error */ 00748 00749 return 0; 00750 } |