mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-05 23:11:11 +02:00
38983: Make transpose-words handle numeric arguments sensibly
This commit is contained in:
parent
68e14c41f2
commit
b2be8e1b6e
2 changed files with 57 additions and 40 deletions
|
@ -1,3 +1,8 @@
|
|||
2016-08-12 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* Han Pingtian: 38983: Src/Zle/zle_word.c: make transpose-words
|
||||
handle numeric arguments sensibly.
|
||||
|
||||
2016-08-12 Barton E. Schaefer <schaefer@zsh.org>
|
||||
|
||||
* 39028: Src/subst.c, Test/D04parameter.ztst: more join/split
|
||||
|
|
|
@ -678,46 +678,54 @@ killword(char **args)
|
|||
int
|
||||
transposewords(UNUSED(char **args))
|
||||
{
|
||||
int p1, p2, p3, p4, len, x = zlecs, pos;
|
||||
int p1, p2, p3, p4, pt, len, x = zlecs, pos;
|
||||
ZLE_STRING_T temp, pp;
|
||||
int n = zmult;
|
||||
int neg = n < 0, ocs = zlecs;
|
||||
|
||||
if (neg)
|
||||
n = -n;
|
||||
while (n--) {
|
||||
while (x != zlell && zleline[x] != ZWC('\n') && !ZC_iword(zleline[x]))
|
||||
INCPOS(x);
|
||||
if (x == zlell || zleline[x] == ZWC('\n')) {
|
||||
x = zlecs;
|
||||
while (x) {
|
||||
if (ZC_iword(zleline[x]))
|
||||
break;
|
||||
pos = x;
|
||||
DECPOS(pos);
|
||||
if (zleline[pos] == ZWC('\n'))
|
||||
break;
|
||||
x = pos;
|
||||
}
|
||||
if (!x)
|
||||
return 1;
|
||||
|
||||
while (x != zlell && zleline[x] != ZWC('\n') && !ZC_iword(zleline[x]))
|
||||
INCPOS(x);
|
||||
|
||||
if (x == zlell || zleline[x] == ZWC('\n')) {
|
||||
x = zlecs;
|
||||
while (x) {
|
||||
if (ZC_iword(zleline[x]))
|
||||
break;
|
||||
pos = x;
|
||||
DECPOS(pos);
|
||||
if (zleline[pos] == ZWC('\n'))
|
||||
return 1;
|
||||
}
|
||||
for (p4 = x; p4 != zlell && ZC_iword(zleline[p4]); INCPOS(p4))
|
||||
;
|
||||
for (p3 = p4; p3; ) {
|
||||
pos = p3;
|
||||
DECPOS(pos);
|
||||
if (!ZC_iword(zleline[pos]))
|
||||
break;
|
||||
p3 = pos;
|
||||
x = pos;
|
||||
}
|
||||
if (!p3)
|
||||
if (!x)
|
||||
return 1;
|
||||
for (p2 = p3; p2; ) {
|
||||
pos = x;
|
||||
DECPOS(pos);
|
||||
if (zleline[pos] == ZWC('\n'))
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (p4 = x; p4 != zlell && ZC_iword(zleline[p4]); INCPOS(p4))
|
||||
;
|
||||
|
||||
for (p3 = p4; p3; ) {
|
||||
pos = p3;
|
||||
DECPOS(pos);
|
||||
if (!ZC_iword(zleline[pos]))
|
||||
break;
|
||||
p3 = pos;
|
||||
}
|
||||
|
||||
if (!p3)
|
||||
return 1;
|
||||
|
||||
pt = p3;
|
||||
|
||||
while (n--) {
|
||||
for (p2 = pt; p2; ) {
|
||||
pos = p2;
|
||||
DECPOS(pos);
|
||||
if (ZC_iword(zleline[pos]))
|
||||
|
@ -733,20 +741,24 @@ transposewords(UNUSED(char **args))
|
|||
break;
|
||||
p1 = pos;
|
||||
}
|
||||
pp = temp = (ZLE_STRING_T)zhalloc((p4 - p1)*ZLE_CHAR_SIZE);
|
||||
len = p4 - p3;
|
||||
ZS_memcpy(pp, zleline + p3, len);
|
||||
pp += len;
|
||||
len = p3 - p2;
|
||||
ZS_memcpy(pp, zleline + p2, len);
|
||||
pp += len;
|
||||
ZS_memcpy(pp, zleline + p1, p2 - p1);
|
||||
|
||||
ZS_memcpy(zleline + p1, temp, p4 - p1);
|
||||
|
||||
zlecs = p4;
|
||||
pt = p1;
|
||||
}
|
||||
|
||||
pp = temp = (ZLE_STRING_T)zhalloc((p4 - p1)*ZLE_CHAR_SIZE);
|
||||
len = p4 - p3;
|
||||
ZS_memcpy(pp, zleline + p3, len);
|
||||
pp += len;
|
||||
len = p3 - p2;
|
||||
ZS_memcpy(pp, zleline + p2, len);
|
||||
pp += len;
|
||||
ZS_memcpy(pp, zleline + p1, p2 - p1);
|
||||
|
||||
ZS_memcpy(zleline + p1, temp, p4 - p1);
|
||||
|
||||
if (neg)
|
||||
zlecs = ocs;
|
||||
else
|
||||
zlecs = p4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue