1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-20 06:56:05 +02:00

33136: P glob qual appends words when negated

This commit is contained in:
Mikael Magnusson 2012-05-31 21:08:31 +02:00
parent 089123f9e8
commit 78dd672e1a
3 changed files with 26 additions and 6 deletions

View File

@ -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

View File

@ -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()

View File

@ -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;
}