On Wed, 3 Mar 2010 18:14:51 -0500
Brad <[email protected]> wrote:
> On Thursday 04 March 2010 03:00:03 Sviatoslav Chagaev wrote:
> > Greetings and felicitations!
>
> Ensure the diffs are created as a unified diff (.e.g. cvs diff -upRN) if
> you actually want anyone to look at them ;)
>
> --
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
>
Ok, sorry:
Index: edit.c
===================================================================
RCS file: /OpenBSD/src/bin/ksh/edit.c,v
retrieving revision 1.33
diff -u -p -r1.33 edit.c
--- edit.c 2 Aug 2007 10:50:25 -0000 1.33
+++ edit.c 3 Mar 2010 23:20:14 -0000
@@ -411,7 +411,7 @@ x_file_glob(int flags, const char *str,
}
source = sold;
XPinit(w, 32);
- expand(yylval.cp, &w, DOGLOB|DOTILDE|DOMARKDIRS);
+ expand(yylval.cp, &w, DOCOMPLETION|DOGLOB|DOTILDE|DOMARKDIRS);
XPput(w, NULL);
words = (char **) XPclose(w);
@@ -484,7 +484,7 @@ x_command_glob(int flags, const char *st
toglob = add_glob(str, slen);
/* Convert "foo*" (toglob) to a pattern for future use */
- pat = evalstr(toglob, DOPAT|DOTILDE);
+ pat = evalstr(toglob, DOCOMPLETION|DOPAT|DOTILDE);
afree(toglob, ATEMP);
XPinit(w, 32);
@@ -647,41 +647,20 @@ x_cf_glob(int flags, const char *buf, in
return nwords;
}
-/* Given a string, copy it and possibly add a '*' to the end. The
+/* Given a string, copy it and add a '*' to the end. The
* new string is returned.
*/
static char *
add_glob(const char *str, int slen)
{
char *toglob;
- char *s;
- bool saw_slash = false;
if (slen < 0)
return (char *) 0;
- toglob = str_nsave(str, slen + 1, ATEMP); /* + 1 for "*" */
- toglob[slen] = '\0';
-
- /*
- * If the pathname contains a wildcard (an unquoted '*',
- * '?', or '[') or parameter expansion ('$'), or a ~username
- * with no trailing slash, then it is globbed based on that
- * value (i.e., without the appended '*').
- */
- for (s = toglob; *s; s++) {
- if (*s == '\\' && s[1])
- s++;
- else if (*s == '*' || *s == '[' || *s == '?' || *s == '$'
- || (s[1] == '(' /*)*/ && strchr("*...@!", *s)))
- break;
- else if (*s == '/')
- saw_slash = true;
- }
- if (!*s && (*toglob != '~' || saw_slash)) {
- toglob[slen] = '*';
- toglob[slen + 1] = '\0';
- }
+ toglob = str_nsave(str, slen + 1, ATEMP);
+ toglob[slen] = '*';
+ toglob[slen + 1] = '\0';
return toglob;
}
Index: eval.c
===================================================================
RCS file: /OpenBSD/src/bin/ksh/eval.c,v
retrieving revision 1.34
diff -u -p -r1.34 eval.c
--- eval.c 29 Jan 2009 23:27:26 -0000 1.34
+++ eval.c 3 Mar 2010 23:20:14 -0000
@@ -554,7 +554,7 @@ expand(char *cp, /* input word */
else
#endif /* BRACE_EXPAND */
if (fdo & DOGLOB)
- glob(p, wp, f & DOMARKDIRS);
+ glob(p, wp, f & (DOCOMPLETION |
DOMARKDIRS));
else if ((f & DOPAT) || !(fdo & DOMAGIC_))
XPput(*wp, p);
else
@@ -596,15 +596,18 @@ expand(char *cp, /* input word */
* to have magic !,-,]'s outside of
* [...] expressions.
*/
- if (f & (DOPAT | DOGLOB)) {
+ if (!(f & DOCOMPLETION) && f & (DOPAT |
DOGLOB)) {
fdo |= DOMAGIC_;
if (c == '[')
fdo |= f & DOGLOB;
*dp++ = MAGIC;
}
break;
- case '*':
case '?':
+ if (f & DOCOMPLETION)
+ break;
+ /* fall through */
+ case '*':
if (f & (DOPAT | DOGLOB)) {
fdo |= DOMAGIC_ | (f & DOGLOB);
*dp++ = MAGIC;
@@ -614,10 +617,11 @@ expand(char *cp, /* input word */
case OBRACE:
case ',':
case CBRACE:
- if ((f & DOBRACE_) && (c == OBRACE ||
- (fdo & DOBRACE_))) {
- fdo |= DOBRACE_|DOMAGIC_;
- *dp++ = MAGIC;
+ if (!(f & DOCOMPLETION) &&
+ (f & DOBRACE_) &&
+ (c == OBRACE || (fdo &
DOBRACE_))) {
+ fdo |=
DOBRACE_|DOMAGIC_;
+ *dp++ = MAGIC;
}
break;
#endif /* BRACE_EXPAND */
@@ -933,13 +937,14 @@ trimsub(char *str, char *pat, int how)
/* XXX cp not const 'cause slashes are temporarily replaced with nulls... */
static void
-glob(char *cp, XPtrV *wp, int markdirs)
+glob(char *cp, XPtrV *wp, int flags)
{
int oldsize = XPsize(*wp);
- if (glob_str(cp, wp, markdirs) == 0)
- XPput(*wp, debunk(cp, cp, strlen(cp) + 1));
- else
+ if (glob_str(cp, wp, flags & DOMARKDIRS) == 0) {
+ if (!(flags & DOCOMPLETION))
+ XPput(*wp, debunk(cp, cp, strlen(cp) + 1));
+ } else
qsortp(XPptrv(*wp) + oldsize, (size_t)(XPsize(*wp) - oldsize),
xstrcmp);
}
@@ -1141,8 +1146,8 @@ debunk(char *dp, const char *sp, size_t
if ((s = strchr(sp, MAGIC))) {
if (s - sp >= dlen)
- return dp;
- memcpy(dp, sp, s - sp);
+ return dp;
+ memmove(dp, sp, s - sp);
for (d = dp + (s - sp); *s && (d - dp < dlen); s++)
if (!ISMAGIC(*s) || !(*++s & 0x80) ||
!strchr("*...@! ", *s & 0x7f))
Index: tree.h
===================================================================
RCS file: /OpenBSD/src/bin/ksh/tree.h,v
retrieving revision 1.10
diff -u -p -r1.10 tree.h
--- tree.h 28 Mar 2005 21:28:22 -0000 1.10
+++ tree.h 3 Mar 2010 23:20:18 -0000
@@ -126,6 +126,7 @@ struct ioword {
#define DOTEMP_ BIT(8) /* ditto : in word part of
${..[%#=?]..} */
#define DOVACHECK BIT(9) /* var assign check (for typeset, set, etc) */
#define DOMARKDIRS BIT(10) /* force markdirs behaviour */
+#define DOCOMPLETION BIT(11) /* hint that we are doing an auto-completion */
/*
* The arguments of [[ .. ]] expressions are kept in t->args[] and flags