Doxygen Source Code Documentation
l_mcw_glob.c File Reference
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
#include <ctype.h>
#include "l_mcw_glob.h"
Go to the source code of this file.
Defines | |
#define | xfree free |
#define | xmalloc malloc |
#define | xrealloc realloc |
#define | S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR) |
#define | lstat stat |
#define | __P(a) a |
#define | DOLLAR '$' |
#define | DOT '.' |
#define | EOS '\0' |
#define | LBRACKET '[' |
#define | NOT '!' |
#define | ALTNOT '^' |
#define | QUESTION '?' |
#define | QUOTE '\\' |
#define | RANGE '-' |
#define | RBRACKET ']' |
#define | SEP '/' |
#define | STAR '*' |
#define | TILDE '~' |
#define | UNDERSCORE '_' |
#define | M_META 0x8000 |
#define | M_PROTECT 0x4000 |
#define | M_MASK 0xffff |
#define | M_ASCII 0x00ff |
#define | CHAR(c) ((c)&M_ASCII) |
#define | META(c) ((c)|M_META) |
#define | M_ALL META('*') |
#define | M_END META(']') |
#define | M_NOT META('!') |
#define | M_ALTNOT META('^') |
#define | M_ONE META('?') |
#define | M_RNG META('-') |
#define | M_SET META('[') |
#define | ismeta(c) (((c)&M_META) != 0) |
#define | Lstat Stat |
Typedefs | |
typedef void * | ptr_t |
typedef unsigned short | Char |
Functions | |
int glob1 | __P ((Char *, glob_t *, int)) |
int glob2 | __P ((Char *, Char *, Char *, glob_t *, int)) |
int glob3 | __P ((Char *, Char *, Char *, Char *, glob_t *, int)) |
int globextend | __P ((Char *, glob_t *)) |
int match | __P ((Char *, Char *, Char *, int)) |
int compare | __P ((const ptr_t, const ptr_t)) |
DIR *Opendir | __P ((Char *)) |
Char *Strchr | __P ((Char *, int)) |
DIR * | Opendir (Char *str) |
int | Stat (Char *fn, struct stat *sb) |
Char * | Strchr (Char *str, int ch) |
int | compare (const ptr_t p, const ptr_t q) |
int | glob (const char *pattern, int flags, int(*errfunc)(char *, int), glob_t *pglob) |
int | glob1 (Char *pattern, glob_t *pglob, int no_match) |
int | glob2 (Char *pathbuf, Char *pathend, Char *pattern, glob_t *pglob, int no_match) |
int | glob3 (Char *pathbuf, Char *pathend, Char *pattern, Char *restpattern, glob_t *pglob, int no_match) |
int | globextend (Char *path, glob_t *pglob) |
int | match (Char *name, Char *pat, Char *patend, int m_not) |
void | globfree (glob_t *pglob) |
int | rglob_set_sort_dir (int dir) |
void | MCW_warn_expand (int www) |
void | MCW_file_expand (int nin, char **fin, int *nout, char ***fout) |
void | MCW_wildcards (char *fnam, int *nout, char ***fout) |
void | MCW_free_expand (int gnum, char **gout) |
Variables | |
int | g_sort_dir = 1 |
int | warn = 0 |
Define Documentation
|
Definition at line 115 of file l_mcw_glob.c. |
|
Definition at line 140 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 155 of file l_mcw_glob.c. |
|
Definition at line 135 of file l_mcw_glob.c. |
|
Definition at line 136 of file l_mcw_glob.c. Referenced by glob3(). |
|
Definition at line 137 of file l_mcw_glob.c. Referenced by glob(), glob1(), glob2(), glob3(), and match(). |
|
Definition at line 164 of file l_mcw_glob.c. |
|
Definition at line 138 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 222 of file l_mcw_glob.c. Referenced by glob2(). |
|
Definition at line 109 of file l_mcw_glob.c. |
|
Definition at line 157 of file l_mcw_glob.c. |
|
Definition at line 160 of file l_mcw_glob.c. |
|
Definition at line 153 of file l_mcw_glob.c. |
|
Definition at line 158 of file l_mcw_glob.c. |
|
Definition at line 152 of file l_mcw_glob.c. Referenced by match(). |
|
Definition at line 150 of file l_mcw_glob.c. |
|
Definition at line 159 of file l_mcw_glob.c. |
|
Definition at line 161 of file l_mcw_glob.c. |
|
Definition at line 151 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 162 of file l_mcw_glob.c. |
|
Definition at line 163 of file l_mcw_glob.c. |
|
Definition at line 156 of file l_mcw_glob.c. |
|
Definition at line 139 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 141 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 142 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 143 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 144 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 101 of file l_mcw_glob.c. |
|
Definition at line 145 of file l_mcw_glob.c. Referenced by glob2(). |
|
Definition at line 146 of file l_mcw_glob.c. Referenced by glob(). |
|
Definition at line 147 of file l_mcw_glob.c. |
|
Definition at line 148 of file l_mcw_glob.c. |
|
the following were in "sh.h", but I put them here to get rid of the need for that file -- RWCox * Definition at line 66 of file l_mcw_glob.c. |
|
Definition at line 67 of file l_mcw_glob.c. |
|
Definition at line 68 of file l_mcw_glob.c. |
Typedef Documentation
|
Definition at line 112 of file l_mcw_glob.c. Referenced by glob(), glob1(), glob2(), glob3(), globextend(), match(), Opendir(), Stat(), and Strchr(). |
|
Definition at line 79 of file l_mcw_glob.c. Referenced by compare(), globextend(), and globfree(). |
Function Documentation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 276 of file l_mcw_glob.c. References g_sort_dir, p, ptr_t, and q. Referenced by glob(), LST_Sort(), and main().
00277 { 00278 #if defined(NLS) && !defined(NOSTRCOLL) 00279 00280 #if 0 00281 errno = 0; /* strcoll sets errno, another brain-damage */ 00282 #endif 00283 00284 return (g_sort_dir * strcoll(*(char **) p, *(char **) q)); 00285 #else 00286 return (g_sort_dir * strcmp(*(char **) p, *(char **) q)); 00287 #endif /* NLS && !NOSTRCOLL */ 00288 } |
|
Definition at line 298 of file l_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().
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 452 of file l_mcw_glob.c. References Char, EOS, glob2(), MAXPATHLEN, no_match, and pglob. Referenced by glob().
00453 { 00454 Char pathbuf[MAXPATHLEN + 1]; 00455 00456 /* 00457 * a null pathname is invalid -- POSIX 1003.1 sect. 2.4. 00458 */ 00459 if (*pattern == EOS) 00460 return (0); 00461 return (glob2(pathbuf, pathbuf, pattern, pglob, no_match)); 00462 } |
|
Definition at line 470 of file l_mcw_glob.c. References Char, EOS, glob_t::gl_flags, glob_t::gl_matchc, glob3(), globextend(), ismeta, Lstat, no_match, p, pathend, pglob, q, S_ISDIR, SEP, and Stat(). Referenced by glob1(), and glob3().
00471 { 00472 struct stat sbuf; 00473 int anymeta; 00474 Char *p, *q; 00475 00476 /* 00477 * loop over pattern segments until end of pattern or until segment with 00478 * meta character found. 00479 */ 00480 anymeta = 0; 00481 for (;;) { 00482 if (*pattern == EOS) { /* end of pattern? */ 00483 *pathend = EOS; 00484 00485 if (Lstat(pathbuf, &sbuf)) 00486 return (0); 00487 00488 if (((pglob->gl_flags & GLOB_MARK) && 00489 pathend[-1] != SEP) && 00490 (S_ISDIR(sbuf.st_mode) 00491 #ifdef S_IFLNK 00492 || (S_ISLNK(sbuf.st_mode) && 00493 (Stat(pathbuf, &sbuf) == 0) && 00494 S_ISDIR(sbuf.st_mode)) 00495 #endif 00496 )) { 00497 *pathend++ = SEP; 00498 *pathend = EOS; 00499 } 00500 ++pglob->gl_matchc; 00501 return (globextend(pathbuf, pglob)); 00502 } 00503 00504 /* find end of next segment, copy tentatively to pathend */ 00505 q = pathend; 00506 p = pattern; 00507 while (*p != EOS && *p != SEP) { 00508 if (ismeta(*p)) 00509 anymeta = 1; 00510 *q++ = *p++; 00511 } 00512 00513 if (!anymeta) { /* no expansion, do next segment */ 00514 pathend = q; 00515 pattern = p; 00516 while (*pattern == SEP) 00517 *pathend++ = *pattern++; 00518 } 00519 else /* need expansion, recurse */ 00520 return (glob3(pathbuf, pathend, pattern, p, pglob, no_match)); 00521 } 00522 /* NOTREACHED */ 00523 } |
|
Definition at line 527 of file l_mcw_glob.c. References Char, DIR, DOT, EOS, glob_t::gl_errfunc, glob_t::gl_flags, glob2(), M_ALTNOT, M_NOT, m_not, match(), MAXPATHLEN, no_match, Opendir(), pathend, pglob, and restpattern. Referenced by glob2().
00528 { 00529 #if 0 00530 extern int errno; 00531 #endif 00532 DIR *dirp; 00533 struct dirent *dp; 00534 int err; 00535 Char m_not = (pglob->gl_flags & GLOB_ALTNOT) ? M_ALTNOT : M_NOT; 00536 char cpathbuf[MAXPATHLEN], *ptr; 00537 #ifdef SOLARIS_DIRENT_PATCH 00538 /* declaration of vars used in the solaris-patch */ 00539 char dname[255]; 00540 int ii; 00541 #endif 00542 00543 *pathend = EOS; 00544 00545 #if 0 00546 errno = 0; 00547 #endif 00548 00549 if (!(dirp = Opendir(pathbuf))) { 00550 /* todo: don't call for ENOENT or ENOTDIR? */ 00551 for (ptr = cpathbuf; (*ptr++ = (char) *pathbuf++) != EOS;) 00552 continue; 00553 #if 0 00554 if ((pglob->gl_errfunc && (*pglob->gl_errfunc) (cpathbuf, errno)) || 00555 (pglob->gl_flags & GLOB_ERR)) 00556 #else 00557 if ( (pglob->gl_flags & GLOB_ERR)) 00558 #endif 00559 return (GLOB_ABEND); 00560 else 00561 return (0); 00562 } 00563 00564 err = 0; 00565 00566 /* search directory for matching names */ 00567 while ((dp = readdir(dirp)) != NULL) { 00568 register unsigned char *sc; 00569 register Char *dc; 00570 00571 #ifdef SOLARIS_DIRENT_PATCH 00572 /********** 00573 begin patch 00574 **********/ 00575 00576 #ifndef SOLARIS_DIRENT_ZERO 00577 for (ii = -2 ; dp->d_name[ii] != '\0' ; ++ii) { 00578 dname[ii+2] = dp->d_name[ii]; 00579 } 00580 dname[ii+2] = '\0'; 00581 #else 00582 strcpy(dname, dp->d_name); /* John Koger, March 1999 */ 00583 #endif 00584 /********** 00585 end patch 00586 now use dname for dp->d_name 00587 **********/ 00588 00589 /* initial DOT must be matched literally */ 00590 if (dname[0] == DOT && *pattern != DOT) 00591 continue; 00592 for (sc = (unsigned char *) dname, dc = pathend; 00593 #else 00594 if (dp->d_name[0] == DOT && *pattern != DOT) 00595 continue; 00596 for (sc = (unsigned char *) dp->d_name, dc = pathend; 00597 #endif 00598 (*dc++ = *sc++) != '\0';) 00599 continue; 00600 if (match(pathend, pattern, restpattern, (int) m_not) == no_match) { 00601 *pathend = EOS; 00602 continue; 00603 } 00604 err = glob2(pathbuf, --dc, restpattern, pglob, no_match); 00605 if (err) 00606 break; 00607 } 00608 /* todo: check error from readdir? */ 00609 (void) closedir(dirp); 00610 return (err); 00611 } |
|
Definition at line 629 of file l_mcw_glob.c. References Char, glob_t::gl_offs, glob_t::gl_pathc, glob_t::gl_pathv, i, p, pglob, ptr_t, xmalloc, and xrealloc. Referenced by glob(), and glob2().
00630 { 00631 register char **pathv; 00632 register int i; 00633 unsigned int newsize; 00634 char *copy; 00635 Char *p; 00636 00637 newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); 00638 pathv = (char **) (pglob->gl_pathv ? 00639 xrealloc((ptr_t) pglob->gl_pathv, (size_t) newsize) : 00640 xmalloc((size_t) newsize)); 00641 if (pathv == NULL) 00642 return (GLOB_NOSPACE); 00643 00644 if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { 00645 /* first time around -- clear initial gl_offs items */ 00646 pathv += pglob->gl_offs; 00647 for (i = pglob->gl_offs; --i >= 0;) 00648 *--pathv = NULL; 00649 } 00650 pglob->gl_pathv = pathv; 00651 00652 for (p = path; *p++;) 00653 continue; 00654 if ((copy = (char *) xmalloc((size_t) (p - path))) != NULL) { 00655 register char *dc = copy; 00656 register Char *sc = path; 00657 00658 while ((*dc++ = *sc++) != '\0') 00659 continue; 00660 pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; 00661 } 00662 pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; 00663 return ((copy == NULL) ? GLOB_NOSPACE : 0); 00664 } |
|
Definition at line 722 of file l_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().
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 } |
|
Definition at line 672 of file l_mcw_glob.c. References c, Char, EOS, M_ALL, M_END, M_MASK, m_not, M_ONE, M_RNG, M_SET, name, pat, and patend. Referenced by glob3(), match(), and match_table().
00673 { 00674 int ok, negate_range; 00675 Char c, k; 00676 00677 while (pat < patend) { 00678 c = *pat++; 00679 switch (c & M_MASK) { 00680 case M_ALL: 00681 if (pat == patend) 00682 return (1); 00683 do 00684 if (match(name, pat, patend, m_not)) 00685 return (1); 00686 while (*name++ != EOS); 00687 return (0); 00688 case M_ONE: 00689 if (*name++ == EOS) 00690 return (0); 00691 break; 00692 case M_SET: 00693 ok = 0; 00694 if ((k = *name++) == EOS) 00695 return (0); 00696 if ((negate_range = ((*pat & M_MASK) == m_not)) != 0) 00697 ++pat; 00698 while (((c = *pat++) & M_MASK) != M_END) { 00699 if ((*pat & M_MASK) == M_RNG) { 00700 if (c <= k && k <= pat[1]) 00701 ok = 1; 00702 pat += 2; 00703 } 00704 else if (c == k) 00705 ok = 1; 00706 } 00707 if (ok == negate_range) 00708 return (0); 00709 break; 00710 default: 00711 k = *name++; 00712 if (k != c) 00713 return (0); 00714 break; 00715 } 00716 } 00717 return (*name == EOS); 00718 } |
|
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. 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().
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. 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 754 of file l_mcw_glob.c. References warn. Referenced by AFNI_read_inputs(), main(), T3D_read_images(), THD_get_all_filenames(), and THD_get_wildcard_filenames().
00754 { warn = www; return; } /* 13 Jul 2001 */ |
|
Simpler interface to MCW_file_expand().
Definition at line 891 of file l_mcw_glob.c. References fout, free, MCW_file_expand(), and realloc. Referenced by AFNI_find_jpegs(), and THD_init_session().
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 } |
|
Definition at line 187 of file l_mcw_glob.c. References Char, and MAXPATHLEN. Referenced by glob3().
00188 { 00189 char buf[MAXPATHLEN]; 00190 register char *dc = buf; 00191 00192 if (!*str) 00193 return (opendir(".")); 00194 while ((*dc++ = *str++) != '\0') 00195 continue; 00196 return (opendir(buf)); 00197 } |
|
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 } |
|
Definition at line 226 of file l_mcw_glob.c. References Char, MAXPATHLEN, S_ISDIR, and sb. Referenced by glob2().
00227 { 00228 char buf[MAXPATHLEN]; 00229 register char *dc = buf; 00230 00231 while ((*dc++ = *fn++) != '\0') 00232 continue; 00233 #ifdef NAMEI_BUG 00234 { 00235 int st; 00236 00237 st = stat(buf, sb); 00238 if (*buf) 00239 dc--; 00240 return (*--dc == '/' && !S_ISDIR(sb->st_mode) ? -1 : st); 00241 } 00242 #else 00243 return (stat(buf, sb)); 00244 #endif /* NAMEI_BUG */ 00245 } |
|
Definition at line 248 of file l_mcw_glob.c. References Char. Referenced by glob().
00249 { 00250 do 00251 if (*str == ch) 00252 return (str); 00253 while (*str++); 00254 return (NULL); 00255 } |
Variable Documentation
|
don't use sh.h any more * Definition at line 98 of file l_mcw_glob.c. Referenced by compare(), and rglob_set_sort_dir(). |
|
Definition at line 753 of file l_mcw_glob.c. Referenced by MCW_warn_expand(). |