summaryrefslogtreecommitdiffstats
path: root/contrib/tcsh/glob.c
diff options
context:
space:
mode:
authormp <mp@FreeBSD.org>2005-04-24 19:41:08 +0000
committermp <mp@FreeBSD.org>2005-04-24 19:41:08 +0000
commit94a109bd814074f290affa8f7698847719d55833 (patch)
tree6daeb0464a7bc8705c0246b7fd98e212b6beed09 /contrib/tcsh/glob.c
parentbbd1addf8f9452690ad13ce5b875ee4cc9633958 (diff)
downloadFreeBSD-src-94a109bd814074f290affa8f7698847719d55833.zip
FreeBSD-src-94a109bd814074f290affa8f7698847719d55833.tar.gz
Import of tcsh-6.14.00
Diffstat (limited to 'contrib/tcsh/glob.c')
-rw-r--r--contrib/tcsh/glob.c168
1 files changed, 110 insertions, 58 deletions
diff --git a/contrib/tcsh/glob.c b/contrib/tcsh/glob.c
index 8e107c9..b56e220 100644
--- a/contrib/tcsh/glob.c
+++ b/contrib/tcsh/glob.c
@@ -51,20 +51,14 @@ static char sccsid[] = "@(#)glob.c 5.12 (Berkeley) 6/24/91";
* Number of matches in the current invocation of glob.
*/
-#ifdef notdef
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <ctype.h>
-typedef void * ptr_t;
-#endif
#ifdef WINNT_NATIVE
#pragma warning(disable:4244)
#endif /* WINNT_NATIVE */
#define Char __Char
#include "sh.h"
+#include "glob.h"
+
#undef Char
#undef QUOTE
#undef TILDE
@@ -73,8 +67,6 @@ typedef void * ptr_t;
#undef ismeta
#undef Strchr
-#include "glob.h"
-
#ifndef S_ISDIR
#define S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR)
#endif
@@ -147,9 +139,31 @@ static void qprintf __P((Char *));
int
globcharcoll(c1, c2, cs)
- int c1, c2, cs;
+ NLSChar c1, c2;
+ int cs;
{
#if defined(NLS) && defined(LC_COLLATE) && !defined(NOSTRCOLL)
+# if defined(SHORT_STRINGS)
+ wchar_t s1[2], s2[2];
+
+ if (c1 == c2)
+ return (0);
+ if (cs) {
+ c1 = towlower(c1);
+ c2 = towlower(c2);
+ } else {
+ /* This should not be here, but I'll rather leave it in than engage in
+ a LC_COLLATE flamewar about a shell I don't use... */
+ if (iswlower(c1) && iswupper(c2))
+ return (1);
+ if (iswupper(c1) && iswlower(c2))
+ return (-1);
+ }
+ s1[0] = c1;
+ s2[0] = c2;
+ s1[1] = s2[1] = '\0';
+ return wcscoll(s1, s2);
+# else /* not SHORT_STRINGS */
char s1[2], s2[2];
if (c1 == c2)
@@ -164,11 +178,14 @@ globcharcoll(c1, c2, cs)
} else {
if (islower(c1) && isupper(c2))
return (1);
+ if (isupper(c1) && islower(c2))
+ return (-1);
}
s1[0] = c1;
s2[0] = c2;
s1[1] = s2[1] = '\0';
return strcoll(s1, s2);
+# endif
#else
return (c1 - c2);
#endif
@@ -183,10 +200,10 @@ globcharcoll(c1, c2, cs)
static DIR *
Opendir(str)
- register Char *str;
+ Char *str;
{
char buf[GLOBBUFLEN];
- register char *dc = buf;
+ char *dc = buf;
#if defined(hpux) || defined(__hpux)
struct stat st;
#endif
@@ -208,11 +225,11 @@ Opendir(str)
#ifdef S_IFLNK
static int
Lstat(fn, sb)
- register Char *fn;
+ Char *fn;
struct stat *sb;
{
char buf[GLOBBUFLEN];
- register char *dc = buf;
+ char *dc = buf;
while ((*dc++ = *fn++) != '\0')
continue;
@@ -235,11 +252,11 @@ Lstat(fn, sb)
static int
Stat(fn, sb)
- register Char *fn;
+ Char *fn;
struct stat *sb;
{
char buf[GLOBBUFLEN];
- register char *dc = buf;
+ char *dc = buf;
while ((*dc++ = *fn++) != '\0')
continue;
@@ -319,10 +336,15 @@ glob(pattern, flags, errfunc, pglob)
Char *bufnext, *bufend, *compilebuf, m_not;
const unsigned char *compilepat, *patnext;
int c, not;
- Char patbuf[GLOBBUFLEN + 1], *qpatnext;
+ Char *qpatnext;
+#ifdef WIDE_STRINGS
+ Char patbuf[GLOBBUFLEN + MB_LEN_MAX + 1];
+#else
+ Char patbuf[GLOBBUFLEN + 1];
+#endif
int no_match;
- patnext = (unsigned char *) pattern;
+ patnext = (const unsigned char *) pattern;
if (!(flags & GLOB_APPEND)) {
pglob->gl_pathc = 0;
pglob->gl_pathv = NULL;
@@ -354,15 +376,19 @@ glob(pattern, flags, errfunc, pglob)
if (flags & GLOB_QUOTE) {
/* Protect the quoted characters */
- while (bufnext < bufend && (c = *patnext++) != EOS)
-#ifdef DSPMBYTE
- if (Ismbyte1(c) && *patnext != EOS)
- {
- *bufnext++ = (Char) c;
- *bufnext++ = (Char) *patnext++;
- }
- else
-#endif /* DSPMBYTE */
+ while (bufnext < bufend && (c = *patnext++) != EOS) {
+#ifdef WIDE_STRINGS
+ int len;
+
+ len = mblen((const char *)(patnext - 1), MB_LEN_MAX);
+ if (len == -1)
+ mblen(NULL, 0);
+ if (len > 1) {
+ *bufnext++ = (Char) c;
+ while (--len != 0)
+ *bufnext++ = (Char) (*patnext++ | M_PROTECT);
+ } else
+#endif /* WIDE_STRINGS */
if (c == QUOTE) {
if ((c = *patnext++) == EOS) {
c = QUOTE;
@@ -372,6 +398,7 @@ glob(pattern, flags, errfunc, pglob)
}
else
*bufnext++ = (Char) c;
+ }
}
else
while (bufnext < bufend && (c = *patnext++) != EOS)
@@ -382,14 +409,6 @@ glob(pattern, flags, errfunc, pglob)
qpatnext = patbuf;
/* we don't need to check for buffer overflow any more */
while ((c = *qpatnext++) != EOS) {
-#ifdef DSPMBYTE
- if (Ismbyte1(c) && *qpatnext != EOS)
- {
- *bufnext++ = CHAR(c);
- *bufnext++ = CHAR(*qpatnext++);
- }
- else
-#endif /* DSPMBYTE */
switch (c) {
case LBRACKET:
c = *qpatnext;
@@ -593,8 +612,8 @@ glob3(pathbuf, pathend, pattern, restpattern, pglob, no_match)
/* search directory for matching names */
while ((dp = readdir(dirp)) != NULL) {
- register unsigned char *sc;
- register Char *dc;
+ unsigned char *sc;
+ Char *dc;
/* initial DOT must be matched literally */
if (dp->d_name[0] == DOT && *pattern != DOT)
@@ -635,8 +654,8 @@ globextend(path, pglob)
Char *path;
glob_t *pglob;
{
- register char **pathv;
- register int i;
+ char **pathv;
+ int i;
unsigned int newsize;
char *copy;
Char *p;
@@ -659,8 +678,8 @@ globextend(path, pglob)
for (p = path; *p++;)
continue;
if ((copy = (char *) xmalloc((size_t) (p - path))) != NULL) {
- register char *dc = copy;
- register Char *sc = path;
+ char *dc = copy;
+ Char *sc = path;
while ((*dc++ = *sc++) != '\0')
continue;
@@ -671,55 +690,88 @@ globextend(path, pglob)
}
+static size_t
+One_mbtowc(NLSChar *pwc, const Char *s, size_t n)
+{
+#ifdef WIDE_STRINGS
+ char buf[MB_LEN_MAX], *p;
+
+ if (n > MB_LEN_MAX)
+ n = MB_LEN_MAX;
+ p = buf;
+ while (p < buf + n && (*p++ = CHAR(*s++)) != 0)
+ ;
+ return one_mbtowc(pwc, buf, n);
+#else
+ return NLSFrom(s, n, pwc);
+#endif
+}
+
/*
* pattern matching function for filenames. Each occurrence of the *
* pattern causes a recursion level.
*/
static int
match(name, pat, patend, m_not)
- register Char *name, *pat, *patend;
+ Char *name, *pat, *patend;
int m_not;
{
int ok, negate_range;
Char c, k;
while (pat < patend) {
- c = *pat++;
+ size_t lwk;
+ NLSChar wc, wk;
+
+ USE(k);
+ c = *pat; /* Only for M_MASK bits */
+ pat += One_mbtowc(&wc, pat, MB_LEN_MAX);
+ lwk = One_mbtowc(&wk, name, MB_LEN_MAX);
switch (c & M_MASK) {
case M_ALL:
if (pat == patend)
return (1);
- do
+ for (;;) {
if (match(name, pat, patend, m_not))
return (1);
- while (*name++ != EOS);
+ if (*name == EOS)
+ break;
+ name += lwk;
+ lwk = One_mbtowc(&wk, name, MB_LEN_MAX);
+ }
return (0);
case M_ONE:
- if (*name++ == EOS)
+ if (*name == EOS)
return (0);
+ name += lwk;
break;
case M_SET:
ok = 0;
- if ((k = *name++) == EOS)
+ if (*name == EOS)
return (0);
+ name += lwk;
if ((negate_range = ((*pat & M_MASK) == m_not)) != 0)
++pat;
- while (((c = *pat++) & M_MASK) != M_END) {
+ while ((*pat & M_MASK) != M_END) {
+ pat += One_mbtowc(&wc, pat, MB_LEN_MAX);
if ((*pat & M_MASK) == M_RNG) {
- if (globcharcoll(CHAR(c), CHAR(k), 0) <= 0 &&
- globcharcoll(CHAR(k), CHAR(pat[1]), 0) <= 0)
+ NLSChar wc2;
+
+ pat++;
+ pat += One_mbtowc(&wc2, pat, MB_LEN_MAX);
+ if (globcharcoll(wc, wk, 0) <= 0 &&
+ globcharcoll(wk, wc2, 0) <= 0)
ok = 1;
- pat += 2;
- }
- else if (c == k)
+ } else if (wc == wk)
ok = 1;
}
+ pat += One_mbtowc(&wc, pat, MB_LEN_MAX);
if (ok == negate_range)
return (0);
break;
default:
- k = *name++;
- if (samecase(k) != samecase(c))
+ name += lwk;
+ if (samecase(wk) != samecase(wc))
return (0);
break;
}
@@ -732,8 +784,8 @@ void
globfree(pglob)
glob_t *pglob;
{
- register int i;
- register char **pp;
+ int i;
+ char **pp;
if (pglob->gl_pathv != NULL) {
pp = pglob->gl_pathv + pglob->gl_offs;
OpenPOWER on IntegriCloud