summaryrefslogtreecommitdiffstats
path: root/source/ap/ash/patches/ash-glob.patch
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/ash/patches/ash-glob.patch')
-rw-r--r--source/ap/ash/patches/ash-glob.patch445
1 files changed, 445 insertions, 0 deletions
diff --git a/source/ap/ash/patches/ash-glob.patch b/source/ap/ash/patches/ash-glob.patch
new file mode 100644
index 000000000..70013536e
--- /dev/null
+++ b/source/ap/ash/patches/ash-glob.patch
@@ -0,0 +1,445 @@
+diff -urN netbsd-sh/expand.c ash-0.3.7.orig/expand.c
+--- netbsd-sh/expand.c Tue Mar 14 13:03:45 2000
++++ ash-0.3.7.orig/expand.c Mon Apr 23 22:16:46 2001
+@@ -54,6 +54,10 @@
+ #include <pwd.h>
+ #include <stdlib.h>
+ #include <stdio.h>
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++#include <fnmatch.h>
++#include <glob.h>
++#endif
+
+ /*
+ * Routines to expand arguments to commands. We have to deal with
+@@ -102,17 +106,30 @@
+ STATIC int subevalvar __P((char *, char *, int, int, int, int));
+ STATIC char *evalvar __P((char *, int));
+ STATIC int varisset __P((char *, int));
++STATIC char *strtodest __P((char *, int, int));
+ STATIC void varvalue __P((char *, int, int));
+ STATIC void recordregion __P((int, int, int));
+ STATIC void removerecordregions __P((int));
+ STATIC void ifsbreakup __P((char *, struct arglist *));
+ STATIC void ifsfree __P((void));
+ STATIC void expandmeta __P((struct strlist *, int));
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++STATIC const char *preglob __P((const char *));
++STATIC void addglob __P((const glob_t *));
++#else
+ STATIC void expmeta __P((char *, char *));
++#endif
+ STATIC void addfname __P((char *));
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++STATIC int patmatch __P((char *, char *, int));
++STATIC int patmatch2 __P((char *, char *, int));
++STATIC char * _rmescapes __P((char *, int));
++#else
+ STATIC struct strlist *expsort __P((struct strlist *));
+ STATIC struct strlist *msort __P((struct strlist *, int));
+ STATIC int pmatch __P((char *, char *, int));
++#define patmatch2 patmatch
++#endif
+ STATIC char *cvtnum __P((int, char *));
+
+ /*
+@@ -371,7 +388,7 @@
+ * have to rescan starting from the beginning since CTLESC
+ * characters have to be processed left to right.
+ */
+- CHECKSTRSPACE(8, expdest);
++ CHECKSTRSPACE(10, expdest);
+ USTPUTC('\0', expdest);
+ start = stackblock();
+ p = expdest - 1;
+@@ -393,7 +410,7 @@
+ if (quotes)
+ rmescapes(p+2);
+ result = arith(p+2);
+- fmtstr(p, 10, "%d", result);
++ fmtstr(p, 12, "%d", result);
+
+ while (*p++)
+ ;
+@@ -503,7 +520,7 @@
+ int amount;
+
+ herefd = -1;
+- argstr(p, 0);
++ argstr(p, subtype != VSASSIGN && subtype != VSQUESTION ? EXP_CASE : 0);
+ STACKSTRNUL(expdest);
+ herefd = saveherefd;
+ argbackq = saveargbackq;
+@@ -535,7 +552,7 @@
+ for (loc = startp; loc < str; loc++) {
+ c = *loc;
+ *loc = '\0';
+- if (patmatch(str, startp, varflags & VSQUOTE))
++ if (patmatch2(str, startp, varflags & VSQUOTE))
+ goto recordleft;
+ *loc = c;
+ if ((varflags & VSQUOTE) && *loc == CTLESC)
+@@ -547,7 +564,7 @@
+ for (loc = str - 1; loc >= startp;) {
+ c = *loc;
+ *loc = '\0';
+- if (patmatch(str, startp, varflags & VSQUOTE))
++ if (patmatch2(str, startp, varflags & VSQUOTE))
+ goto recordleft;
+ *loc = c;
+ loc--;
+@@ -564,7 +581,7 @@
+
+ case VSTRIMRIGHT:
+ for (loc = str - 1; loc >= startp;) {
+- if (patmatch(str, loc, varflags & VSQUOTE))
++ if (patmatch2(str, loc, varflags & VSQUOTE))
+ goto recordright;
+ loc--;
+ if ((varflags & VSQUOTE) && loc > startp &&
+@@ -580,7 +597,7 @@
+
+ case VSTRIMRIGHTMAX:
+ for (loc = startp; loc < str - 1; loc++) {
+- if (patmatch(str, loc, varflags & VSQUOTE))
++ if (patmatch2(str, loc, varflags & VSQUOTE))
+ goto recordright;
+ if ((varflags & VSQUOTE) && *loc == CTLESC)
+ loc++;
+@@ -819,6 +836,34 @@
+
+
+ /*
++ * Put a string on the stack.
++ */
++
++STATIC char *
++strtodest(p, quoted, allow_split)
++ char *p;
++ int quoted;
++ int allow_split;
++{
++ char const *syntax;
++
++ if (allow_split) {
++ syntax = quoted ? DQSYNTAX : BASESYNTAX;
++ while (*p) {
++ if (syntax[(int) *p] == CCTL)
++ STPUTC(CTLESC, expdest);
++ STPUTC(*p++, expdest);
++ }
++ } else
++ while (*p)
++ STPUTC(*p++, expdest);
++
++ return p;
++}
++
++
++
++/*
+ * Add the value of a specialized variable to the stack string.
+ */
+
+@@ -834,22 +879,6 @@
+ extern int oexitstatus;
+ char sep;
+ char **ap;
+- char const *syntax;
+-
+-#define STRTODEST(p) \
+- do {\
+- if (allow_split) { \
+- syntax = quoted? DQSYNTAX : BASESYNTAX; \
+- while (*p) { \
+- if (syntax[(int)*p] == CCTL) \
+- STPUTC(CTLESC, expdest); \
+- STPUTC(*p++, expdest); \
+- } \
+- } else \
+- while (*p) \
+- STPUTC(*p++, expdest); \
+- } while (0)
+-
+
+ switch (*name) {
+ case '$':
+@@ -875,7 +904,7 @@
+ case '@':
+ if (allow_split && quoted) {
+ for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
+- STRTODEST(p);
++ p = strtodest(p, quoted, allow_split);
+ if (*ap)
+ STPUTC('\0', expdest);
+ }
+@@ -888,21 +917,20 @@
+ else
+ sep = ' ';
+ for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
+- STRTODEST(p);
++ p = strtodest(p, quoted, allow_split);
+ if (*ap && sep)
+ STPUTC(sep, expdest);
+ }
+ break;
+ case '0':
+- p = arg0;
+- STRTODEST(p);
++ p = strtodest(arg0, quoted, allow_split);
+ break;
+ default:
+ if (is_digit(*name)) {
+ num = atoi(name);
+ if (num > 0 && num <= shellparam.nparam) {
+- p = shellparam.p[num - 1];
+- STRTODEST(p);
++ p = strtodest(shellparam.p[num - 1], quoted,
++ allow_split);
+ }
+ }
+ break;
+@@ -1054,6 +1082,98 @@
+ * should be escapes. The results are stored in the list exparg.
+ */
+
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++STATIC void
++expandmeta(str, flag)
++ struct strlist *str;
++ int flag;
++{
++ const char *p;
++ glob_t pglob;
++ /* TODO - EXP_REDIR */
++
++ while (str) {
++ if (fflag)
++ goto nometa;
++ p = preglob(str->text);
++ INTOFF;
++ switch (glob(p, GLOB_NOMAGIC, 0, &pglob)) {
++ case 0:
++ if (!(pglob.gl_flags & GLOB_MAGCHAR))
++ goto nometa2;
++ addglob(&pglob);
++ globfree(&pglob);
++ INTON;
++ break;
++ case GLOB_NOMATCH:
++nometa2:
++ globfree(&pglob);
++ INTON;
++nometa:
++ *exparg.lastp = str;
++ rmescapes(str->text);
++ exparg.lastp = &str->next;
++ break;
++ default: /* GLOB_NOSPACE */
++ error("Out of space");
++ }
++ str = str->next;
++ }
++}
++
++
++/*
++ * Prepare the string for glob(3).
++ */
++
++STATIC const char *
++preglob(str)
++ const char *str;
++{
++ const char *p;
++ char *q, *r;
++ size_t len;
++
++ p = str;
++ while (*p != CTLQUOTEMARK && *p != CTLESC) {
++ if (*p++ == '\0')
++ return str;
++ }
++ len = p - str;
++ q = r = stalloc(strlen(str) + 1);
++ if (len > 0) {
++ memcpy(q, str, len);
++ q += len;
++ }
++ do {
++ if (*p == CTLQUOTEMARK)
++ continue;
++ if (*p == CTLESC) {
++ if (*++p != '/')
++ *q++ = '\\';
++ }
++ *q++ = *p;
++ } while (*++p);
++ *q = '\0';
++ return r;
++}
++
++
++/*
++ * Add the result of glob(3) to the list.
++ */
++
++STATIC void
++addglob(pglob)
++ const glob_t *pglob;
++{
++ char **p = pglob->gl_pathv;
++
++ do {
++ addfname(*p);
++ } while (*++p);
++}
++#else
+ char *expdir;
+
+
+@@ -1238,6 +1358,7 @@
+ if (! atend)
+ endname[-1] = '/';
+ }
++#endif
+
+
+ /*
+@@ -1260,6 +1381,7 @@
+ }
+
+
++#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN))
+ /*
+ * Sort the results of file name expansion. It calculates the number of
+ * strings to sort and then calls msort (short for merge sort) to do the
+@@ -1321,6 +1443,7 @@
+ }
+ return list;
+ }
++#endif
+
+
+
+@@ -1328,6 +1451,39 @@
+ * Returns true if the pattern matches the string.
+ */
+
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++STATIC int
++patmatch(pattern, string, squoted)
++ char *pattern;
++ char *string;
++ int squoted; /* string might have quote chars */
++ {
++ const char *p;
++ char *q;
++
++ p = preglob(pattern);
++ q = squoted ? _rmescapes(string, 1) : string;
++
++ return !fnmatch(p, q, 0);
++}
++
++
++STATIC int
++patmatch2(pattern, string, squoted)
++ char *pattern;
++ char *string;
++ int squoted; /* string might have quote chars */
++ {
++ char *p;
++ int res;
++
++ sstrnleft--;
++ p = grabstackstr(expdest);
++ res = patmatch(pattern, string, squoted);
++ ungrabstackstr(p, expdest);
++ return res;
++}
++#else
+ int
+ patmatch(pattern, string, squoted)
+ char *pattern;
+@@ -1462,6 +1618,7 @@
+ return 0;
+ return 1;
+ }
++#endif
+
+
+
+@@ -1469,6 +1626,50 @@
+ * Remove any CTLESC characters from a string.
+ */
+
++#if defined(__GLIBC__) && !defined(GLOB_BROKEN)
++void
++rmescapes(str)
++ char *str;
++{
++ _rmescapes(str, 0);
++}
++
++
++STATIC char *
++_rmescapes(str, flag)
++ char *str;
++ int flag;
++{
++ char *p, *q, *r;
++
++ p = str;
++ while (*p != CTLESC && *p != CTLQUOTEMARK) {
++ if (*p++ == '\0')
++ return str;
++ }
++ q = p;
++ r = str;
++ if (flag) {
++ size_t len = p - str;
++ q = r = stalloc(strlen(p) + len + 1);
++ if (len > 0) {
++ memcpy(q, str, len);
++ q += len;
++ }
++ }
++ while (*p) {
++ if (*p == CTLQUOTEMARK) {
++ p++;
++ continue;
++ }
++ if (*p == CTLESC)
++ p++;
++ *q++ = *p++;
++ }
++ *q = '\0';
++ return r;
++}
++#else
+ void
+ rmescapes(str)
+ char *str;
+@@ -1492,6 +1693,7 @@
+ }
+ *q = '\0';
+ }
++#endif
+
+
+
+
+diff -urN netbsd-sh/expand.h ash-0.3.7.orig/expand.h
+--- netbsd-sh/expand.h Fri Jul 9 13:02:06 1999
++++ ash-0.3.7.orig/expand.h Mon Apr 23 22:16:46 2001
+@@ -64,7 +64,9 @@
+ void expandhere __P((union node *, int));
+ void expandarg __P((union node *, struct arglist *, int));
+ void expari __P((int));
++#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN))
+ int patmatch __P((char *, char *, int));
++#endif
+ void rmescapes __P((char *));
+ int casematch __P((union node *, char *));
+