Doxygen Source Code Documentation
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 | |
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 72 of file mcw_glob.h. |
|
Definition at line 69 of file mcw_glob.h. |
|
Definition at line 59 of file mcw_glob.h. |
|
Definition at line 60 of file mcw_glob.h. |
|
Definition at line 61 of file mcw_glob.h. |
|
Definition at line 62 of file mcw_glob.h. |
|
Definition at line 63 of file mcw_glob.h. |
|
Definition at line 64 of file mcw_glob.h. |
|
Definition at line 67 of file mcw_glob.h. |
|
Definition at line 65 of file mcw_glob.h. |
|
Definition at line 71 of file mcw_glob.h. |
|
Definition at line 66 of file mcw_glob.h. |
|
Definition at line 48 of file mcw_glob.h. Referenced by AFNI_find_jpegs(). |
Function Documentation
|
Definition at line 298 of file l_mcw_glob.c.
00299 { 00300 int err, oldpathc; 00301 Char *bufnext, *bufend, *compilebuf, m_not; 00302 const unsigned char *compilepat, *patnext; 00303 int c, nnot; 00304 Char patbuf[MAXPATHLEN + 1], *qpatnext; 00305 int no_match; 00306 00307 patnext = (unsigned char *) pattern; 00308 if (!(flags & GLOB_APPEND)) { 00309 pglob->gl_pathc = 0; 00310 pglob->gl_pathv = NULL; 00311 if (!(flags & GLOB_DOOFFS)) 00312 pglob->gl_offs = 0; 00313 } 00314 pglob->gl_flags = flags & ~GLOB_MAGCHAR; 00315 pglob->gl_errfunc = errfunc; 00316 oldpathc = pglob->gl_pathc; 00317 pglob->gl_matchc = 0; 00318 00319 if (pglob->gl_flags & GLOB_ALTNOT) { 00320 nnot = ALTNOT; 00321 m_not = M_ALTNOT; 00322 } 00323 else { 00324 nnot = NOT; 00325 m_not = M_NOT; 00326 } 00327 00328 bufnext = patbuf; 00329 bufend = bufnext + MAXPATHLEN; 00330 compilebuf = bufnext; 00331 compilepat = patnext; 00332 00333 no_match = *patnext == nnot; 00334 if (no_match) 00335 patnext++; 00336 00337 if (flags & GLOB_QUOTE) { 00338 /* Protect the quoted characters */ 00339 while (bufnext < bufend && (c = *patnext++) != EOS) 00340 if (c == QUOTE) { 00341 if ((c = *patnext++) == EOS) { 00342 c = QUOTE; 00343 --patnext; 00344 } 00345 *bufnext++ = (Char) (c | M_PROTECT); 00346 } 00347 else 00348 *bufnext++ = (Char) c; 00349 } 00350 else 00351 while (bufnext < bufend && (c = *patnext++) != EOS) 00352 *bufnext++ = (Char) c; 00353 *bufnext = EOS; 00354 00355 bufnext = patbuf; 00356 qpatnext = patbuf; 00357 /* we don't need to check for buffer overflow any more */ 00358 while ((c = *qpatnext++) != EOS) { 00359 switch (c) { 00360 case LBRACKET: 00361 c = *qpatnext; 00362 if (c == nnot) 00363 ++qpatnext; 00364 if (*qpatnext == EOS || 00365 Strchr(qpatnext + 1, RBRACKET) == NULL) { 00366 *bufnext++ = LBRACKET; 00367 if (c == nnot) 00368 --qpatnext; 00369 break; 00370 } 00371 pglob->gl_flags |= GLOB_MAGCHAR; 00372 *bufnext++ = M_SET; 00373 if (c == nnot) 00374 *bufnext++ = m_not; 00375 c = *qpatnext++; 00376 do { 00377 *bufnext++ = CHAR(c); 00378 if (*qpatnext == RANGE && 00379 (c = qpatnext[1]) != RBRACKET) { 00380 *bufnext++ = M_RNG; 00381 *bufnext++ = CHAR(c); 00382 qpatnext += 2; 00383 } 00384 } while ((c = *qpatnext++) != RBRACKET); 00385 *bufnext++ = M_END; 00386 break; 00387 case QUESTION: 00388 pglob->gl_flags |= GLOB_MAGCHAR; 00389 *bufnext++ = M_ONE; 00390 break; 00391 case STAR: 00392 pglob->gl_flags |= GLOB_MAGCHAR; 00393 /* collapse adjacent stars to one, to avoid 00394 * exponential behavior 00395 */ 00396 if (bufnext == patbuf || bufnext[-1] != M_ALL) 00397 *bufnext++ = M_ALL; 00398 break; 00399 default: 00400 *bufnext++ = CHAR(c); 00401 break; 00402 } 00403 } 00404 *bufnext = EOS; 00405 #ifdef DEBUG 00406 qprintf(patbuf); 00407 #endif 00408 00409 if ((err = glob1(patbuf, pglob, no_match)) != 0) 00410 return (err); 00411 00412 /* 00413 * If there was no match we are going to append the pattern 00414 * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified 00415 * and the pattern did not contain any magic characters 00416 * GLOB_NOMAGIC is there just for compatibility with csh. 00417 */ 00418 if (pglob->gl_pathc == oldpathc && 00419 ((flags & GLOB_NOCHECK) || 00420 ((flags & GLOB_NOMAGIC) && !(pglob->gl_flags & GLOB_MAGCHAR)))) { 00421 if (!(flags & GLOB_QUOTE)) { 00422 Char *dp = compilebuf; 00423 const unsigned char *sp = compilepat; 00424 00425 while ((*dp++ = *sp++) != '\0') 00426 continue; 00427 } 00428 else { 00429 /* 00430 * copy pattern, interpreting quotes; this is slightly different 00431 * than the interpretation of quotes above -- which should prevail? 00432 */ 00433 while (*compilepat != EOS) { 00434 if (*compilepat == QUOTE) { 00435 if (*++compilepat == EOS) 00436 --compilepat; 00437 } 00438 *compilebuf++ = (unsigned char) *compilepat++; 00439 } 00440 *compilebuf = EOS; 00441 } 00442 return (globextend(patbuf, pglob)); 00443 } 00444 else if (!(flags & GLOB_NOSORT)) 00445 qsort((char *) (pglob->gl_pathv + pglob->gl_offs + oldpathc), 00446 pglob->gl_pathc - oldpathc, sizeof(char *), 00447 (int (*) __P((const void *, const void *))) compare); 00448 return (0); 00449 } |
|
Definition at line 722 of file l_mcw_glob.c.
00723 { 00724 register int i; 00725 register char **pp; 00726 00727 if (pglob->gl_pathv != NULL) { 00728 pp = pglob->gl_pathv + pglob->gl_offs; 00729 for (i = pglob->gl_pathc; i--; ++pp) 00730 if (*pp) 00731 xfree((ptr_t) *pp), *pp = NULL; 00732 xfree((ptr_t) pglob->gl_pathv), pglob->gl_pathv = NULL; 00733 } 00734 } |
|
Routines that allows filename wildcarding to be handled inside to3d. The advantage: limitations of shell command line lengths.
Definition at line 765 of file l_mcw_glob.c.
00766 { 00767 glob_t gl ; 00768 int ii , gnum, gold , ilen ; 00769 char ** gout ; 00770 char * fn ; 00771 char prefix[4] , fpre[128] , fname[256] ; 00772 int b1,b2,b3,b4,b5 , ib,ig , lpre=0 ; 00773 00774 if( nin <= 0 ){ *nout = 0 ; return ; } 00775 00776 gnum = 0 ; 00777 gout = NULL ; 00778 00779 for( ii=0 ; ii < nin ; ii++ ){ 00780 fn = fin[ii] ; 00781 00782 ig = 0 ; 00783 00784 /** look for 3D: prefix **/ 00785 00786 if( strlen(fn) > 9 && fn[0] == '3' && fn[1] == 'D' ){ 00787 ib = 0 ; 00788 prefix[ib++] = '3' ; 00789 prefix[ib++] = 'D' ; 00790 if( fn[2] == ':' ){ prefix[ib++] = '\0' ; } 00791 else { prefix[ib++] = fn[2] ; prefix[ib++] = '\0' ; } 00792 00793 ig = sscanf( fn+ib , "%d:%d:%d:%d:%d:%s" , /* must scan all */ 00794 &b1,&b2,&b3,&b4,&b5 , fname ) ; /* six items OK */ 00795 00796 /** if have all 6 3D: items, then make a 3D: prefix for output **/ 00797 00798 if( ig == 6 ){ 00799 sprintf(fpre , "%s:%d:%d:%d:%d:%d:" , prefix,b1,b2,b3,b4,b5) ; 00800 lpre = strlen(fpre) ; 00801 } else { 00802 ig = 0 ; 00803 } 00804 } 00805 00806 if( strlen(fn) > 9 && fn[0] == '3' && fn[1] == 'A' && fn[3] == ':' ){ 00807 ib = 0 ; 00808 prefix[ib++] = '3' ; 00809 prefix[ib++] = 'A' ; 00810 prefix[ib++] = fn[2] ; 00811 prefix[ib++] = '\0' ; 00812 00813 ig = sscanf( fn+ib , "%d:%d:%d:%s" , /* must scan all */ 00814 &b1,&b2,&b3, fname ) ; /* four items OK */ 00815 00816 /** if have all 4 3A: items, then make a 3A: prefix for output **/ 00817 00818 if( ig == 4 ){ 00819 sprintf(fpre , "%s:%d:%d:%d:" , prefix,b1,b2,b3) ; 00820 lpre = strlen(fpre) ; 00821 } else { 00822 ig = 0 ; 00823 } 00824 } 00825 00826 if( ig > 0 ) (void) glob( fname , 0 , NULL , &gl ) ; /* 3D: was OK */ 00827 else (void) glob( fn , 0 , NULL , &gl ) ; /* not OK */ 00828 00829 /** put each matched string into the output array **/ 00830 00831 if( gl.gl_pathc > 0 ){ 00832 00833 /** make space for output now **/ 00834 gold = gnum ; 00835 gnum += gl.gl_pathc ; 00836 if( gout == NULL ) gout = (char **) malloc ( sizeof(char *)*gnum); 00837 else gout = (char **) realloc(gout, sizeof(char *)*gnum); 00838 00839 for( ib=0 ; ib < gl.gl_pathc ; ib++ ){ 00840 ilen = strlen( gl.gl_pathv[ib] ) + 1 ; /* length of this name */ 00841 if( ig > 0 ) ilen += lpre ; /* plus 3D: prefix? */ 00842 00843 gout[ib+gold] = (char *) malloc( sizeof(char) * ilen ) ; /* output! */ 00844 00845 if( ig > 0 ){ 00846 strcpy( gout[ib+gold] , fpre ) ; /* 3D: prefix */ 00847 strcat( gout[ib+gold] , gl.gl_pathv[ib] ) ; /* then name */ 00848 } 00849 else { 00850 strcpy( gout[ib+gold] , gl.gl_pathv[ib] ) ; /* just name */ 00851 } 00852 } 00853 00854 } else if( ig == 6 && strcmp(fname,"ALLZERO") == 0 ){ /* 06 Mar 2001 */ 00855 00856 gold = gnum ; gnum++ ; 00857 if( gout == NULL ) gout = (char **) malloc ( sizeof(char *)*gnum); 00858 else gout = (char **) realloc(gout, sizeof(char *)*gnum); 00859 00860 ilen = lpre + strlen(fname) + 1 ; 00861 gout[gold] = (char *) malloc( sizeof(char) * ilen ) ; /* output! */ 00862 strcpy( gout[gold] , fpre ) ; 00863 strcat( gout[gold] , fname ) ; 00864 00865 } else { /* 30 Apr 2001 */ 00866 00867 if( warn ) /* 13 Jul 2001 - print only if told to do so */ 00868 fprintf(stderr,"** Can't find file %s\n", (ig>0) ? fname : fn ) ; 00869 } 00870 00871 globfree( &gl ) ; 00872 } 00873 00874 *nout = gnum ; *fout = gout ; return ; 00875 } |
|
make space for output now * Definition at line 922 of file l_mcw_glob.c.
|
|
Definition at line 754 of file l_mcw_glob.c.
00754 { warn = www; return; } /* 13 Jul 2001 */ |
|
Simpler interface to MCW_file_expand().
Definition at line 891 of file l_mcw_glob.c.
00892 { 00893 char **fin=NULL, *fcop ; 00894 int ii , nin , lf , ls ; 00895 00896 if( fnam == NULL || *fnam == '\0' ){ *nout = 0 ; return ; } 00897 fcop = strdup(fnam) ; lf = strlen(fcop) ; 00898 ls = 1 ; 00899 for( nin=ii=0 ; ii < lf ; ii++ ){ 00900 if( isspace(fcop[ii]) ){ /* This is a blank, so next */ 00901 ls = 1 ; /* non-blank is a new word. */ 00902 fcop[ii] = '\0' ; /* Set this char to NUL. */ 00903 00904 } else { /* Not a blank. */ 00905 00906 if( ls ){ /* If last was a blank, is new name. */ 00907 fin = (char **) realloc( fin , sizeof(char *)*(nin+1) ) ; 00908 fin[nin++] = fcop+ii ; 00909 } 00910 ls = 0 ; 00911 } 00912 } 00913 00914 if( nin == 0 ){ *nout = 0 ; free(fcop) ; return ; } 00915 00916 MCW_file_expand( nin , fin , nout , fout ) ; 00917 free(fin) ; free(fcop) ; return ; 00918 } |