mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-23 00:41:03 +01:00
33136: P glob qual appends words when negated
This commit is contained in:
parent
089123f9e8
commit
78dd672e1a
3 changed files with 26 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
|||
2014-09-16 Mikael Magnusson <mikachu@gmail.com>
|
||||
|
||||
* 33136: Doc/Zsh/expn.yo, Src/glob.c: P glob qualifier appends
|
||||
words when negated.
|
||||
|
||||
2014-09-14 Marc Finet <m.dreadlock@gmail.com>
|
||||
|
||||
* 33149: Misc/vcs_info-examples: vcs_info examples: fix typo
|
||||
|
|
|
@ -2663,6 +2663,12 @@ list of glob qualifiers.
|
|||
A typical use for this is to prepend an option before all occurrences
|
||||
of a file name; for example, the pattern `tt(*(P:-f:))' produces the
|
||||
command line arguments `tt(-f) var(file1) tt(-f) var(file2) ...'
|
||||
|
||||
If the modifier tt(^) is active, then var(string) will be appended
|
||||
instead of prepended. Prepending and appending is done independently
|
||||
so both can be used on the same glob expression; for example by writing
|
||||
`tt(*(P:foo:^P:bar:^P:baz:))' which produces the command line arguments
|
||||
`tt(foo) tt(baz) var(file1) tt(bar) ...'
|
||||
)
|
||||
enditem()
|
||||
|
||||
|
|
21
Src/glob.c
21
Src/glob.c
|
@ -178,7 +178,7 @@ struct globdata {
|
|||
int gd_gf_numsort;
|
||||
int gd_gf_follow, gd_gf_sorts, gd_gf_nsorts;
|
||||
struct globsort gd_gf_sortlist[MAX_SORTS];
|
||||
LinkList gd_gf_pre_words;
|
||||
LinkList gd_gf_pre_words, gd_gf_post_words;
|
||||
|
||||
char *gd_glob_pre, *gd_glob_suf;
|
||||
};
|
||||
|
@ -210,6 +210,7 @@ static struct globdata curglobdata;
|
|||
#define gf_nsorts (curglobdata.gd_gf_nsorts)
|
||||
#define gf_sortlist (curglobdata.gd_gf_sortlist)
|
||||
#define gf_pre_words (curglobdata.gd_gf_pre_words)
|
||||
#define gf_post_words (curglobdata.gd_gf_post_words)
|
||||
|
||||
/* and macros for save/restore */
|
||||
|
||||
|
@ -1074,7 +1075,14 @@ insert_glob_match(LinkList list, LinkNode next, char *data)
|
|||
}
|
||||
}
|
||||
|
||||
insertlinknode(list, next, data);
|
||||
next = insertlinknode(list, next, data);
|
||||
|
||||
if (gf_post_words) {
|
||||
LinkNode added;
|
||||
for (added = firstnode(gf_post_words); added; incnode(added)) {
|
||||
next = insertlinknode(list, next, dupstring(getdata(added)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1190,7 +1198,7 @@ zglob(LinkList list, LinkNode np, int nountok)
|
|||
gf_noglobdots = unset(GLOBDOTS);
|
||||
gf_numsort = isset(NUMERICGLOBSORT);
|
||||
gf_sorts = gf_nsorts = 0;
|
||||
gf_pre_words = NULL;
|
||||
gf_pre_words = gf_post_words = NULL;
|
||||
|
||||
/* Check for qualifiers */
|
||||
while (!nobareglob ||
|
||||
|
@ -1679,9 +1687,10 @@ zglob(LinkList list, LinkNode np, int nountok)
|
|||
|
||||
if (tt != NULL)
|
||||
{
|
||||
if (!gf_pre_words)
|
||||
gf_pre_words = newlinklist();
|
||||
addlinknode(gf_pre_words, tt);
|
||||
LinkList *words = sense & 1 ? &gf_post_words : &gf_pre_words;
|
||||
if (!*words)
|
||||
*words = newlinklist();
|
||||
addlinknode(*words, tt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue