diff options
Diffstat (limited to 'Src/Zle')
-rw-r--r-- | Src/Zle/comp.h | 60 | ||||
-rw-r--r-- | Src/Zle/compcore.c | 86 | ||||
-rw-r--r-- | Src/Zle/compctl.c | 199 | ||||
-rw-r--r-- | Src/Zle/complete.c | 107 |
4 files changed, 218 insertions, 234 deletions
diff --git a/Src/Zle/comp.h b/Src/Zle/comp.h index 59ca5be06..f318b4049 100644 --- a/Src/Zle/comp.h +++ b/Src/Zle/comp.h @@ -309,70 +309,62 @@ typedef void (*CLPrintFunc)(Cmgroup, Cmatch *, int, int, int, int, #define CPN_NMATCHES 0 #define CP_NMATCHES (1 << CPN_NMATCHES) -#define CPN_MATCHER 1 -#define CP_MATCHER (1 << CPN_MATCHER) -#define CPN_MATCHERSTR 2 -#define CP_MATCHERSTR (1 << CPN_MATCHERSTR) -#define CPN_MATCHERTOT 3 -#define CP_MATCHERTOT (1 << CPN_MATCHERTOT) -#define CPN_CONTEXT 4 +#define CPN_CONTEXT 1 #define CP_CONTEXT (1 << CPN_CONTEXT) -#define CPN_PARAMETER 5 +#define CPN_PARAMETER 2 #define CP_PARAMETER (1 << CPN_PARAMETER) -#define CPN_REDIRECT 6 +#define CPN_REDIRECT 3 #define CP_REDIRECT (1 << CPN_REDIRECT) -#define CPN_QUOTE 7 +#define CPN_QUOTE 4 #define CP_QUOTE (1 << CPN_QUOTE) -#define CPN_QUOTING 8 +#define CPN_QUOTING 5 #define CP_QUOTING (1 << CPN_QUOTING) -#define CPN_RESTORE 9 +#define CPN_RESTORE 6 #define CP_RESTORE (1 << CPN_RESTORE) -#define CPN_LIST 10 +#define CPN_LIST 7 #define CP_LIST (1 << CPN_LIST) -#define CPN_INSERT 11 +#define CPN_INSERT 8 #define CP_INSERT (1 << CPN_INSERT) -#define CPN_EXACT 12 +#define CPN_EXACT 9 #define CP_EXACT (1 << CPN_EXACT) -#define CPN_EXACTSTR 13 +#define CPN_EXACTSTR 10 #define CP_EXACTSTR (1 << CPN_EXACTSTR) -#define CPN_PATMATCH 14 +#define CPN_PATMATCH 11 #define CP_PATMATCH (1 << CPN_PATMATCH) -#define CPN_PATINSERT 15 +#define CPN_PATINSERT 12 #define CP_PATINSERT (1 << CPN_PATINSERT) -#define CPN_UNAMBIG 16 +#define CPN_UNAMBIG 13 #define CP_UNAMBIG (1 << CPN_UNAMBIG) -#define CPN_UNAMBIGC 17 +#define CPN_UNAMBIGC 14 #define CP_UNAMBIGC (1 << CPN_UNAMBIGC) -#define CPN_LISTMAX 18 +#define CPN_LISTMAX 15 #define CP_LISTMAX (1 << CPN_LISTMAX) -#define CPN_LASTPROMPT 19 +#define CPN_LASTPROMPT 16 #define CP_LASTPROMPT (1 << CPN_LASTPROMPT) -#define CPN_TOEND 20 +#define CPN_TOEND 17 #define CP_TOEND (1 << CPN_TOEND) -#define CPN_OLDLIST 21 +#define CPN_OLDLIST 18 #define CP_OLDLIST (1 << CPN_OLDLIST) -#define CPN_OLDINS 22 +#define CPN_OLDINS 19 #define CP_OLDINS (1 << CPN_OLDINS) -#define CPN_VARED 23 +#define CPN_VARED 20 #define CP_VARED (1 << CPN_VARED) -#define CPN_ANMATCHES 24 +#define CPN_ANMATCHES 21 #define CP_ANMATCHES (1 << CPN_ANMATCHES) -#define CPN_LISTLINES 25 +#define CPN_LISTLINES 22 #define CP_LISTLINES (1 << CPN_LISTLINES) -#define CPN_QUOTES 26 +#define CPN_QUOTES 23 #define CP_QUOTES (1 << CPN_QUOTES) -#define CP_KEYPARAMS 27 -#define CP_ALLKEYS ((unsigned int) 0x7ffffff) +#define CP_KEYPARAMS 24 +#define CP_ALLKEYS ((unsigned int) 0xffffff) /* Hooks. */ #define INSERTMATCHHOOK (comphooks + 0) #define MENUSTARTHOOK (comphooks + 1) #define COMPCTLMAKEHOOK (comphooks + 2) -#define COMPCTLBEFOREHOOK (comphooks + 3) -#define COMPCTLAFTERHOOK (comphooks + 4) -#define COMPLISTMATCHESHOOK (comphooks + 5) +#define COMPLISTMATCHESHOOK (comphooks + 3) /* compctl hook data struct */ diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 246ca27a0..c0904069c 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -808,59 +808,21 @@ callcompfunc(char *s, char *fn) static int makecomplist(char *s, int incmd, int lst) { - struct cmlist ms; - Cmlist m; - char *p, *os = s; - int onm = nmatches, osi = movefd(0); + char *p; /* Inside $... ? */ if (compfunc && (p = check_param(s, 0, 0))) - os = s = p; - - /* We build a copy of the list of matchers to use to make sure that this - * works even if a shell function called from the completion code changes - * the global matchers. */ - - if ((m = cmatcher)) { - Cmlist mm, *mp = &mm; - int n; - - for (n = 0; m; m = m->next, n++) { - *mp = (Cmlist) zhalloc(sizeof(struct cmlist)); - (*mp)->matcher = m->matcher; - (*mp)->next = NULL; - (*mp)->str = dupstring(m->str); - mp = &((*mp)->next); - addlinknode(matchers, m->matcher); - if (m->matcher) - m->matcher->refc++; - } - m = mm; - compmatcher = 1; - compmatchertot = n; - } else - compmatcher = 0; + s = p; linwhat = inwhat; - /* Walk through the global matchers. */ - for (;;) { + if (compfunc) { + char *os = s; + int onm = nmatches, osi = movefd(0); + bmatchers = NULL; - zsfree(compmatcherstr); - if (m) { - ms.next = NULL; - ms.matcher = m->matcher; - mstack = &ms; - - /* Store the matchers used in the bmatchers list which is used - * when building new parts for the string to insert into the - * line. */ - add_bmatchers(m->matcher); - compmatcherstr = ztrdup(m->str); - } else { - mstack = NULL; - compmatcherstr = ztrdup(""); - } + mstack = NULL; + ainfo = (Aminfo) hcalloc(sizeof(struct aminfo)); fainfo = (Aminfo) hcalloc(sizeof(struct aminfo)); @@ -877,24 +839,10 @@ makecomplist(char *s, int incmd, int lst) begcmgroup("default", 0); menucmp = menuacc = newmatches = onlyexpl = 0; - runhookdef(COMPCTLBEFOREHOOK, NULL); - s = dupstring(os); - if (compfunc) - callcompfunc(s, compfunc); - else { - struct ccmakedat dat; - - dat.str = s; - dat.incmd = incmd; - dat.lst = lst; - runhookdef(COMPCTLMAKEHOOK, (void *) &dat); - } + callcompfunc(s, compfunc); endcmgroup(NULL); - runhookdef(COMPCTLAFTERHOOK, - (void *) ((amatches && !oldlist) ? 1L : 0L)); - if (oldlist) { nmatches = onm; validlist = 1; @@ -933,14 +881,18 @@ makecomplist(char *s, int incmd, int lst) return 0; } - if (!m || !(m = m->next)) - break; + redup(osi, 0); + return 1; + } else { + struct ccmakedat dat; + + dat.str = s; + dat.incmd = incmd; + dat.lst = lst; + runhookdef(COMPCTLMAKEHOOK, (void *) &dat); - errflag = 0; - compmatcher++; + return dat.lst; } - redup(osi, 0); - return 1; } /**/ diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c index 77a76c156..e8d71497d 100644 --- a/Src/Zle/compctl.c +++ b/Src/Zle/compctl.c @@ -30,6 +30,11 @@ #include "compctl.mdh" #include "compctl.pro" +/* Global matcher. */ + +/**/ +static Cmlist cmatcher; + /* Default completion infos */ /**/ @@ -275,6 +280,53 @@ compctlread(char *name, char **args, char *ops, char *reply) return 0; } +/* Copy a list of completion matchers. */ + +/**/ +static Cmlist +cpcmlist(Cmlist l) +{ + Cmlist r = NULL, *p = &r, n; + + while (l) { + *p = n = (Cmlist) zalloc(sizeof(struct cmlist)); + n->next = NULL; + n->matcher = cpcmatcher(l->matcher); + n->str = ztrdup(l->str); + + p = &(n->next); + l = l->next; + } + return r; +} + +/* Set the global match specs. */ + +/**/ +static int +set_gmatcher(char *name, char **argv) +{ + Cmlist l = NULL, *q = &l, n; + Cmatcher m; + + while (*argv) { + if ((m = parse_cmatcher(name, *argv)) == pcm_err) + return 1; + *q = n = (Cmlist) zhalloc(sizeof(struct cmlist)); + n->next = NULL; + n->matcher = m; + n->str = *argv++; + + q = &(n->next); + } + freecmlist(cmatcher); + PERMALLOC { + cmatcher = cpcmlist(l); + } LASTALLOC; + + return 1; +} + /* Try to get the global matcher from the given compctl. */ /**/ @@ -1709,39 +1761,134 @@ static int addwhat; static int ccmakehookfn(Hookdef dummy, struct ccmakedat *dat) { - makecomplistglobal(dat->str, dat->incmd, dat->lst, 0); + char *s = dat->str; + int incmd = dat->incmd, lst = dat->lst; + struct cmlist ms; + Cmlist m; + char *os = s; + int onm = nmatches, osi = movefd(0); + LinkNode n; - return 0; -} + /* We build a copy of the list of matchers to use to make sure that this + * works even if a shell function called from the completion code changes + * the global matchers. */ + + if ((m = cmatcher)) { + Cmlist mm, *mp = &mm; + int n; + + for (n = 0; m; m = m->next, n++) { + *mp = (Cmlist) zhalloc(sizeof(struct cmlist)); + (*mp)->matcher = m->matcher; + (*mp)->next = NULL; + (*mp)->str = dupstring(m->str); + mp = &((*mp)->next); + addlinknode(matchers, m->matcher); + if (m->matcher) + m->matcher->refc++; + } + m = mm; + } + + /* Walk through the global matchers. */ + for (;;) { + bmatchers = NULL; + if (m) { + ms.next = NULL; + ms.matcher = m->matcher; + mstack = &ms; + + /* Store the matchers used in the bmatchers list which is used + * when building new parts for the string to insert into the + * line. */ + add_bmatchers(m->matcher); + } else + mstack = NULL; -static int -ccbeforehookfn(Hookdef dummy, void *zdup) -{ - ccused = newlinklist(); - ccstack = newlinklist(); + ainfo = (Aminfo) hcalloc(sizeof(struct aminfo)); + fainfo = (Aminfo) hcalloc(sizeof(struct aminfo)); - return 0; -} + freecl = NULL; -static int -ccafterhookfn(Hookdef dummy, void *zdup) -{ - LinkNode n; + if (!validlist) + lastambig = 0; + amatches = NULL; + mnum = 0; + unambig_mnum = -1; + isuf = NULL; + insmnum = insgnum = 1; + insgroup = oldlist = oldins = 0; + begcmgroup("default", 0); + menucmp = menuacc = newmatches = onlyexpl = 0; - if (zdup) { - if (lastccused) - freelinklist(lastccused, (FreeFunc) freecompctl); + ccused = newlinklist(); + ccstack = newlinklist(); - PERMALLOC { - lastccused = newlinklist(); + s = dupstring(os); + makecomplistglobal(s, incmd, lst, 0); + endcmgroup(NULL); + + if (amatches && !oldlist) { + if (lastccused) + freelinklist(lastccused, (FreeFunc) freecompctl); + + PERMALLOC { + lastccused = newlinklist(); + for (n = firstnode(ccused); n; incnode(n)) + addlinknode(lastccused, getdata(n)); + } LASTALLOC; + } else for (n = firstnode(ccused); n; incnode(n)) - addlinknode(lastccused, getdata(n)); + if (((Compctl) getdata(n)) != &cc_dummy) + freecompctl((Compctl) getdata(n)); + + if (oldlist) { + nmatches = onm; + validlist = 1; + amatches = lastmatches; + lmatches = lastlmatches; + if (pmatches) { + freematches(pmatches); + pmatches = NULL; + hasperm = 0; + } + redup(osi, 0); + + dat->lst = 0; + return 0; + } + PERMALLOC { + if (lastmatches) { + freematches(lastmatches); + lastmatches = NULL; + } + permmatches(1); + amatches = pmatches; + lastpermmnum = permmnum; + lastpermgnum = permgnum; } LASTALLOC; - } else - for (n = firstnode(ccused); n; incnode(n)) - if (((Compctl) getdata(n)) != &cc_dummy) - freecompctl((Compctl) getdata(n)); + lastmatches = pmatches; + lastlmatches = lmatches; + pmatches = NULL; + hasperm = 0; + hasoldlist = 1; + + if (nmatches && !errflag) { + validlist = 1; + + redup(osi, 0); + + dat->lst = 0; + return 0; + } + if (!m || !(m = m->next)) + break; + + errflag = 0; + } + redup(osi, 0); + dat->lst = 1; return 0; } @@ -3755,8 +3902,6 @@ int boot_(Module m) { addhookfunc("compctl_make", (Hookfn) ccmakehookfn); - addhookfunc("compctl_before", (Hookfn) ccbeforehookfn); - addhookfunc("compctl_after", (Hookfn) ccafterhookfn); return (addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)) != 1); } @@ -3765,8 +3910,6 @@ int cleanup_(Module m) { deletehookfunc("compctl_make", (Hookfn) ccmakehookfn); - deletehookfunc("compctl_before", (Hookfn) ccbeforehookfn); - deletehookfunc("compctl_after", (Hookfn) ccafterhookfn); deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); return 0; } diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c index dd3b59786..f0a8f1395 100644 --- a/Src/Zle/complete.c +++ b/Src/Zle/complete.c @@ -30,19 +30,12 @@ #include "complete.mdh" #include "complete.pro" -/* Global matcher. */ - -/**/ -mod_export Cmlist cmatcher; - /* global variables for shell parameters in new style completion */ /**/ mod_export zlong compcurrent; /**/ -zlong compmatcher, - compmatchertot, - complistmax, +zlong complistmax, complistlines; /**/ @@ -59,7 +52,6 @@ char **compwords, *complastprompt; /**/ char *compiprefix, - *compmatcherstr, *compcontext, *compparameter, *compredirect, @@ -131,26 +123,6 @@ freecpattern(Cpattern p) } } -/* Copy a list of completion matchers. */ - -/**/ -static Cmlist -cpcmlist(Cmlist l) -{ - Cmlist r = NULL, *p = &r, n; - - while (l) { - *p = n = (Cmlist) zalloc(sizeof(struct cmlist)); - n->next = NULL; - n->matcher = cpcmatcher(l->matcher); - n->str = ztrdup(l->str); - - p = &(n->next); - l = l->next; - } - return r; -} - /* Copy a completion matcher list. */ /**/ @@ -201,33 +173,6 @@ cpcpattern(Cpattern o) return r; } -/* Set the global match specs. */ - -/**/ -mod_export int -set_gmatcher(char *name, char **argv) -{ - Cmlist l = NULL, *q = &l, n; - Cmatcher m; - - while (*argv) { - if ((m = parse_cmatcher(name, *argv)) == pcm_err) - return 1; - *q = n = (Cmlist) zhalloc(sizeof(struct cmlist)); - n->next = NULL; - n->matcher = m; - n->str = *argv++; - - q = &(n->next); - } - freecmlist(cmatcher); - PERMALLOC { - cmatcher = cpcmlist(l); - } LASTALLOC; - - return 1; -} - /* Parse a string for matcher control, containing multiple matchers. */ /**/ @@ -943,9 +888,6 @@ static struct compparam comprparams[] = { static struct compparam compkparams[] = { { "nmatches", PM_INTEGER | PM_READONLY, NULL, NULL, VAL(get_nmatches) }, - { "matcher", PM_INTEGER, VAL(compmatcher), NULL, NULL }, - { "matcher_string", PM_SCALAR, VAL(compmatcherstr), NULL, NULL }, - { "total_matchers", PM_INTEGER, VAL(compmatchertot), NULL, NULL }, { "context", PM_SCALAR, VAL(compcontext), NULL, NULL }, { "parameter", PM_SCALAR, VAL(compparameter), NULL, NULL }, { "redirect", PM_SCALAR, VAL(compredirect), NULL, NULL }, @@ -1322,42 +1264,6 @@ cond_range(char **a, int id) (id ? cond_str(a, 1, 1) : NULL), 0); } -/**/ -static void -cmsetfn(Param pm, char **v) -{ - set_gmatcher(pm->nam, v); -} - -/**/ -static char ** -cmgetfn(Param pm) -{ - int num; - Cmlist p; - char **ret, **q; - - for (num = 0, p = cmatcher; p; p = p->next, num++); - - ret = (char **) zhalloc((num + 1) * sizeof(char *)); - - for (q = ret, p = cmatcher; p; p = p->next, q++) - *q = dupstring(p->str); - *q = NULL; - - return ret; -} - -/**/ -static void -cmunsetfn(Param pm, int exp) -{ - char *dummy[1]; - - dummy[0] = NULL; - set_gmatcher(pm->nam, dummy); -} - static struct builtin bintab[] = { BUILTIN("compadd", 0, bin_compadd, 0, -1, 0, NULL, NULL), BUILTIN("compset", 0, bin_compset, 1, 3, 0, NULL, NULL), @@ -1374,10 +1280,6 @@ static struct funcwrap wrapper[] = { WRAPDEF(comp_wrapper), }; -static struct paramdef patab[] = { - PARAMDEF("compmatchers", PM_ARRAY|PM_SPECIAL, NULL, cmsetfn, cmgetfn, cmunsetfn) -}; - /* The order of the entries in this table has to match the *HOOK * macros in comp.h */ @@ -1386,8 +1288,6 @@ struct hookdef comphooks[] = { HOOKDEF("insert_match", NULL, HOOKF_ALL), HOOKDEF("menu_start", NULL, HOOKF_ALL), HOOKDEF("compctl_make", NULL, 0), - HOOKDEF("compctl_before", NULL, 0), - HOOKDEF("compctl_after", NULL, 0), HOOKDEF("comp_list_matches", ilistmatches, 0), }; @@ -1400,7 +1300,7 @@ setup_(Module m) comprpms = compkpms = NULL; compwords = NULL; compprefix = compsuffix = compiprefix = compisuffix = - compqiprefix = compqisuffix = compmatcherstr = + compqiprefix = compqisuffix = compcontext = compparameter = compredirect = compquote = compquoting = comprestore = complist = compinsert = compexact = compexactstr = comppatmatch = comppatinsert = @@ -1426,7 +1326,6 @@ boot_(Module m) addhookdefs(m->nam, comphooks, sizeof(comphooks)/sizeof(*comphooks)); if (!(addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)) | addconddefs(m->nam, cotab, sizeof(cotab)/sizeof(*cotab)) | - addparamdefs(m->nam, patab, sizeof(patab)/sizeof(*patab)) | !addwrapper(m, wrapper))) return 1; return 0; @@ -1446,7 +1345,6 @@ cleanup_(Module m) deletehookdefs(m->nam, comphooks, sizeof(comphooks)/sizeof(*comphooks)); deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); deleteconddefs(m->nam, cotab, sizeof(cotab)/sizeof(*cotab)); - deleteparamdefs(m->nam, patab, sizeof(patab)/sizeof(*patab)); deletewrapper(m, wrapper); return 0; } @@ -1463,7 +1361,6 @@ finish_(Module m) zsfree(compisuffix); zsfree(compqiprefix); zsfree(compqisuffix); - zsfree(compmatcherstr); zsfree(compcontext); zsfree(compparameter); zsfree(compredirect); |