diff options
Diffstat (limited to 'Src/Zle/zle_word.c')
-rw-r--r-- | Src/Zle/zle_word.c | 477 |
1 files changed, 477 insertions, 0 deletions
diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c new file mode 100644 index 000000000..923216ef8 --- /dev/null +++ b/Src/Zle/zle_word.c @@ -0,0 +1,477 @@ +/* + * zle_word.c - word-related editor functions + * + * This file is part of zsh, the Z shell. + * + * Copyright (c) 1992-1997 Paul Falstad + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Paul Falstad or the Zsh Development Group be liable + * to any party for direct, indirect, special, incidental, or consequential + * damages arising out of the use of this software and its documentation, + * even if Paul Falstad and the Zsh Development Group have been advised of + * the possibility of such damage. + * + * Paul Falstad and the Zsh Development Group specifically disclaim any + * warranties, including, but not limited to, the implied warranties of + * merchantability and fitness for a particular purpose. The software + * provided hereunder is on an "as is" basis, and Paul Falstad and the + * Zsh Development Group have no obligation to provide maintenance, + * support, updates, enhancements, or modifications. + * + */ + +#include "zle.mdh" +#include "zle_word.pro" + +/**/ +void +forwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + backwardword(); + zmult = n; + return; + } + while (n--) { + while (cs != ll && iword(line[cs])) + cs++; + if (wordflag && !n) + return; + while (cs != ll && !iword(line[cs])) + cs++; + } +} + +/**/ +void +viforwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + backwardword(); + zmult = n; + return; + } + while (n--) { + if (iident(line[cs])) + while (cs != ll && iident(line[cs])) + cs++; + else + while (cs != ll && !iident(line[cs]) && !iblank(line[cs])) + cs++; + if (wordflag && !n) + return; + while (cs != ll && iblank(line[cs])) + cs++; + } +} + +/**/ +void +viforwardblankword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + vibackwardblankword(); + zmult = n; + return; + } + while (n--) { + while (cs != ll && !iblank(line[cs])) + cs++; + if (wordflag && !n) + return; + while (cs != ll && iblank(line[cs])) + cs++; + } +} + +/**/ +void +emacsforwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + emacsbackwardword(); + zmult = n; + return; + } + while (n--) { + while (cs != ll && !iword(line[cs])) + cs++; + if (wordflag && !n) + return; + while (cs != ll && iword(line[cs])) + cs++; + } +} + +/**/ +void +viforwardblankwordend(void) +{ + int n = zmult; + + if (n < 0) + return; + while (n--) { + while (cs != ll && iblank(line[cs + 1])) + cs++; + while (cs != ll && !iblank(line[cs + 1])) + cs++; + } + if (cs != ll && virangeflag) + cs++; +} + +/**/ +void +viforwardwordend(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + backwardword(); + zmult = n; + return; + } + while (n--) { + if (iblank(line[cs + 1])) + while (cs != ll && iblank(line[cs + 1])) + cs++; + if (iident(line[cs + 1])) + while (cs != ll && iident(line[cs + 1])) + cs++; + else + while (cs != ll && !iident(line[cs + 1]) && !iblank(line[cs + 1])) + cs++; + } + if (cs != ll && virangeflag) + cs++; +} + +/**/ +void +backwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + forwardword(); + zmult = n; + return; + } + while (n--) { + while (cs && !iword(line[cs - 1])) + cs--; + while (cs && iword(line[cs - 1])) + cs--; + } +} + +/**/ +void +vibackwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + backwardword(); + zmult = n; + return; + } + while (n--) { + while (cs && iblank(line[cs - 1])) + cs--; + if (iident(line[cs - 1])) + while (cs && iident(line[cs - 1])) + cs--; + else + while (cs && !iident(line[cs - 1]) && !iblank(line[cs - 1])) + cs--; + } +} + +/**/ +void +vibackwardblankword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + viforwardblankword(); + zmult = n; + return; + } + while (n--) { + while (cs && iblank(line[cs - 1])) + cs--; + while (cs && !iblank(line[cs - 1])) + cs--; + } +} + +/**/ +void +emacsbackwardword(void) +{ + int n = zmult; + + if (n < 0) { + zmult = -n; + emacsforwardword(); + zmult = n; + return; + } + while (n--) { + while (cs && !iword(line[cs - 1])) + cs--; + while (cs && iword(line[cs - 1])) + cs--; + } +} + +/**/ +void +backwarddeleteword(void) +{ + int x = cs, n = zmult; + + if (n < 0) { + zmult = -n; + deleteword(); + zmult = n; + return; + } + while (n--) { + while (x && !iword(line[x - 1])) + x--; + while (x && iword(line[x - 1])) + x--; + } + backdel(cs - x); +} + +/**/ +void +vibackwardkillword(void) +{ + int x = cs, lim = (viinsbegin > findbol()) ? viinsbegin : findbol(); + int n = zmult; + + if (n < 0) { + feep(); + return; + } +/* this taken from "vibackwardword" */ + while (n--) { + while ((x > lim) && iblank(line[x - 1])) + x--; + if (iident(line[x - 1])) + while ((x > lim) && iident(line[x - 1])) + x--; + else + while ((x > lim) && !iident(line[x - 1]) && !iblank(line[x - 1])) + x--; + } + backkill(cs - x, 1); +} + +/**/ +void +backwardkillword(void) +{ + int x = cs; + int n = zmult; + + if (n < 0) { + zmult = -n; + killword(); + zmult = n; + return; + } + while (n--) { + while (x && !iword(line[x - 1])) + x--; + while (x && iword(line[x - 1])) + x--; + } + backkill(cs - x, 1); +} + +/**/ +void +upcaseword(void) +{ + int n = zmult; + int neg = n < 0, ocs = cs; + + if (neg) + n = -n; + while (n--) { + while (cs != ll && !iword(line[cs])) + cs++; + while (cs != ll && iword(line[cs])) { + line[cs] = tuupper(line[cs]); + cs++; + } + } + if (neg) + cs = ocs; +} + +/**/ +void +downcaseword(void) +{ + int n = zmult; + int neg = n < 0, ocs = cs; + + if (neg) + n = -n; + while (n--) { + while (cs != ll && !iword(line[cs])) + cs++; + while (cs != ll && iword(line[cs])) { + line[cs] = tulower(line[cs]); + cs++; + } + } + if (neg) + cs = ocs; +} + +/**/ +void +capitalizeword(void) +{ + int first, n = zmult; + int neg = n < 0, ocs = cs; + + if (neg) + n = -n; + while (n--) { + first = 1; + while (cs != ll && !iword(line[cs])) + cs++; + while (cs != ll && iword(line[cs]) && !isalpha(line[cs])) + cs++; + while (cs != ll && iword(line[cs])) { + line[cs] = (first) ? tuupper(line[cs]) : tulower(line[cs]); + first = 0; + cs++; + } + } + if (neg) + cs = ocs; +} + +/**/ +void +deleteword(void) +{ + int x = cs; + int n = zmult; + + if (n < 0) { + zmult = -n; + backwarddeleteword(); + zmult = n; + return; + } + while (n--) { + while (x != ll && !iword(line[x])) + x++; + while (x != ll && iword(line[x])) + x++; + } + foredel(x - cs); +} + +/**/ +void +killword(void) +{ + int x = cs; + int n = zmult; + + if (n < 0) { + zmult = -n; + backwardkillword(); + zmult = n; + return; + } + while (n--) { + while (x != ll && !iword(line[x])) + x++; + while (x != ll && iword(line[x])) + x++; + } + forekill(x - cs, 0); +} + +/**/ +void +transposewords(void) +{ + int p1, p2, p3, p4, x = cs; + char *temp, *pp; + int n = zmult; + int neg = n < 0, ocs = cs; + + if (neg) + n = -n; + while (n--) { + while (x != ll && line[x] != '\n' && !iword(line[x])) + x++; + if (x == ll || line[x] == '\n') { + x = cs; + while (x && line[x - 1] != '\n' && !iword(line[x])) + x--; + if (!x || line[x - 1] == '\n') { + feep(); + return; + } + } + for (p4 = x; p4 != ll && iword(line[p4]); p4++); + for (p3 = p4; p3 && iword(line[p3 - 1]); p3--); + if (!p3) { + feep(); + return; + } + for (p2 = p3; p2 && !iword(line[p2 - 1]); p2--); + if (!p2) { + feep(); + return; + } + for (p1 = p2; p1 && iword(line[p1 - 1]); p1--); + pp = temp = (char *)halloc(p4 - p1 + 1); + struncpy(&pp, (char *) line + p3, p4 - p3); + struncpy(&pp, (char *) line + p2, p3 - p2); + struncpy(&pp, (char *) line + p1, p2 - p1); + strncpy((char *)line + p1, temp, p4 - p1); + cs = p4; + } + if (neg) + cs = ocs; +} |