diff options
author | mikeh <mikeh@FreeBSD.org> | 2002-07-17 04:58:09 +0000 |
---|---|---|
committer | mikeh <mikeh@FreeBSD.org> | 2002-07-17 04:58:09 +0000 |
commit | cd0195b666c38f44d9ca4b9296f915cf78c02685 (patch) | |
tree | 92f6aa408880f10b8b79a3fb6f5189540b25cdd7 /lib | |
parent | dd7f21ab90470d396b3c368392f89c1d105594f3 (diff) | |
download | FreeBSD-src-cd0195b666c38f44d9ca4b9296f915cf78c02685.zip FreeBSD-src-cd0195b666c38f44d9ca4b9296f915cf78c02685.tar.gz |
Update glob(3) to add all the POSIX required options, specifically:
- add GLOB_NOMATCH return value and use it when we don't get a match
- rename GLOB_ABEND to GLOB_ABORTED and use it instead of returning 1
in some places
- add GLOB_NOESCAPE flag and retire GLOB_QUOTE to compatibility
section
Suggestions/advice on correct usage of POSIX defines: wollman
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/gen/glob.3 | 25 | ||||
-rw-r--r-- | lib/libc/gen/glob.c | 38 |
2 files changed, 34 insertions, 29 deletions
diff --git a/lib/libc/gen/glob.3 b/lib/libc/gen/glob.3 index daca64e..9aac9b0 100644 --- a/lib/libc/gen/glob.3 +++ b/lib/libc/gen/glob.3 @@ -187,9 +187,15 @@ consisting of only .Fa pattern , with the number of total pathnames is set to 1, and the number of matched pathnames set to 0. +The effect of backslash escaping is present in the pattern returned. +.It Dv GLOB_NOESCAPE +By default, a backslash +.Pq Ql \e +character is used to escape the following character in the pattern, +avoiding any special interpretation of the character. If -.Dv GLOB_QUOTE -is set, its effect is present in the pattern returned. +.Dv GLOB_NOESCAPE +is set, backslash escaping is disabled. .It Dv GLOB_NOSORT By default, the pathnames are sorted in ascending .Tn ASCII @@ -250,12 +256,6 @@ if it does not contain any of the special characters ``*'', ``?'' or ``[''. is provided to simplify implementing the historic .Xr csh 1 globbing behavior and should probably not be used anywhere else. -.It Dv GLOB_QUOTE -Use the backslash -.Pq Ql \e -character for quoting: every occurrence of -a backslash followed by a character in the pattern is replaced by that -character, avoiding any special interpretation of the character. .It Dv GLOB_TILDE Expand patterns that start with .Ql ~ @@ -304,7 +304,7 @@ If returns non-zero, .Fn glob stops the scan and returns -.Dv GLOB_ABEND +.Dv GLOB_ABORTED after setting .Fa gl_pathc and @@ -386,12 +386,16 @@ was 0 was specified in the flags and .Fa pglob\->gl_matchc or more patterns were matched. -.It Dv GLOB_ABEND +.It Dv GLOB_ABORTED The scan was stopped because an error was encountered and either .Dv GLOB_ERR was set or .Fa \*(lp*errfunc\*(rp\*(lp\*(rp returned non-zero. +.It Dv GLOB_NOMATCH +The pattern did not match a pathname and +.Dv GLOB_NOCHECK +was not set. .El .Pp The arguments @@ -430,7 +434,6 @@ that the flags .Dv GLOB_LIMIT , .Dv GLOB_MAGCHAR , .Dv GLOB_NOMAGIC , -.Dv GLOB_QUOTE , and .Dv GLOB_TILDE , and the fields diff --git a/lib/libc/gen/glob.c b/lib/libc/gen/glob.c index e50c11d..5e159dd 100644 --- a/lib/libc/gen/glob.c +++ b/lib/libc/gen/glob.c @@ -182,7 +182,10 @@ glob(pattern, flags, errfunc, pglob) bufnext = patbuf; bufend = bufnext + MAXPATHLEN - 1; - if (flags & GLOB_QUOTE) { + if (flags & GLOB_NOESCAPE) + while (bufnext < bufend && (c = *patnext++) != EOS) + *bufnext++ = c; + else { /* Protect the quoted characters. */ while (bufnext < bufend && (c = *patnext++) != EOS) if (c == QUOTE) { @@ -195,9 +198,6 @@ glob(pattern, flags, errfunc, pglob) else *bufnext++ = c; } - else - while (bufnext < bufend && (c = *patnext++) != EOS) - *bufnext++ = c; *bufnext = EOS; if (flags & GLOB_BRACE) @@ -415,8 +415,7 @@ globtilde(pattern, patbuf, patbuf_len, pglob) * The main glob() routine: compiles the pattern (optionally processing * quotes), calls glob1() to do the real pattern matching, and finally * sorts the list (unless unsorted operation is requested). Returns 0 - * if things went well, nonzero if errors occurred. It is not an error - * to find no matches. + * if things went well, nonzero if errors occurred. */ static int glob0(pattern, pglob, limit) @@ -493,12 +492,15 @@ glob0(pattern, pglob, limit) * and the pattern did not contain any magic characters * GLOB_NOMAGIC is there just for compatibility with csh. */ - if (pglob->gl_pathc == oldpathc && - ((pglob->gl_flags & GLOB_NOCHECK) || - ((pglob->gl_flags & GLOB_NOMAGIC) && - !(pglob->gl_flags & GLOB_MAGCHAR)))) - return(globextend(pattern, pglob, limit)); - else if (!(pglob->gl_flags & GLOB_NOSORT)) + if (pglob->gl_pathc == oldpathc) { + if (((pglob->gl_flags & GLOB_NOCHECK) || + ((pglob->gl_flags & GLOB_NOMAGIC) && + !(pglob->gl_flags & GLOB_MAGCHAR)))) + return(globextend(pattern, pglob, limit)); + else + return(GLOB_NOMATCH); + } + if (!(pglob->gl_flags & GLOB_NOSORT)) qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, pglob->gl_pathc - oldpathc, sizeof(char *), compare); return(0); @@ -557,7 +559,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit) (g_stat(pathbuf, &sb, pglob) == 0) && S_ISDIR(sb.st_mode)))) { if (pathend + 1 > pathend_last) - return (1); + return (GLOB_ABORTED); *pathend++ = SEP; *pathend = EOS; } @@ -572,7 +574,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit) if (ismeta(*p)) anymeta = 1; if (q + 1 > pathend_last) - return (1); + return (GLOB_ABORTED); *q++ = *p++; } @@ -581,7 +583,7 @@ glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit) pattern = p; while (*pattern == SEP) { if (pathend + 1 > pathend_last) - return (1); + return (GLOB_ABORTED); *pathend++ = *pattern++; } } else /* Need expansion, recurse. */ @@ -611,7 +613,7 @@ glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit) struct dirent *(*readdirfunc)(); if (pathend > pathend_last) - return (1); + return (GLOB_ABORTED); *pathend = EOS; errno = 0; @@ -619,10 +621,10 @@ glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit) /* TODO: don't call for ENOENT or ENOTDIR? */ if (pglob->gl_errfunc) { if (g_Ctoc(pathbuf, buf, sizeof(buf))) - return (GLOB_ABEND); + return (GLOB_ABORTED); if (pglob->gl_errfunc(buf, errno) || pglob->gl_flags & GLOB_ERR) - return (GLOB_ABEND); + return (GLOB_ABORTED); } return(0); } |