summaryrefslogtreecommitdiff
path: root/Src/Zle
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/compctl.c70
-rw-r--r--Src/Zle/complete.c54
-rw-r--r--Src/Zle/complist.c6
-rw-r--r--Src/Zle/computil.c44
-rw-r--r--Src/Zle/textobjects.c7
-rw-r--r--Src/Zle/zle.h2
-rw-r--r--Src/Zle/zle_thingy.c5
-rw-r--r--Src/Zle/zle_tricky.c11
-rw-r--r--Src/Zle/zle_word.c119
9 files changed, 164 insertions, 154 deletions
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index 5414b8ff6..87d13afc1 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -383,7 +383,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
* cct is a temporary just to hold flags; it never needs freeing.
*/
struct compctl cct;
- char **argv = *av;
+ char **argv = *av, argv_end[2] = "x";
int ready = 0, hx = 0;
/* Handle `compctl + foo ...' specially: turn it into
@@ -516,14 +516,14 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
}
if ((*argv)[1]) {
p = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "retry specification expected after -%c",
**argv);
return 1;
} else {
p = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
switch (*p) {
case '+':
@@ -553,25 +553,25 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
case 'k':
if ((*argv)[1]) {
cct.keyvar = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "variable name expected after -%c", **argv);
return 1;
} else {
cct.keyvar = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'K':
if ((*argv)[1]) {
cct.func = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "function name expected after -%c", **argv);
return 1;
} else {
cct.func = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'Y':
@@ -582,74 +582,74 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
expl:
if ((*argv)[1]) {
cct.explain = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "string expected after -%c", **argv);
return 1;
} else {
cct.explain = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'y':
if ((*argv)[1]) {
cct.ylist = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "function/variable expected after -%c",
**argv);
} else {
cct.ylist = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'P':
if ((*argv)[1]) {
cct.prefix = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "string expected after -%c", **argv);
return 1;
} else {
cct.prefix = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'S':
if ((*argv)[1]) {
cct.suffix = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "string expected after -%c", **argv);
return 1;
} else {
cct.suffix = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'g':
if ((*argv)[1]) {
cct.glob = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "glob pattern expected after -%c", **argv);
return 1;
} else {
cct.glob = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 's':
if ((*argv)[1]) {
cct.str = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "command string expected after -%c",
**argv);
return 1;
} else {
cct.str = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'l':
@@ -658,13 +658,13 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
return 1;
} else if ((*argv)[1]) {
cct.subcmd = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "command name expected after -%c", **argv);
return 1;
} else {
cct.subcmd = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'h':
@@ -673,49 +673,49 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
return 1;
} else if ((*argv)[1]) {
cct.substr = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "command name expected after -%c", **argv);
return 1;
} else {
cct.substr = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'W':
if ((*argv)[1]) {
cct.withd = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "path expected after -%c", **argv);
return 1;
} else {
cct.withd = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'J':
if ((*argv)[1]) {
cct.gname = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "group name expected after -%c", **argv);
return 1;
} else {
cct.gname = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'V':
if ((*argv)[1]) {
cct.gname = (*argv) + 1;
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "group name expected after -%c", **argv);
return 1;
} else {
cct.gname = *++argv;
- *argv = "" - 1;
+ *argv = argv_end;
}
cct.mask2 |= CC_NOSORT;
break;
@@ -738,7 +738,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
cct.mstr = NULL;
return 1;
}
- *argv = "" - 1;
+ *argv = argv_end;
} else if (!argv[1]) {
zwarnnam(name, "matching specification expected after -%c",
**argv);
@@ -751,7 +751,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
cct.mstr = NULL;
return 1;
}
- *argv = "" - 1;
+ *argv = argv_end;
}
break;
case 'H':
@@ -772,7 +772,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
cct.hnum = 0;
if (*cct.hpat == '*' && !cct.hpat[1])
cct.hpat = "";
- *argv = "" - 1;
+ *argv = argv_end;
break;
case 'C':
if (cl) {
@@ -2176,6 +2176,8 @@ gen_matches_files(int dirs, int execs, int all)
if (prpre && *prpre) {
pathpref = dupstring(prpre);
unmetafy(pathpref, &pathpreflen);
+ if (pathpreflen > PATH_MAX)
+ return;
/* system needs NULL termination, not provided by unmetafy */
pathpref[pathpreflen] = '\0';
} else {
@@ -2218,6 +2220,8 @@ gen_matches_files(int dirs, int execs, int all)
* the path buffer by appending the filename. */
ums = dupstring(n);
unmetafy(ums, &umlen);
+ if (umlen + pathpreflen + 1 > PATH_MAX)
+ continue;
memcpy(q, ums, umlen);
q[umlen] = '\0';
/* And do the stat. */
@@ -2232,6 +2236,8 @@ gen_matches_files(int dirs, int execs, int all)
/* We have to test for a path suffix. */
int o = strlen(p), tt;
+ if (o + strlen(psuf) > PATH_MAX)
+ continue;
/* Append it to the path buffer. */
strcpy(p + o, psuf);
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index 68bdf2332..313dcb92f 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -715,11 +715,10 @@ bin_compadd(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
case 'E':
if (p[1]) {
dat.dummies = atoi(p + 1);
- p = "" - 1;
+ p += strlen(p+1);
} else if (argv[1]) {
argv++;
dat.dummies = atoi(*argv);
- p = "" - 1;
} else {
zwarnnam(name, "number expected after -%c", *p);
zsfree(mstr);
@@ -744,13 +743,12 @@ bin_compadd(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
/* Pasted argument: -Xfoo. */
if (!*sp)
*sp = p + 1;
- p = "" - 1;
+ p += strlen(p+1);
} else if (argv[1]) {
/* Argument in a separate word: -X foo. */
argv++;
if (!*sp)
*sp = *argv;
- p = "" - 1;
} else {
/* Missing argument: argv[N] == "-X", argv[N+1] == NULL. */
zwarnnam(name, e, *p);
@@ -934,19 +932,45 @@ do_comp_vars(int test, int na, char *sa, int nb, char *sb, int mod)
}
case CVT_PRENUM:
case CVT_SUFNUM:
- if (!na)
- return 1;
- if (na > 0 &&
- (int)strlen(test == CVT_PRENUM ? compprefix : compsuffix) >= na) {
- if (mod) {
- if (test == CVT_PRENUM)
- ignore_prefix(na);
- else
- ignore_suffix(na);
- return 1;
- }
+ if (na < 0)
return 0;
+ if (na > 0 && mod) {
+#ifdef MULTIBYTE_SUPPORT
+ if (isset(MULTIBYTE)) {
+ if (test == CVT_PRENUM) {
+ const char *ptr = compprefix;
+ int len = 1;
+ int sum = 0;
+ while (*ptr && na && len) {
+ wint_t wc;
+ len = mb_metacharlenconv(ptr, &wc);
+ ptr += len;
+ sum += len;
+ na--;
+ }
+ if (na)
+ return 0;
+ na = sum;
+ } else {
+ char *end = compsuffix + strlen(compsuffix);
+ char *ptr = end;
+ while (na-- && ptr > compsuffix)
+ ptr = backwardmetafiedchar(compsuffix, ptr, NULL);
+ if (na >= 0)
+ return 0;
+ na = end - ptr;
+ }
+ } else
+#endif
+ if ((int)strlen(test == CVT_PRENUM ? compprefix : compsuffix) >= na)
+ return 0;
+ if (test == CVT_PRENUM)
+ ignore_prefix(na);
+ else
+ ignore_suffix(na);
+ return 1;
}
+ return 1;
case CVT_PREPAT:
case CVT_SUFPAT:
{
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index a83daeff9..e768aee5d 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -1097,6 +1097,9 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop)
if (*p) {
int arg = 0, is_fg;
+ if (idigit(*p))
+ arg = zstrtol(p, &p, 10);
+
len = MB_METACHARLENCONV(p, &cchar);
#ifdef MULTIBYTE_SUPPORT
if (cchar == WEOF)
@@ -1104,9 +1107,6 @@ compprintfmt(char *fmt, int n, int dopr, int doesc, int ml, int *stop)
#endif
p += len;
- if (idigit(*p))
- arg = zstrtol(p, &p, 10);
-
m = 0;
switch (cchar) {
case ZWC('%'):
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index e704f9ffa..4ce8eeee5 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -1222,7 +1222,7 @@ parse_cadef(char *nam, char **args)
else if (*p == 'A') {
if (p[1]) {
nonarg = p + 1;
- p = "" - 1;
+ p += strlen(p+1);
} else if (args[1])
nonarg = *++args;
else
@@ -1230,7 +1230,7 @@ parse_cadef(char *nam, char **args)
} else if (*p == 'M') {
if (p[1]) {
match = p + 1;
- p = "" - 1;
+ p += strlen(p+1);
} else if (args[1])
match = *++args;
else
@@ -1824,7 +1824,7 @@ ca_inactive(Cadef d, char **xor, int cur, int opts)
char *x;
/* current word could be a prefix of a longer one so only do
* exclusions for single-letter options (for option clumping) */
- int single = (cur == compcurrent);
+ int single = !opts && (cur == compcurrent);
for (; (x = (opts ? "-" : *xor)); xor++) {
int excludeall = 0;
@@ -1933,7 +1933,6 @@ struct castate {
int inopt; /* set to current word pos if word is a recognised option */
int inarg; /* in a normal argument */
int nth; /* number of current normal arg */
- int doff; /* length of current option */
int singles; /* argument consists of clumped options */
int oopt;
int actopts; /* count of active options */
@@ -1943,6 +1942,7 @@ struct castate {
static struct castate ca_laststate;
static int ca_parsed = 0, ca_alloced = 0;
+static int ca_doff; /* no. of chars of ignored prefix (for clumped options or arg to an option) */
static void
freecastate(Castate s)
@@ -2033,7 +2033,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
state.argbeg = state.optbeg = state.nargbeg = state.restbeg = state.actopts =
state.nth = state.inopt = state.inarg = state.opt = state.arg = 1;
state.argend = argend = arrlen(compwords) - 1;
- state.doff = state.singles = state.oopt = 0;
+ state.singles = state.oopt = 0;
state.curpos = compcurrent;
state.args = znewlinklist();
state.oargs = (LinkList *) zalloc(d->nopts * sizeof(LinkList));
@@ -2057,7 +2057,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
line; line = compwords[cur++]) {
ddef = adef = NULL;
dopt = NULL;
- doff = state.singles = arglast = 0;
+ state.singles = arglast = 0;
oline = line;
#if 0
@@ -2080,7 +2080,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
remnulargs(line);
untokenize(line);
- ca_inactive(d, argxor, cur, 0);
+ ca_inactive(d, argxor, cur - 1, 0);
if ((d->flags & CDF_SEP) && cur != compcurrent && !strcmp(line, "--")) {
ca_inactive(d, NULL, cur, 1);
continue;
@@ -2114,7 +2114,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
state.opt = 0;
state.argbeg = state.optbeg = state.inopt = cur;
state.argend = argend;
- doff = state.doff = 0;
+ doff = 0;
state.singles = 1;
if (!state.oargs[state.curopt->num])
state.oargs[state.curopt->num] = znewlinklist();
@@ -2287,7 +2287,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
memcpy(&ca_laststate, &state, sizeof(state));
ca_laststate.ddef = NULL;
ca_laststate.dopt = NULL;
- ca_laststate.doff = 0;
break;
}
zaddlinknode(state.args, ztrdup(line));
@@ -2324,7 +2323,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
ca_laststate.ddef = NULL;
ca_laststate.dopt = NULL;
- ca_laststate.doff = 0;
break;
}
} else if (state.def && state.def->end)
@@ -2338,7 +2336,6 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
memcpy(&ca_laststate, &state, sizeof(state));
ca_laststate.ddef = NULL;
ca_laststate.dopt = NULL;
- ca_laststate.doff = 0;
} else if (cur == compcurrent && !ca_laststate.def) {
if ((ca_laststate.def = ddef)) {
ca_laststate.singles = state.singles;
@@ -2349,7 +2346,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
ca_laststate.opt = 1;
state.curopt->active = 1;
} else {
- ca_laststate.doff = doff;
+ ca_doff = doff;
ca_laststate.opt = 0;
}
} else {
@@ -2452,11 +2449,16 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc,
!strcmp((char *) getdata(anode), arg->action))
break;
+ /* with an ignored prefix, we're not completing any normal arguments */
+ if (single && !arg->opt)
+ return;
+
if (!dnode) {
addlinknode(descr, arg->descr);
addlinknode(act, arg->action);
if (!restr) {
+
if ((restr = (arg->type == CAA_RARGS)))
restrict_range(ca_laststate.optbeg, ca_laststate.argend);
else if ((restr = (arg->type == CAA_RREST)))
@@ -2491,8 +2493,11 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc,
* the case above right.
*/
if (arg->type == CAA_NORMAL &&
- opt && optdef && optdef->type == CAO_NEXT)
+ opt && optdef &&
+ (optdef->type == CAO_NEXT || optdef->type == CAO_ODIRECT ||
+ optdef->type == CAO_OEQUAL))
return;
+
if (single)
break;
@@ -2521,7 +2526,6 @@ ca_set_data(LinkList descr, LinkList act, LinkList subc,
if (!single && opt && (lopt || ca_laststate.oopt)) {
opt = NULL;
arg = ca_get_arg(ca_laststate.d, ca_laststate.nth);
-
goto rec;
}
if (!opt && oopt > 0) {
@@ -2590,6 +2594,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
multi = !!def->snext; /* if we have sets */
ca_parsed = cap;
+ ca_doff = 0;
while (def) { /* for each set */
use = !ca_parse_line(def, all, multi, first);
@@ -2629,23 +2634,20 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
{
LinkList descr, act, subc;
Caarg arg;
- int ign = 0, ret = 1;
+ int ret = 1;
descr = newlinklist();
act = newlinklist();
subc = newlinklist();
+ ignore_prefix(ca_doff);
while (lstate) {
arg = lstate->def;
if (arg) {
ret = 0;
- if (!ign && lstate->doff > 0) {
- ign = 1;
- ignore_prefix(lstate->doff);
- }
ca_set_data(descr, act, subc, arg->opt, arg,
- lstate->curopt, (lstate->doff > 0));
+ lstate->curopt, (ca_doff > 0));
}
lstate = lstate->snext;
}
@@ -2673,7 +2675,7 @@ bin_comparguments(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
for (; lstate; lstate = lstate->snext) {
if (lstate->actopts &&
- (lstate->opt || (lstate->doff && lstate->def) ||
+ (lstate->opt || lstate->def ||
(lstate->def && lstate->def->opt &&
(lstate->def->type == CAA_OPT ||
(lstate->def->type >= CAA_RARGS &&
diff --git a/Src/Zle/textobjects.c b/Src/Zle/textobjects.c
index bf83906f2..c93777b65 100644
--- a/Src/Zle/textobjects.c
+++ b/Src/Zle/textobjects.c
@@ -30,13 +30,6 @@
#include "zle.mdh"
#include "textobjects.pro"
-/* class of character: 0 is whitespace, 1 is word character, 2 is other */
-static int
-wordclass(ZLE_CHAR_T x)
-{
- return (ZC_iblank(x) ? 0 : ((ZC_ialnum(x) || (ZWC('_') == x)) ? 1 : 2));
-}
-
static int
blankwordclass(ZLE_CHAR_T x)
{
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 07b310180..8261da92b 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -67,6 +67,7 @@ typedef wint_t ZLE_INT_T;
#define ZC_inblank iswspace
#define ZC_iupper iswupper
#define ZC_iword(x) wcsitype((x), IWORD)
+#define ZC_ipunct iswpunct
#define ZC_tolower towlower
#define ZC_toupper towupper
@@ -153,6 +154,7 @@ static inline int ZS_strncmp(ZLE_STRING_T s1, ZLE_STRING_T s2, size_t l)
#define ZC_inblank inblank
#define ZC_iupper isupper
#define ZC_iword iword
+#define ZC_ipunct ispunct
#define ZC_tolower tulower
#define ZC_toupper tuupper
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index f7e9829c2..5601c1178 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -731,6 +731,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
break;
}
while (*++(*args)) {
+ char skip_this_arg[2] = "x";
switch (**args) {
case 'n':
num = args[0][1] ? args[0]+1 : args[1];
@@ -741,7 +742,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
return 1;
}
if (!args[0][1])
- *++args = "" - 1;
+ *++args = skip_this_arg;
saveflag = 1;
zmod.mult = atoi(num);
zmod.flags |= MOD_MULT;
@@ -760,7 +761,7 @@ bin_zle_call(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
return 1;
}
if (!args[0][1])
- *++args = "" - 1;
+ *++args = skip_this_arg;
keymap_restore = dupstring(curkeymapname);
if (selectkeymap(keymap_tmp, 0)) {
if (remetafy)
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 5a9cccb6f..22c381237 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -456,6 +456,7 @@ checkparams(char *p)
static int
cmphaswilds(char *str)
{
+ char *ptr;
if ((*str == Inbrack || *str == Outbrack) && !str[1])
return 0;
@@ -465,6 +466,14 @@ cmphaswilds(char *str)
if (str[0] == '%' && str[1] ==Quest)
str += 2;
+ /*
+ * In ~[foo], the square brackets are not wild cards.
+ * This test matches the master one in filesubstr().
+ */
+ if (*str == Tilde && str[1] == Inbrack &&
+ (ptr = strchr(str+2, Outbrack)))
+ str = ptr + 1;
+
for (; *str;) {
if (*str == String || *str == Qstring) {
/* A parameter expression. */
@@ -2268,7 +2277,7 @@ doexpansion(char *s, int lst, int olst, int explincmd)
int ng = opts[NULLGLOB];
opts[NULLGLOB] = 1;
- globlist(vl, 1);
+ globlist(vl, PREFORK_NO_UNTOK);
opts[NULLGLOB] = ng;
}
if (errflag)
diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c
index e4a878eab..89959b20c 100644
--- a/Src/Zle/zle_word.c
+++ b/Src/Zle/zle_word.c
@@ -64,7 +64,18 @@ forwardword(char **args)
return 0;
}
-#define Z_vialnum(X) (ZC_ialnum(X) || (ZWC('_') == X))
+/*
+ * class of character (for vi-mode word motion)
+ * 0: blank, 1: alnum or _, 2: punctuation, 3: the others
+ */
+
+/**/
+int
+wordclass(ZLE_CHAR_T x)
+{
+ return (ZC_iblank(x) ? 0 : ((ZC_ialnum(x) || (ZWC('_') == x)) ? 1 :
+ ZC_ipunct(x) ? 2 : 3));
+}
/**/
int
@@ -75,19 +86,16 @@ viforwardword(char **args)
if (n < 0) {
int ret;
zmult = -n;
- ret = backwardword(args);
+ ret = vibackwardword(args);
zmult = n;
return ret;
}
while (n--) {
int nl;
- if (Z_vialnum(zleline[zlecs]))
- while (zlecs != zlell && Z_vialnum(zleline[zlecs]))
- INCCS();
- else
- while (zlecs != zlell && !Z_vialnum(zleline[zlecs]) &&
- !ZC_inblank(zleline[zlecs]))
- INCCS();
+ int cc = wordclass(zleline[zlecs]);
+ while (zlecs != zlell && wordclass(zleline[zlecs]) == cc) {
+ INCCS();
+ }
if (wordflag && !n)
return 0;
nl = (zleline[zlecs] == ZWC('\n'));
@@ -160,7 +168,7 @@ viforwardblankwordend(char **args)
if (n < 0) {
int ret;
zmult = -n;
- ret = viforwardblankwordend(args);
+ ret = vibackwardblankwordend(args);
zmult = n;
return ret;
}
@@ -208,26 +216,17 @@ viforwardwordend(char **args)
zlecs = pos;
}
if (zlecs != zlell) {
+ int cc;
pos = zlecs;
INCPOS(pos);
- if (Z_vialnum(zleline[pos])) {
- for (;;) {
- zlecs = pos;
- if (zlecs == zlell)
+ cc = wordclass(zleline[pos]);
+ for (;;) {
+ zlecs = pos;
+ if (zlecs == zlell)
+ break;
+ INCPOS(pos);
+ if (wordclass(zleline[pos]) != cc)
break;
- INCPOS(pos);
- if (!Z_vialnum(zleline[pos]))
- break;
- }
- } else {
- for (;;) {
- zlecs = pos;
- if (zlecs == zlell)
- break;
- INCPOS(pos);
- if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos]))
- break;
- }
}
}
}
@@ -277,7 +276,7 @@ vibackwardword(char **args)
if (n < 0) {
int ret;
zmult = -n;
- ret = backwardword(args);
+ ret = viforwardword(args);
zmult = n;
return ret;
}
@@ -295,24 +294,14 @@ vibackwardword(char **args)
}
if (zlecs) {
int pos = zlecs;
- if (Z_vialnum(zleline[pos])) {
- for (;;) {
- zlecs = pos;
- if (zlecs == 0)
- break;
- DECPOS(pos);
- if (!Z_vialnum(zleline[pos]))
- break;
- }
- } else {
- for (;;) {
- zlecs = pos;
- if (zlecs == 0)
- break;
- DECPOS(pos);
- if (Z_vialnum(zleline[pos]) || ZC_inblank(zleline[pos]))
- break;
- }
+ int cc = wordclass(zleline[pos]);
+ for (;;) {
+ zlecs = pos;
+ if (zlecs == 0)
+ break;
+ DECPOS(pos);
+ if (wordclass(zleline[pos]) != cc || ZC_inblank(zleline[pos]))
+ break;
}
}
}
@@ -368,17 +357,10 @@ vibackwardwordend(char **args)
return ret;
}
while (n-- && zlecs > 1) {
- int start = 0;
- if (Z_vialnum(zleline[zlecs]))
- start = 1;
- else if (!ZC_inblank(zleline[zlecs]))
- start = 2;
+ int cc = wordclass(zleline[zlecs]);
DECCS();
while (zlecs) {
- int same = (start != 1) && ZC_iblank(zleline[zlecs]);
- if (start)
- same |= Z_vialnum(zleline[zlecs]);
- if (same == (start == 2))
+ if (wordclass(zleline[zlecs]) != cc || ZC_iblank(zleline[zlecs]))
break;
DECCS();
}
@@ -494,26 +476,17 @@ vibackwardkillword(UNUSED(char **args))
x = pos;
}
if (x > lim) {
+ int cc;
int pos = x;
DECPOS(pos);
- if (Z_vialnum(zleline[pos])) {
- for (;;) {
- x = pos;
- if (x <= lim)
- break;
- DECPOS(pos);
- if (!Z_vialnum(zleline[pos]))
- break;
- }
- } else {
- for (;;) {
- x = pos;
- if (x <= lim)
- break;
- DECPOS(pos);
- if (Z_vialnum(zleline[pos]) || ZC_iblank(zleline[pos]))
- break;
- }
+ cc = wordclass(zleline[pos]);
+ for (;;) {
+ x = pos;
+ if (x <= lim)
+ break;
+ DECPOS(pos);
+ if (wordclass(zleline[pos]) != cc)
+ break;
}
}
}