edit.c revision c2dc5def5e2273bb1d78b4ba032a3903dd0f980c
1c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* $OpenBSD: edit.c,v 1.37 2013/01/21 10:13:24 halex Exp $ */ 203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* $OpenBSD: edit.h,v 1.9 2011/05/30 17:14:35 martynas Exp $ */ 303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* $OpenBSD: emacs.c,v 1.44 2011/09/05 04:50:33 marco Exp $ */ 45155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: vi.c,v 1.26 2009/06/29 22:50:19 martynas Exp $ */ 55155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 65155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/*- 7c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 8c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * 2011, 2012, 2013 95155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Thorsten Glaser <tg@mirbsd.org> 105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Provided that these terms and disclaimer and all copyright notices 125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are retained or reproduced in an accompanying document, permission 135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is granted to deal in this work without restriction, including un- 145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * limited rights to use, publicly perform, distribute, sell, modify, 155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * merge, give away, or sublicence. 165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to 185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * the utmost extent permitted by applicable law, neither express nor 195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * implied; without malicious intent or gross negligence. In no event 205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * may a licensor, author or contributor be held liable for indirect, 215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * direct, other damage, loss, or other issues arising in any way out 225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of dealing in the work, even if advised of the possibility of such 235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * damage or existence of a defect, except proven that it results out 245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of said person's immediate fault when using the work as intended. 255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "sh.h" 285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_NO_CMDLINE_EDITING 30c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 31c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.265 2013/02/10 19:05:36 tg Exp $"); 325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * in later versions we might use libtermcap for this, but since external 355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * dependencies are problematic, this has not yet been decided on; another 365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * good string is "\033c" except on hardware terminals like the DEC VT420 375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * which do a full power cycle then... 385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CLS_STRING 405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CLS_STRING "\033[;H\033[J" 415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CLRTOEOL_STRING 435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CLRTOEOL_STRING "\033[K" 445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tty driver characters we are interested in */ 475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct { 485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int erase; 495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int kill; 505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int werase; 515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int intr; 525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int quit; 535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int eof; 545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} X_chars; 555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic X_chars edchars; 575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* x_cf_glob() flags */ 595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_COMMAND BIT(0) /* Do command completion */ 605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_FILE BIT(1) /* Do file completion */ 615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_FULLPATH BIT(2) /* command completion: store full path */ 6203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define XCF_COMMAND_FILE (XCF_COMMAND | XCF_FILE) 6303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define XCF_IS_COMMAND BIT(3) /* return flag: is command */ 64c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#define XCF_IS_NOSPACE BIT(4) /* return flag: do not append a space */ 655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char editmode; 675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int xx_cols; /* for Emacs mode */ 685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int modified; /* buffer has been "modified" */ 695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char holdbuf[LINE]; /* place to hold last edit buffer */ 705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_getc(void); 725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_putcf(int); 73c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void x_modified(void); 7403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic void x_mode(bool); 7503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic int x_do_comment(char *, ssize_t, ssize_t *); 76c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void x_print_expansions(int, char * const *, bool); 7703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic int x_cf_glob(int *, const char *, int, int, int *, int *, char ***); 78c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_longest_prefix(int, char * const *); 79c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void x_glob_hlp_add_qchar(char *); 80c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char *x_glob_hlp_tilde_and_rem_qchar(char *, bool); 815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_basename(const char *, const char *); 825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_free_words(int, char **); 835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_escape(const char *, size_t, int (*)(const char *, size_t)); 845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_emacs(char *, size_t); 855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_init_prompt(void); 865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_vi(char *, size_t); 885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_flush() shf_flush(shl_out) 91c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#if defined(MKSH_SMALL) && !defined(MKSH_SMALL_BUT_FAST) 925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_putc(c) x_putcf(c) 935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_putc(c) shf_putc((c), shl_out) 955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 97c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic int path_order_cmp(const void *, const void *); 985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void glob_table(const char *, XPtrV *, struct table *); 99c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void glob_path(int, const char *, XPtrV *, const char *); 100c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic int x_file_glob(int *, char *, char ***); 10103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic int x_command_glob(int, char *, char ***); 1025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_locate_word(const char *, int, int, int *, bool *); 1035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_getmbc(char *); 1055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_rebuildline(const char *); 1065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ generic editing functions +++ */ 1085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * read an edited command line 1115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint 1135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_read(char *buf, size_t len) 1145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 1165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(true); 1185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 1195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (Flag(FEMACS) || Flag(FGMACS)) 1205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_emacs(buf, len); 1215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 1225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (Flag(FVI)) 1235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_vi(buf, len); 1245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 12603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* internal error */ 12703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = -1; 1285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 0; 1295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 1305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 1315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tty I/O */ 1345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 1365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_getc(void) 1375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char c; 13903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t n; 1405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((n = blocking_read(STDIN_FILENO, &c, 1)) < 0 && errno == EINTR) 1425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (trap) { 1435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 1445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru runtraps(0); 1455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIGWINCH 1465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (got_winch) { 1475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru change_winsz(); 1485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_cols != xx_cols && editmode == 1) { 1495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* redraw line in Emacs mode */ 1505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xx_cols = x_cols; 1515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_rebuildline(MKSH_CLRTOEOL_STRING); 1525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(true); 1565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((n == 1) ? (int)(unsigned char)c : -1); 1585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 1615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_putcf(int c) 1625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_putc(c, shl_out); 1645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/********************************* 1675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Misc common code for vi/emacs * 1685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *********************************/ 1695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 17103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Handle the commenting/uncommenting of a line. 1725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Returns: 1735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 1 if a carriage return is indicated (comment added) 1745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 if no return (comment removed) 1755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * -1 if there is an error (not enough room for comment chars) 1765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If successful, *lenp contains the new length. Note: cursor should be 1775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * moved to the start of the line after (un)commenting. 1785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrax_do_comment(char *buf, ssize_t bsize, ssize_t *lenp) 1815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t i, j, len = *lenp; 1835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0) 18503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* somewhat arbitrary - it's what AT&T ksh does */ 18603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return (1); 1875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Already commented? */ 1895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[0] == '#') { 1905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool saw_nl = false; 1915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0, i = 1; i < len; i++) { 1935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!saw_nl || buf[i] != '#') 1945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[j++] = buf[i]; 1955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saw_nl = buf[i] == '\n'; 1965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *lenp = j; 1985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 1995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 2005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n = 1; 2015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* See if there's room for the #s - 1 per \n */ 2035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < len; i++) 2045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[i] == '\n') 2055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n++; 2065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len + n >= bsize) 2075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 2085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Now add them... */ 2095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = len, j = len + n; --i >= 0; ) { 2105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[i] == '\n') 2115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[--j] = '#'; 2125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[--j] = buf[i]; 2135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[0] = '#'; 2155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *lenp += n; 2165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 2175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 2195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/**************************************************** 2215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Common file/command completion code for vi/emacs * 2225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ****************************************************/ 2235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 2255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_print_expansions(int nwords, char * const *words, bool is_command) 2265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool use_copy = false; 2285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int prefix_len; 229c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser XPtrV l = { NULL, 0, 0 }; 2305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 23203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Check if all matches are in the same directory (in this 2335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * case, we want to omit the directory name) 2345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!is_command && 2365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (prefix_len = x_longest_prefix(nwords, words)) > 0) { 2375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 2385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Special case for 1 match (prefix is whole word) */ 2405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1) 2415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = x_basename(words[0], NULL); 2425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Any (non-trailing) slashes in non-common word suffixes? */ 2435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 2445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_basename(words[i] + prefix_len, NULL) > 2455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len) 2465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 2475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* All in same directory? */ 2485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i == nwords) { 2495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (prefix_len > 0 && words[0][prefix_len - 1] != '/') 2505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len--; 2515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru use_copy = true; 2525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(l, nwords + 1); 2535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 2545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(l, words[i] + prefix_len); 2555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(l, NULL); 2565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 2595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Enumerate expansions 2605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 2625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 2635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pr_list(use_copy ? (char **)XPptrv(l) : words); 2645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (use_copy) 26603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* not x_free_words() */ 26703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra XPfree(l); 2685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 2695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 270c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* 271c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Convert backslash-escaped string to QCHAR-escaped 272c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * string useful for globbing; loses QCHAR unless it 273c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * can squeeze in, eg. by previous loss of backslash 274c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 275c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void 276c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_glob_hlp_add_qchar(char *cp) 277c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 278c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char ch, *dp = cp; 279c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser bool escaping = false; 280c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 281c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while ((ch = *cp++)) { 282c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (ch == '\\' && !escaping) { 283c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser escaping = true; 284c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser continue; 285c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 286c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (escaping || (ch == QCHAR && (cp - dp) > 1)) { 287c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 288c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * empirically made list of chars to escape 289c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * for globbing as well as QCHAR itself 290c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 291c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser switch (ch) { 292c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case QCHAR: 293c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '$': 294c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '*': 295c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '?': 296c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '[': 297c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '\\': 298c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser case '`': 299c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *dp++ = QCHAR; 300c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser break; 301c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 302c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser escaping = false; 303c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 304c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *dp++ = ch; 305c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 306c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *dp = '\0'; 307c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 308c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 309c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* 310c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Run tilde expansion on argument string, return the result 311c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * after unescaping; if the flag is set, the original string 312c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * is freed if changed and assumed backslash-escaped, if not 313c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * it is assumed QCHAR-escaped 314c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 315c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char * 316c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_glob_hlp_tilde_and_rem_qchar(char *s, bool magic_flag) 317c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 318c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char ch, *cp, *dp; 319c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 320c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 321c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * On the string, check whether we have a tilde expansion, 322c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * and if so, discern "~foo/bar" and "~/baz" from "~blah"; 323c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * if we have a directory part (the former), try to expand 324c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 325c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (*s == '~' && (cp = strchr(s, '/')) != NULL) { 326c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ok, so split into "~foo"/"bar" or "~"/"baz" */ 327c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *cp++ = 0; 328c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* try to expand the tilde */ 329c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (!(dp = tilde(s + 1))) { 330c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* nope, revert damage */ 331c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *--cp = '/'; 332c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } else { 333c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ok, expand and replace */ 334c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp = shf_smprintf("%s/%s", dp, cp); 335c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (magic_flag) 336c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afree(s, ATEMP); 337c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser s = cp; 338c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 339c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 340c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 341c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ... convert it from backslash-escaped via QCHAR-escaped... */ 342c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (magic_flag) 343c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_glob_hlp_add_qchar(s); 344c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ... to unescaped, for comparison with the matches */ 345c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp = dp = s; 346c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 347c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while ((ch = *cp++)) { 348c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (ch == QCHAR && !(ch = *cp++)) 349c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser break; 350c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *dp++ = ch; 351c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 352c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *dp = '\0'; 353c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 354c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (s); 355c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 356c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 3575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/** 3585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Do file globbing: 3595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - does expansion, checks for no match, etc. 3605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - sets *wordsp to array of matching strings 3615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - returns number of matching strings 3625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 364c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_file_glob(int *flagsp, char *toglob, char ***wordsp) 3655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 366c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char **words, *cp; 367c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser int nwords; 3685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV w; 3695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct source *s, *sold; 3705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* remove all escaping backward slashes */ 372c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_glob_hlp_add_qchar(toglob); 3735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 3755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Convert "foo*" (toglob) to an array of strings (words) 3765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sold = source; 3785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s = pushs(SWSTR, ATEMP); 3795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s->start = s->str = toglob; 3805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = s; 3815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (yylex(ONEWORD | LQCHAR) != LWORD) { 3825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = sold; 38303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra internal_warningf("%s: %s", "fileglob", "bad substitution"); 3845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 3855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = sold; 387c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afree(s, ATEMP); 3885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(w, 32); 389c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp = yylval.cp; 390c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (*cp == CHAR || *cp == QCHAR) 391c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp += 2; 392c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser nwords = DOGLOB | DOTILDE | DOMARKDIRS; 393c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (*cp != EOS) { 394c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* probably a $FOO expansion */ 395c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *flagsp |= XCF_IS_NOSPACE; 396c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* this always results in at most one match */ 397c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser nwords = 0; 398c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 399c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser expand(yylval.cp, &w, nwords); 4005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(w, NULL); 4015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = (char **)XPclose(w); 4025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (nwords = 0; words[nwords]; nwords++) 4045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 4055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1) { 4065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct stat statb; 4075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 408c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* Expand any tilde and drop all QCHAR for comparison */ 409c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser toglob = x_glob_hlp_tilde_and_rem_qchar(toglob, false); 410c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 41103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 41203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Check if globbing failed (returned glob pattern), 41303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * but be careful (e.g. toglob == "ab*" when the file 4145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * "ab*" exists is not an error). 4155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Also, check for empty result - happens if we tried 4165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to glob something which evaluated to an empty 4175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * string (e.g., "$FOO" when there is no FOO, etc). 4185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 4195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((strcmp(words[0], toglob) == 0 && 4205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru stat(words[0], &statb) < 0) || 4215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[0][0] == '\0') { 4225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 4235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = NULL; 4245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = 0; 4255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((*wordsp = nwords ? words : NULL) == NULL && words != NULL) 4295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 4305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 4325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 4335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Data structure used in x_command_glob() */ 4355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct path_order_info { 4365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *word; 4375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int base; 4385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int path_order; 4395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 4405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Compare routine used in x_command_glob() */ 4425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 4435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querupath_order_cmp(const void *aa, const void *bb) 4445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 4455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const struct path_order_info *a = (const struct path_order_info *)aa; 4465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const struct path_order_info *b = (const struct path_order_info *)bb; 4475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int t; 4485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = strcmp(a->word + a->base, b->word + b->base); 4505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (t ? t : a->path_order - b->path_order); 4515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 4525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 45403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrax_command_glob(int flags, char *toglob, char ***wordsp) 4555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *pat, *fpath; 457c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nwords; 4585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV w; 4595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *l; 4605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Convert "foo*" (toglob) to a pattern for future use */ 4625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pat = evalstr(toglob, DOPAT | DOTILDE); 4635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(w, 32); 4655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &keywords); 4675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &aliases); 4685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &builtins); 4695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (l = e->loc; l; l = l->next) 4705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &l->funs); 4715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_path(flags, pat, &w, path); 4735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((fpath = str_val(global("FPATH"))) != null) 4745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_path(flags, pat, &w, fpath); 4755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = XPsize(w); 4775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!nwords) { 4795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = NULL; 4805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPfree(w); 4815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 4825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort entries */ 4845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (flags & XCF_FULLPATH) { 4855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort by basename, then path order */ 4865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct path_order_info *info, *last_info = NULL; 4875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = (char **)XPptrv(w); 488c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i, path_order = 0; 4895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info = (struct path_order_info *) 49103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra alloc2(nwords, sizeof(struct path_order_info), ATEMP); 4925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) { 4935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].word = words[i]; 4945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].base = x_basename(words[i], NULL); 4955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!last_info || info[i].base != last_info->base || 4965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strncmp(words[i], last_info->word, info[i].base) != 0) { 4975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru last_info = &info[i]; 4985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru path_order++; 4995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].path_order = path_order; 5015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru qsort(info, nwords, sizeof(struct path_order_info), 5035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru path_order_cmp); 5045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 5055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[i] = info[i].word; 5065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(info, ATEMP); 5075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 5085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort and remove duplicate entries */ 5095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = (char **)XPptrv(w); 510c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i, j; 5115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru qsort(words, nwords, sizeof(void *), xstrcmp); 5135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = j = 0; i < nwords - 1; i++) { 5145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strcmp(words[i], words[i + 1])) 5155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j++] = words[i]; 5165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 5175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[i], ATEMP); 5185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j++] = words[i]; 520c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser w.len = nwords = j; 5215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(w, NULL); 5245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = (char **)XPclose(w); 5255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 5275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 5285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IS_WORDC(c) (!ctype(c, C_LEX1) && (c) != '\'' && (c) != '"' && \ 5305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (c) != '`' && (c) != '=' && (c) != ':') 5315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 5335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_locate_word(const char *buf, int buflen, int pos, int *startp, 5345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool *is_commandp) 5355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 5365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end; 5375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Bad call? Probably should report error */ 5395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (pos < 0 || pos > buflen) { 5405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *startp = pos; 5415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *is_commandp = false; 5425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 5435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* The case where pos == buflen happens to take care of itself... */ 5455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start = pos; 54703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 54803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Keep going backwards to start of word (has effect of allowing 5495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * one blank after the end of a word) 5505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; (start > 0 && IS_WORDC(buf[start - 1])) || 5525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (start > 1 && buf[start - 2] == '\\'); start--) 5535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 5545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Go forwards to end of word */ 5555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (end = start; end < buflen && IS_WORDC(buf[end]); end++) { 5565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[end] == '\\' && (end + 1) < buflen) 5575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru end++; 5585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_commandp) { 5615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool iscmd; 5625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int p = start - 1; 5635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Figure out if this is a command */ 5655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (p >= 0 && ksh_isspace(buf[p])) 5665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p--; 5675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru iscmd = p < 0 || vstrchr(";|&()`", buf[p]); 5685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (iscmd) { 56903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 57003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If command has a /, path, etc. is not searched; 5715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * only current directory is searched which is just 5725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * like file globbing. 5735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = start; p < end; p++) 5755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[p] == '/') 5765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 5775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru iscmd = p == end; 5785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *is_commandp = iscmd; 5805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *startp = start; 5825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (end - start); 5845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 5855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 58703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrax_cf_glob(int *flagsp, const char *buf, int buflen, int pos, int *startp, 58803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int *endp, char ***wordsp) 5895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 59003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int len, nwords = 0; 5915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = NULL; 5925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command; 5935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 594c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser mkssert(buf != NULL); 595c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 5965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru len = x_locate_word(buf, buflen, pos, startp, &is_command); 59703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (!((*flagsp) & XCF_COMMAND)) 5985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_command = false; 59903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 60003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Don't do command globing on zero length strings - it takes too 6015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * long and isn't very useful. File globs are more likely to be 6025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * useful, so allow these. 6035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0 && is_command) 6055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 6065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 60703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (len >= 0) { 60803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char *toglob, *s; 60903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 61003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 61103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Given a string, copy it and possibly add a '*' to the end. 61203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 61303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 61403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra strndupx(toglob, buf + *startp, len + /* the '*' */ 1, ATEMP); 61503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra toglob[len] = '\0'; 61603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 61703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 61803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If the pathname contains a wildcard (an unquoted '*', 619c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * '?', or '[') or an extglob, then it is globbed based 620c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * on that value (i.e., without the appended '*'). Same 621c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * for parameter substitutions (as in “cat $HOME/.ss↹”) 622c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * without appending a trailing space (LP: #710539), as 623c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * well as for “~foo” (but not “~foo/”). 62403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 62503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra for (s = toglob; *s; s++) { 62603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (*s == '\\' && s[1]) 62703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra s++; 628c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser else if (*s == '?' || *s == '*' || *s == '[' || 629c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *s == '$' || 63003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* ?() *() +() @() !() but two already checked */ 63103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra (s[1] == '(' /*)*/ && 63203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra (*s == '+' || *s == '@' || *s == '!'))) { 633c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 634c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * just expand based on the extglob 635c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * or parameter 636c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 637c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser goto dont_add_glob; 63803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 63903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 640c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 641c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (*toglob == '~' && !vstrchr(toglob, '/')) { 642c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* neither for '~foo' (but '~foo/bar') */ 643c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser *flagsp |= XCF_IS_NOSPACE; 644c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser goto dont_add_glob; 64503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 64603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 647c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* append a glob */ 648c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser toglob[len] = '*'; 649c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser toglob[len + 1] = '\0'; 650c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser dont_add_glob: 65103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 65203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Expand (glob) it now. 65303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 65403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 65503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = is_command ? 65603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_command_glob(*flagsp, toglob, &words) : 657c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_file_glob(flagsp, toglob, &words); 65803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra afree(toglob, ATEMP); 65903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 6605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 6615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = NULL; 6625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 6635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 66403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (is_command) 66503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra *flagsp |= XCF_IS_COMMAND; 6665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = words; 6675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *endp = *startp + len; 6685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 6705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Find longest common prefix 6745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 67503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic size_t 6765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_longest_prefix(int nwords, char * const * words) 6775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 67803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int i; 67903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t j, prefix_len; 6805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p; 6815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords <= 0) 6835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 6845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = strlen(words[0]); 6865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 1; i < nwords; i++) 6875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0, p = words[i]; j < prefix_len; j++) 6885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p[j] != words[0][j]) { 6895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = j; 6905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 6915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 692c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* false for nwords==1 as 0 = words[0][prefix_len] then */ 693c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (UTFMODE && prefix_len && (words[0][prefix_len] & 0xC0) == 0x80) 694c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (prefix_len && (words[0][prefix_len] & 0xC0) != 0xC0) 695c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser --prefix_len; 6965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (prefix_len); 6975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 7005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_free_words(int nwords, char **words) 7015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 7025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (nwords) 7035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[--nwords], ATEMP); 7045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words, ATEMP); 7055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 7065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 70703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 70803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Return the offset of the basename of string s (which ends at se - need not 7095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be null terminated). Trailing slashes are ignored. If s is just a slash, 7105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * then the offset is 0 (actually, length - 1). 7115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * s Return 7125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc 1 7135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc/ 1 7145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc// 1 7155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc/fo 5 7165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * foo 0 7175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /// 2 7185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 7195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 7215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_basename(const char *s, const char *se) 7225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 7235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *p; 7245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (se == NULL) 7265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru se = s + strlen(s); 7275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (s == se) 7285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 7295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Skip trailing slashes */ 7315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = se - 1; p > s && *p == '/'; p--) 7325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 7335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; p > s && *p != '/'; p--) 7345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 7355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*p == '/' && p + 1 < se) 7365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 7375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (p - s); 7395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 7405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Apply pattern matching to a table: all table entries that match a pattern 7435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are added to wp. 7445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 7465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruglob_table(const char *pat, XPtrV *wp, struct table *tp) 7475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 7485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tstate ts; 7495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *te; 7505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ktwalk(&ts, tp); 7525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((te = ktnext(&ts))) 7535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (gmatchx(te->name, pat, false)) { 7545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 7555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(cp, te->name, ATEMP); 7575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(*wp, cp); 7585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 7605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 7625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruglob_path(int flags, const char *pat, XPtrV *wp, const char *lpath) 7635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 76403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra const char *sp = lpath, *p; 7655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xp, **words; 76603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t pathlen, patlen, oldsize, newsize, i, j; 7675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XString xs; 7685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 76903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra patlen = strlen(pat); 77003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra checkoktoadd(patlen, 129 + X_EXTRA); 77103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ++patlen; 7725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Xinit(xs, xp, patlen + 128, ATEMP); 7735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (sp) { 7745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xp = Xstring(xs, xp); 7755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(p = cstrchr(sp, ':'))) 7765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = sp + strlen(sp); 7775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pathlen = p - sp; 7785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (pathlen) { 77903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 78003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Copy sp into xp, stuffing any MAGIC characters 7815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * on the way 7825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *s = sp; 7845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XcheckN(xs, xp, pathlen * 2); 7865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (s < p) { 7875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ISMAGIC(*s)) 7885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = MAGIC; 7895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = *s++; 7905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = '/'; 7925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pathlen++; 7935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 7955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XcheckN(xs, xp, patlen); 7965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(xp, pat, patlen); 7975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru oldsize = XPsize(*wp); 79903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* mark dirs */ 800c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser glob_str(Xstring(xs, xp), wp, true); 8015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru newsize = XPsize(*wp); 8025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Check that each match is executable... */ 8045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = (char **)XPptrv(*wp); 8055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = j = oldsize; i < newsize; i++) { 80603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (ksh_access(words[i], X_OK) == 0) { 8075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j] = words[i]; 8085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(flags & XCF_FULLPATH)) 8095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(words[j], words[j] + pathlen, 8105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlen(words[j] + pathlen) + 1); 8115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 8125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 8135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[i], ATEMP); 8145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 815c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser wp->len = j; 8165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*sp++) 8185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 8195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 8205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Xfree(xs, xp); 8215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 8225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * if argument string contains any special characters, they will 8255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be escaped and the result will be put into edit buffer by 8265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * keybinding-specific function 8275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 8295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_escape(const char *s, size_t len, int (*putbuf_func)(const char *, size_t)) 8305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 8315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t add = 0, wlen = len; 8325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *ifs = str_val(local("IFS", 0)); 8335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rval = 0; 8345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (wlen - add > 0) 8365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (vstrchr("\"#$&'()*:;<=>?[\\`{|}", s[add]) || 8375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vstrchr(ifs, s[add])) { 8385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf_func(s, add) != 0) { 8395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 8405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 8415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 8425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func(s[add] == '\n' ? "'" : "\\", 1); 8435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func(&s[add], 1); 8445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (s[add] == '\n') 8455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func("'", 1); 8465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru add++; 8485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wlen -= add; 8495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s += add; 8505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru add = 0; 8515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 8525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ++add; 8535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (wlen > 0 && rval == 0) 8545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = putbuf_func(s, wlen); 8555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 8575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 8585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ emacs editing mode +++ */ 8615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic Area aedit; 8635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AEDIT &aedit /* area for kill ring and macro defns */ 8645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values returned by keyboard functions */ 8665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSTD 0 8675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEOL 1 /* ^M, ^J */ 8685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KINTR 2 /* ^G, ^C */ 8695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct x_ftab { 8715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*xf_func)(int c); 8725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *xf_name; 8735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short xf_flags; 8745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 8755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct x_defbindings { 8775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_func; /* XFUNC_* */ 8785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_tab; 8795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_char; 8805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 8815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_ARG 1 /* command takes number prefix */ 8835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_NOBIND 2 /* not allowed to bind to function */ 8845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_PREFIX 4 /* function sets prefix */ 8855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Separator for completion */ 8875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_cfs(c) ((c) == ' ' || (c) == '\t' || (c) == '"' || (c) == '\'') 8885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Separator for motion */ 8895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_mfs(c) (!(ksh_isalnux(c) || (c) == '$' || ((c) & 0x80))) 8905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_NTABS 3 /* normal, meta1, meta2 */ 8925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_TABSZ 256 /* size of keydef tables etc */ 8935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 89403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 89503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Arguments for do_complete() 8965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 = enumerate M-= complete as much as possible and then list 8975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 1 = complete M-Esc 8985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 2 = list M-? 8995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum { 9015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_LIST, /* list the possible completions */ 9025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_COMPLETE, /* complete to longest prefix */ 9035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_COMPLIST /* complete and then list (if non-exact) */ 9045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Comp_type; 9055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The following are used for my horizontal scrolling stuff 9085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 9095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xbuf; /* beg input buffer */ 9105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xend; /* end input buffer */ 9115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xcp; /* current position */ 9125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xep; /* current end */ 9135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xbp; /* start of visible portion of input buffer */ 9145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xlp; /* last char visible on screen */ 915c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic bool x_adj_ok; 9165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we use x_adj_done so that functions can tell 9185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * whether x_adjust() has been called while they are active. 9195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 920c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic int x_adj_done; /* is incremented by x_adjust() */ 9215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_col; 9235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_displen; 9245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_arg; /* general purpose arg */ 92503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic bool x_arg_defaulted; /* x_arg not explicitly set; defaulted to 1 */ 9265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 927c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic bool xlp_valid; /* lastvis pointer was recalculated */ 9285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char **x_histp; /* history position */ 9305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_nextcmd; /* for newline-and-next */ 931c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char **x_histncp; /* saved x_histp for " */ 9325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xmp; /* mark pointer */ 9335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_last_command; 9345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char (*x_tab)[X_TABSZ]; /* key definition */ 9355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *(*x_atab)[X_TABSZ]; /* macro definitions */ 9375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_bound[(X_TABSZ * X_NTABS + 7) / 8]; 9395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KILLSIZE 20 9405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *killstack[KILLSIZE]; 9415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int killsp, killtp; 9425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_curprefix; 9435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 94403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic char *macroptr; /* bind key macro active? */ 9455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 9475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int cur_col; /* current column on line */ 9485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int pwidth; /* width of prompt */ 9495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int prompt_trunc; /* how much of prompt to truncate */ 9505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int winwidth; /* width of window */ 9515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *wbuf[2]; /* window buffers */ 9525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int wbuf_len; /* length of window buffers (x_cols - 3) */ 9535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int win; /* window buffer in use */ 9545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char morec; /* more character at right of window */ 9555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastref; /* argument to last refresh() */ 9565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int holdlen; /* length of holdbuf */ 9575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 958c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic bool prompt_redraw; /* false if newline forced after prompt */ 9595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_ins(const char *); 961c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void x_delete(size_t, bool); 962c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_bword(void); 963c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_fword(bool); 9645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_goto(char *); 9655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_bs3(char **); 9665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size_str(char *); 9675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size2(char *, char **); 9685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zots(char *); 9695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc2(int); 9705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc3(char **); 9715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_load_hist(char **); 9725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search(char *, int, int); 9735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search_dir(int); 9755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_match(char *, char *); 9775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_redraw(int); 9785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_push(int); 979c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char *x_mapin(const char *, Area *); 9805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_mapout(int); 9815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_mapout2(int, char **); 9825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_print(int, int); 9835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_adjust(void); 9845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_ungetc(int); 9855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_getc(void); 9865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc2(int); 9875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc3(const char **); 9885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_puts(const char *); 9895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_fold_case(int); 9915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_lastcp(void); 9935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void do_complete(int, Comp_type); 994c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_nb2nc(size_t); 9955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int unget_char = -1; 9975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_do_ins(const char *, size_t); 9995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void bind_if_not_bound(int, int, int); 10005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum emacs_funcs { 10025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ENUMS 10035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XFUNC_MAX 10055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_DEFNS 10085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const struct x_ftab x_ftab[] = { 10115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ITEMS 10125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 0, NULL, 0 } 10145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct x_defbindings const x_defbindings[] = { 10175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('?') }, 10185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('?') }, 10195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_eot_del, 0, CTRL('D') }, 10205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('H') }, 10215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('H') }, 10225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, 'h' }, 10235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_bword, 1, 'b' }, 10245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_fword, 1, 'f' }, 10255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_fword, 1, 'd' }, 10265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 0, CTRL('B') }, 10275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 0, CTRL('F') }, 10285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_forw, 0, CTRL(']') }, 10295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_back, 1, CTRL(']') }, 10305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('M') }, 10315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('J') }, 10325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_of_text, 0, CTRL('_') }, 10335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_abort, 0, CTRL('G') }, 10345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 0, CTRL('P') }, 10355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 0, CTRL('N') }, 10365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_nl_next_com, 0, CTRL('O') }, 10375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist, 0, CTRL('R') }, 10385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_beg_hist, 1, '<' }, 10395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_hist, 1, '>' }, 10405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_goto_hist, 1, 'g' }, 10415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 0, CTRL('E') }, 10425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 0, CTRL('A') }, 10435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_draw_line, 0, CTRL('L') }, 10445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_cls, 1, CTRL('L') }, 10455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta1, 0, CTRL('[') }, 10465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 0, CTRL('X') }, 10475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill, 0, CTRL('K') }, 10485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_yank, 0, CTRL('Y') }, 10495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta_yank, 1, 'y' }, 10505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('^') }, 10515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comment, 1, '#' }, 10525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_transpose, 0, CTRL('T') }, 10535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_complete, 1, CTRL('[') }, 10545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 0, CTRL('I') }, 10555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 1, '=' }, 10565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_enumerate, 1, '?' }, 10575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_expand, 1, '*' }, 10585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_file, 1, CTRL('X') }, 10595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_comm, 2, CTRL('[') }, 10605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_comm, 2, '?' }, 10615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_file, 2, CTRL('Y') }, 10625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_mark, 1, ' ' }, 10635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill_region, 0, CTRL('W') }, 10645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_xchg_point_mark, 2, CTRL('X') }, 10655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('V') }, 10665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_version, 1, CTRL('V') }, 10675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '.' }, 10685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '_' }, 10695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '0' }, 10705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '1' }, 10715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '2' }, 10725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '3' }, 10735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '4' }, 10745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '5' }, 10755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '6' }, 10765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '7' }, 10775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '8' }, 10785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '9' }, 10795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 10805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'U' }, 10815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'u' }, 10825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'L' }, 10835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'l' }, 10845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'C' }, 10855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'c' }, 10865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 108703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 108803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * These for ANSI arrow keys: arguablely shouldn't be here by 10895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * default, but its simpler/faster/smaller than using termcap 10905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * entries. 10915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, '[' }, 10935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, 'O' }, 10945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 2, 'A' }, 10955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 2, 'B' }, 10965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 2, 'C' }, 10975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 2, 'D' }, 10985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 10995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_vt_hack, 2, '1' }, 11005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin | 0x80, 2, '7' }, 11015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 2, 'H' }, 11025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '4' }, 11035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '8' }, 11045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 2, 'F' }, 11055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_char | 0x80, 2, '3' }, 11065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_up | 0x80, 2, '5' }, 11075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_dn | 0x80, 2, '6' }, 11085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more non-standard ones */ 11095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_edit_line, 2, 'e' } 11105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 11115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 11125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1113c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 1114c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_nb2nc(size_t nb) 1115c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 1116c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *cp; 1117c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nc = 0; 1118c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 1119c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (cp = xcp; cp < (xcp + nb); ++nc) 1120c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp += utf_ptradj(cp); 1121c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (nc); 1122c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 1123c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 11245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 11255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_modified(void) 11265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) { 11285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 11295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 11305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1132c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 1133c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_SMALL 11345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f) 11355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 11365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f & 0x7F) 11375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 11385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 11405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getmbc(char *sbuf) 11415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, pos = 0; 11435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf = (unsigned char *)sbuf; 11445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset(buf, 0, 4); 11465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 11475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 11505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xC2) && (buf[0] < 0xF0)) { 11515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 11525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c & 0xC0) != 0x80) { 11555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 11565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 11575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c; 11595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xE0) && (buf[0] < 0xF0)) { 11615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 11625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 11635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (pos); 11685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 11695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 11715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_init_prompt(void) 11725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = promptlen(prompt); 1174c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 1175c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser prompt_redraw = true; 11765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 11775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col %= xx_cols; 11785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2 - x_col; 11795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_done = 0; 11805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, 0); 11825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_displen < 1) { 11835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 11845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2; 11855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 1186c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser prompt_redraw = false; 11875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 11895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 11915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_emacs(char *buf, size_t len) 11925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, i; 11945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 11955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf = buf; xend = buf + len; 11975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xcp = xep = buf; 11985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 11995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 12005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 12015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 12025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 12035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = XFUNC_error; 12045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xx_cols = x_cols; 12065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_init_prompt(); 12075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1208c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = NULL; 12095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_nextcmd >= 0) { 12105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int off = source->line - x_nextcmd; 1211c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (histptr - history >= off) { 12125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr - off); 1213c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = x_histp; 1214c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 12155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_nextcmd = -1; 12165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 1; 121803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 12195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 12205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 12215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 12225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_curprefix == -1 ? XFUNC_insert : 12245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[x_curprefix][c]; 12255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 12265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 12275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 12285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = x_e_getc()) != '~') 12295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(i); 12305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* avoid bind key macro recursion */ 12335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr && f == XFUNC_ins_string) 12345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 12355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 12365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX) && 12385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command != XFUNC_set_arg) { 12395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 124003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 12415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = c | (x_curprefix << 8); 12435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 12445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((*x_ftab[f].xf_func)(i)) { 12455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KSTD: 12465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX)) 12475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = f; 12485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 12495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KEOL: 12505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 12515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 125203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case KINTR: 125303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* special case for interrupt */ 12545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(SIGINT); 12555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 12565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 12575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ad-hoc hack for fixing the cursor position */ 12595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp); 12605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_insert(int c) 12655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 126603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra static int left, pos, save_arg; 12675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char str[4]; 12685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 12705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Should allow tab and control chars. 12715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == 0) { 12735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru invmbs: 12745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 12755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 12765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 12795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (((c & 0xC0) == 0x80) && left) { 12805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos++] = c; 12815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!--left) { 12825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 12835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = save_arg; 12845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 12855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 12865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 12905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_curprefix == -1) { 12915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* flush invalid multibyte */ 12925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 12935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (save_arg--) 12945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 12955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c >= 0xC2) && (c < 0xE0)) 12985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 1; 12995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if ((c >= 0xE0) && (c < 0xF0)) 13005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 2; 13015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (c > 0x7F) 13025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto invmbs; 13035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 13045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 13055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 13065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_arg = x_arg; 13075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pos = 1; 13085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 13095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 13135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 13145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[1] = '\0'; 13155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 13165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 13175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 13215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins_string(int c) 13235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = x_atab[c >> 8][c & 255]; 13255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we no longer need to bother checking if macroptr is 13275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * not NULL but first char is NUL; x_e_getc() does it 13285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 13325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_do_ins(const char *cp, size_t len) 13355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep + len >= xend) { 13375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 13385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 13395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp + len, xcp, xep - xcp + 1); 13415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp, cp, len); 13425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp += len; 13435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep += len; 13445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 13455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 13465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins(const char *s) 13505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 13525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 13535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_do_ins(s, strlen(s)) < 0) 13555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 13565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_zots() may result in a call to x_adjust() 13585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we want xcp to reflect the new position. 13595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 13615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 1362c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = tobool(xcp >= xlp); 13635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(cp); 136403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* has x_adjust() been called? */ 136503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (adj == x_adj_done) { 13665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no */ 13675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 13685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 13695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 13705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xlp == xep - 1) 13725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 1373c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 13745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 13755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_back(int c MKSH_A_UNUSED) 13795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1380c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ssize_t i = 0; 13815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 13835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 13845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 13875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 13885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while ((++i < x_arg) && (xcp != xbuf)); 13895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 13905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_char(int c MKSH_A_UNUSED) 13955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp, *cp2; 1397c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i = 0; 13985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 1400c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (i < (size_t)x_arg) { 14015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 14025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 14035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 14045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 14055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i++; 14065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!i) { 14095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 14105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 14135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Delete nc chars to the right of the cursor (including cursor position) */ 14175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 1418c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_delete(size_t nc, bool push) 14195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1420c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i, nb, nw; 14215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 14225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nc == 0) 14245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 14255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = 0; 14275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 14285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nc; ++i) { 14295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 14305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int j; 14315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(cp, &cp2); 14335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 14345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 14355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 14365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw += j; 14375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb = cp - xcp; 14395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* nc = i; */ 14405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp != NULL && xmp > xcp) { 14425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp + nb > xmp) 14435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 14445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 14455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp -= nb; 14465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 14485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This lets us yank a word we have deleted. 14495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 14505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (push) 14515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(nb); 14525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep -= nb; 145403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Copies the NUL */ 145503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memmove(xcp, xcp + nb, xep - xcp + 1); 145603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* don't redraw */ 1457c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = false; 14585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 14595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xcp); 14605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 14615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * if we are already filling the line, 146203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * there is no need to ' ', '\b'. 14635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * But if we must, make sure we do the minimum. 14645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 14655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = xx_cols - 2 - x_col) > 0 || xep - xlp == 0) { 14665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = i = (nw < i) ? nw : i; 14675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 14685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 14695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col == xx_cols - 2) { 14705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2((xep > xlp) ? '>' : (xbp > xbuf) ? '<' : ' '); 14715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ++nw; 14725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (nw--) 14745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 14755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*x_goto(xcp);*/ 1477c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 14785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 14795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = x_lastcp(); 14805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 14815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 14825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 14845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 14855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_bword(int c MKSH_A_UNUSED) 14895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(x_bword(), true); 14915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_bword(int c MKSH_A_UNUSED) 14965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bword(); 14985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_fword(int c MKSH_A_UNUSED) 15035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1504c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_fword(true); 15055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_fword(int c MKSH_A_UNUSED) 15105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1511c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_fword(false), true); 15125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1515c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 15165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bword(void) 15175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1518c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nb = 0; 15195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 15205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xbuf) { 15225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 15245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && is_mfs(cp[-1])) { 15275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 15285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 15295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && !is_mfs(cp[-1])) { 15315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 15325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 15335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 1536c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (x_nb2nc(nb)); 15375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1539c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 1540c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_fword(bool move) 15415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1542c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nc; 1543c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *cp = xcp; 15445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 15465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 15485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 15515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 15525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) 15535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 15545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1555c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser nc = x_nb2nc(cp - xcp); 15565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (move) 15575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 15585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nc); 15595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto(char *cp) 15635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1564c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (cp >= xep) 1565c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp = xep; 1566c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser else if (UTFMODE) 15675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((cp > xbuf) && ((*cp & 0xC0) == 0x80)) 15685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --cp; 15695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp < xbp || cp >= utf_skipcols(xbp, x_displen)) { 15705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we are heading off screen */ 15715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = cp; 15725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 157303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else if (cp < xcp) { 157403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* move back */ 15755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp < xcp) 15765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 157703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else if (cp > xcp) { 157803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* move forward */ 15795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 15805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 15815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bs3(char **p) 15865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 15885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*p)--; 15905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) 15915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (((unsigned char)**p & 0xC0) == 0x80) 15925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*p)--; 15935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_size2(*p, NULL); 15955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 15965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 15975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size_str(char *cp) 16015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int size = 0; 16035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) 16045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size += x_size2(cp, &cp); 16055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (size); 16065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size2(char *cp, char **dcp) 16105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c = *(unsigned char *)cp; 16125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) 16145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (utf_widthadj(cp, (const char **)dcp)); 16155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (dcp) 16165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *dcp = cp + 1; 16175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') 161803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Kludge, tabs are always four spaces. */ 161903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return (4); 16205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) 162103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* control unsigned char */ 162203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return (2); 16235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 16245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zots(char *str) 16285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 16305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 16325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*str && str < xlp && adj == x_adj_done) 16335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&str); 16345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc2(int c) 16385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 16405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 16415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 16425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 16435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 16445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 16455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 16465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(c); 16475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc3(char **cp) 16515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char c = **(unsigned char **)cp; 16535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 16555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 16565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 16575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 16585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 16595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 16605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 16615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 16625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 16635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3((const char **)cp); 16645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_back(int c MKSH_A_UNUSED) 16685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 16705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 16745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 16755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) 16765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 16775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_forw(int c MKSH_A_UNUSED) 16835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *cp2; 16855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xep) { 16875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 16915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 16925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 16935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 16945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 16955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 16975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_forw(int c MKSH_A_UNUSED) 17025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 17045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char tmp[4]; 17055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 17075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 17085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 17125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cp = (cp == xep) ? NULL : strstr(cp + 1, tmp)) == NULL && 17135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cp = strstr(xbuf, tmp)) == NULL) { 17145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 17195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_back(int c MKSH_A_UNUSED) 17245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *p, tmp[4]; 17265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool b; 17275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 17295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; x_arg--; cp = p) 17335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = cp; ; ) { 17345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p-- == xbuf) 17355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = xep; 17365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == cp) { 17375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((tmp[1] && ((p+1) > xep)) || 17415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (tmp[2] && ((p+2) > xep))) 17425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 17435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = true; 17445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*p != tmp[0]) 17455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[1] && p[1] != tmp[1]) 17475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[2] && p[2] != tmp[2]) 17495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b) 17515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 17525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 17545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_newline(int c MKSH_A_UNUSED) 17595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 17615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 17625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 17635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep++ = '\n'; 17645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 17655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_of_text(int c MKSH_A_UNUSED) 17695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc2(edchars.eof); 17715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 17725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 17735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 17745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 17755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_beg_hist(int c MKSH_A_UNUSED) 17795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 17815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_hist(int c MKSH_A_UNUSED) 17865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr); 17885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_com(int c MKSH_A_UNUSED) 17935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp - x_arg); 17955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_next_com(int c MKSH_A_UNUSED) 18005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp + x_arg); 18025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 180503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 180603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Goto a particular history number obtained from argument. 18075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If no argument is given history 1 is probably not what you 18085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * want so we'll simply go to the oldest one. 18095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 18105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto_hist(int c MKSH_A_UNUSED) 18125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) 18145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 18155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 18165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + x_arg - source->line); 18175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 18215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_load_hist(char **hp) 18225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize; 18245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 18255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hp == histptr + 1) { 18275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = holdbuf; 18285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 18295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (hp < history || hp > histptr) { 18305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 18315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 18325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sp == NULL) 18345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = *hp; 18355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = hp; 18365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru oldsize = x_size_str(xbuf); 18375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) 18385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(holdbuf, xbuf, sizeof(holdbuf)); 18395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, sp, xend - xbuf); 18405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf; 18415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xcp = xbuf + strlen(xbuf); 18425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 18435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep <= x_lastcp()) { 18445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 18455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 18475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 18485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_nl_next_com(int c MKSH_A_UNUSED) 18525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1853c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (!x_histncp || (x_histp != x_histncp && x_histp != histptr + 1)) 1854c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* fresh start of ^O */ 1855c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = x_histp; 1856c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_nextcmd = source->line - (histptr - x_histncp) + 1; 18575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 18585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_eot_del(int c) 18625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf && x_arg_defaulted) 18645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_end_of_text(c)); 18655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 18665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_del_char(c)); 18675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* reverse incremental history search */ 18705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist(int c) 18725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int offset = -1; /* offset of match in xbuf, else -1 */ 1874c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char pat[80 + 1]; /* pattern buffer */ 18755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = pat; 18765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 18775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = '\0'; 187903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 18805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) { 18815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nI-search: "); 18825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(pat); 18835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 18855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 18865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[0][c]; 18885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == CTRL('[')) { 18895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((f & 0x7F) == XFUNC_meta1) { 18905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 18915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[1][c] & 0x7F; 18935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1 || f == XFUNC_meta2) 18945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_meta1(CTRL('[')); 18955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 18965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 19005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 19015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 19025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '~') 19035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 19045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 19065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_search_hist) 19075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 19085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_del_back) { 19095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) { 19105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 19115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 19125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p > pat) 19145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *--p = '\0'; 19155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) 19165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 19175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 19185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 1, offset); 19195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_insert) { 19215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* add char to pattern */ 19225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* overflow check... */ 1923c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((size_t)(p - pat) >= sizeof(pat) - 1) { 19245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 19255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c, *p = '\0'; 19285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 19295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* already have partial match */ 19305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_match(xbuf, pat); 19315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 19325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + offset + (p - pat) - 19335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*pat == '^')); 19345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 19385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_abort) { 19395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) 19405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + 1); 19415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 194203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else { 194303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* other command */ 19445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 19455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 19465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 19495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 19505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* search backward from current line */ 19545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search(char *pat, int sameline, int offset) 19565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp; 19585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 19595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (hp = x_histp - (sameline ? 0 : 1); hp >= history; --hp) { 19615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_match(*hp, pat); 19625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i >= 0) { 19635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 19645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 19655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 19665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + i + strlen(pat) - (*pat == '^')); 19675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 19685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 19715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr; 19725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 19735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 19765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search up from current line */ 19775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_up(int c MKSH_A_UNUSED) 19795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(-1)); 19815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search down from current line */ 19845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_dn(int c MKSH_A_UNUSED) 19865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(1)); 19885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search in the indicated direction */ 19915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_dir(int search_dir /* should've been bool */) 19935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp = x_histp + search_dir; 19955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t curs = xcp - xbuf; 19965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (histptr >= hp && hp >= history) { 19985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strncmp(xbuf, *hp, curs) == 0) { 19995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 20005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + curs); 20015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 20025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hp += search_dir; 20045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 20085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return position of first match of pattern in string, else -1 */ 20105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_match(char *str, char *pat) 20125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*pat == '^') { 20145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((strncmp(str, pat + 1, strlen(pat + 1)) == 0) ? 0 : -1); 20155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 20165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *q = strstr(str, pat); 20175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((q == NULL) ? -1 : q - str); 20185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_line(int c MKSH_A_UNUSED) 20235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j; 20255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = 0; 20275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 20285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size_str(xbuf); 20295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbuf; 20305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(i); 20315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp = xep = xbuf; 20325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 20335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 20345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 20355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(j); 20365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 20375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_end(int c MKSH_A_UNUSED) 20425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 20445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_begin(int c MKSH_A_UNUSED) 20495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf); 20515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_draw_line(int c MKSH_A_UNUSED) 20565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 20585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_rebuildline(const char *clrstr) 20635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(clrstr, shl_out); 20655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 20665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_cls(int c MKSH_A_UNUSED) 20715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_e_rebuildline(MKSH_CLS_STRING)); 20735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 207503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 207603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Redraw (part of) the line. If limit is < 0, the everything is redrawn 20775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * on a NEW line, otherwise limit is the screen column up to which needs 20785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * redrawing. 20795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 20805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 20815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_redraw(int limit) 20825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j, x_trunc = 0; 20845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 20855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2086c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = false; 20875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit == -1) 20885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 20895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 20905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 20915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 20925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp == xbuf) { 20935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = promptlen(prompt); 20945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 20955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_trunc = (x_col / xx_cols) * xx_cols; 20965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 20975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, x_trunc); 20985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 21005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col %= xx_cols; 21015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2 - x_col; 21025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_displen < 1) { 21035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 21045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2; 21055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 21075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xbp); 21085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp != xbuf || xep > xlp) 21095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru limit = xx_cols; 21105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit >= 0) { 21115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep > xlp) 211203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* we fill the line */ 211303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 21145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 21155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cpl = xbp; 21165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = limit; 21185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cpl < xlp) 21195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i -= x_size2(cpl, &cpl); 21205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = 0; 21235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((j < i) || (x_col < (xx_cols - 2))) { 21245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_col < (xx_cols - 2))) 21255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 21265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 21275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 21285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = ' '; 213003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (xep > xlp) { 213103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* more off screen */ 21325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp > xbuf) 21335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '*'; 21345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 21355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '>'; 21365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xbp > xbuf) 21375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '<'; 21385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(i); 21395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 21405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (j--) 21415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 21425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 21445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 21455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 2146c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 21475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 21485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_transpose(int c MKSH_A_UNUSED) 21525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned int tmpa, tmpb; 21545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 215503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /*- 215603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * What transpose is meant to do seems to be up for debate. This 21575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is a general summary of the options; the text is abcd with the 21585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * upper case character or underscore indicating the cursor position: 21595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Who Before After Before After 21605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in emacs mode: abCd abdC abcd_ (bell) 21615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in gmacs mode: abCd baCd abcd_ abdc_ 21625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * gnu emacs: abCd acbD abcd_ abdc_ 21635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Pdksh currently goes with GNU behavior since I believe this is the 21645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * most common version of emacs, unless in gmacs mode, in which case 21655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * it does the AT&T ksh gmacs mode. 21665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This should really be broken up into 3 functions so users can bind 21675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to the one they want. 21685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 21695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 21705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xcp == xep || Flag(FGMACS)) { 21735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp - xbuf == 1) { 21745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 217703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 217803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Gosling/Unipress emacs style: Swap two characters before 217903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * the cursor, do not change cursor position 21805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 21815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 21825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 21835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 21875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 21885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 21925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 21935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 21945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 21955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 219603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 219703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * GNU emacs style: Swap the characters before and under the 21985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cursor, move cursor position along one. 21995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 22005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 22015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 22025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 22055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 22065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 22075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 22105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 22115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 22125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 22135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 22155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_literal(int c MKSH_A_UNUSED) 22205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = -1; 22225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta1(int c MKSH_A_UNUSED) 22275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 1; 22295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta2(int c MKSH_A_UNUSED) 22345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 2; 22365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill(int c MKSH_A_UNUSED) 22415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2242c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t col = xcp - xbuf; 2243c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t lastcol = xep - xbuf; 2244c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t ndel, narg; 22455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2246c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_arg_defaulted || (narg = x_arg) > lastcol) 2247c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser narg = lastcol; 2248c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (narg < col) { 2249c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_goto(xbuf + narg); 2250c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ndel = col - narg; 2251c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } else 2252c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ndel = narg - col; 2253c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(ndel), true); 22545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 22585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_push(int nchars) 22595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 22615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2262c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser mkssert(xcp != NULL); 22635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strndupx(cp, xcp, nchars, AEDIT); 22645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killsp]) 22655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(killstack[killsp], AEDIT); 22665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killsp] = cp; 22675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killsp = (killsp + 1) % KILLSIZE; 22685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_yank(int c MKSH_A_UNUSED) 22725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killsp == 0) 22745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE; 22755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 22765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 22775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 22785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killtp] == 0) { 22795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nnothing to yank"); 22805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 22815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 22845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 22855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta_yank(int c MKSH_A_UNUSED) 22905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 229103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t len; 22925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((x_last_command != XFUNC_yank && x_last_command != XFUNC_meta_yank) || 22945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killtp] == 0) { 22955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 22965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nyank something first"); 22975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 22985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru len = strlen(killstack[killtp]); 23015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - len); 2302c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(len), false); 23035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 23045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killtp == 0) 23055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE - 1; 23065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 23075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 23085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (killstack[killtp] == 0); 23095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 23105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 23115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_abort(int c MKSH_A_UNUSED) 23155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* x_zotc(c); */ 23175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xep = xcp = xbp = xbuf; 23185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 23195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 23205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 23215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KINTR); 23225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_error(int c MKSH_A_UNUSED) 23265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 23285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 23295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* special VT100 style key sequence hack */ 23335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vt_hack(int c) 23355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we only support PF2-'1' for now */ 23375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != (2 << 8 | '1')) 23385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 23395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* what's the next character? */ 23415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 23425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 23435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 234403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 23455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_begin(0)); 23465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 23475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* "interesting" sequence detected */ 23485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 23495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 23505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 23515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 23545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '5' && c != '3') 23555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 23565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*- 23585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * At this point, we have read the following octets so far: 235903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * - ESC+[ or ESC+O or Ctrl-X (Prefix 2) 23605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 1 (vt_hack) 23615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - ; 23625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 5 (Ctrl key combiner) or 3 (Alt key combiner) 23635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * We can now accept one more octet designating the key. 23645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 23655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 23675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 23685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_fword(c)); 23695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 23705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_bword(c)); 23715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind_err: 23745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 23755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 23765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 23805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapin(const char *cp, Area *ap) 23815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *news, *op; 23835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(news, cp, ap); 23855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru op = news; 23865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) { 23875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX -- should handle \^ escape? */ 23885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cp == '^') { 23895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 239003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (*cp >= '?') 239103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* includes '?'; ASCII */ 23925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = CTRL(*cp); 23935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 23945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = '^'; 23955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 23965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 23985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = *cp; 23995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 24005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op = '\0'; 24025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 24045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 24075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout2(int c, char **buf) 24085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = *buf; 24105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 24125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = '^'; 24135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = UNCTRL(c); 24145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 24155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c; 24165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = 0; 24175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *buf = p; 24185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 24215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout(int c) 24225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char buf[8]; 24245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *bp = buf; 24255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(c, &bp); 24275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (buf); 24285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 24315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_print(int prefix, int key) 24325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int f = x_tab[prefix][key]; 24345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prefix) 24365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* prefix == 1 || prefix == 2 */ 24375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(x_mapout(prefix == 1 ? 24385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CTRL('[') : CTRL('X')), shl_stdout); 24395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 24405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s = ", x_mapout(key)); 24415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 24425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s%s = ", x_mapout(key), (f & 0x80) ? "~" : ""); 24435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(f) != XFUNC_ins_string) 24445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[XFUNC_VALUE(f)].xf_name); 24465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 24485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("'%s'\n", x_atab[prefix][key]); 24495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint 24535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bind(const char *a1, const char *a2, 24545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 245503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* bind -m */ 245603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool macro, 24575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 245803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* bind -l */ 245903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool list) 24605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 24625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int prefix, key; 24635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *m1, *m2; 24645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 24665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool hastilde; 24675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_tab == NULL) { 247003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("can't bind, not a tty"); 24715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 24725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* List function names */ 24745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (list) { 24755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 24765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 24775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !(x_ftab[f].xf_flags & XF_NOBIND)) 24785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[f].xf_name); 24795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a1 == NULL) { 24825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (prefix = 0; prefix < X_NTABS; prefix++) 24835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (key = 0; key < X_TABSZ; key++) { 24845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 24855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert || f == XFUNC_error 24865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru || (macro && f != XFUNC_ins_string) 24885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) 24905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 24915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 24925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru m2 = m1 = x_mapin(a1, ATEMP); 24965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 0; 24975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (;; m1++) { 24985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru key = (unsigned char)*m1; 24995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 25005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1) 25015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 1; 25025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_meta2) 25035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 2; 25045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 25055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 25065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++m1 25085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru && ((*m1 != '~') || *(m1 + 1)) 25105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) { 251203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char msg[256]; 25135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *c = a1; 251403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra m1 = msg; 2515c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (*c && (size_t)(m1 - msg) < sizeof(msg) - 3) 25165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(*c++, &m1); 251703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("%s: %s", "too long key sequence", msg); 25185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 25195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 252103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra hastilde = tobool(*m1); 25225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(m2, ATEMP); 25245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a2 == NULL) { 25265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 25275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 25285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*a2 == 0) { 25305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 25315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (macro) { 25335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_ins_string; 25345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = x_mapin(a2, AEDIT); 25355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 25375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 25385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 25395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(x_ftab[f].xf_name, a2) == 0) 25405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 25415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == NELEM(x_ftab) || x_ftab[f].xf_flags & XF_NOBIND) { 254203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("%s: %s %s", a2, "no such", Tfunction); 25435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 25445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(x_tab[prefix][key]) == XFUNC_ins_string && 25495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key]) 25505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(x_atab[prefix][key], AEDIT); 25515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[prefix][key] = f 25535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru | (hastilde ? 0x80 : 0) 25555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 25575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key] = sp; 25595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Track what the user has bound so x_mode(true) won't toast things */ 25625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert) 25635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] &= 25645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ~(1 << ((prefix * X_TABSZ + key) % 8)); 25655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 25665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] |= 25675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (1 << ((prefix * X_TABSZ + key) % 8)); 25685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 25705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 25735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubind_if_not_bound(int p, int k, int func) 25745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2575c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser int t; 2576c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2577c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2578c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Has user already bound this key? 2579c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * If so, do not override it. 2580c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2581c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser t = p * X_TABSZ + k; 2582c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_bound[t >> 3] & (1 << (t & 7))) 25835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 25845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[p][k] = func; 25865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_mark(int c MKSH_A_UNUSED) 25905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 25925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill_region(int c MKSH_A_UNUSED) 25975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2598c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t rsize; 25995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xr; 26005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 26025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp > xcp) { 26065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xmp - xcp; 26075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xcp; 26085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 26095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xcp - xmp; 26105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xmp; 26115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xr); 2613c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(rsize), true); 26145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xr; 26155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_xchg_point_mark(int c MKSH_A_UNUSED) 26205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *tmp; 26225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 26245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tmp = xmp; 26285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 26295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(tmp); 26305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_noop(int c MKSH_A_UNUSED) 26355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 26405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * File/command name completion routines 26415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 26425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_comm(int c MKSH_A_UNUSED) 26445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_COMPLETE); 26465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_comm(int c MKSH_A_UNUSED) 26515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_LIST); 26535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_complete(int c MKSH_A_UNUSED) 26585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLETE); 26605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_enumerate(int c MKSH_A_UNUSED) 26655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_LIST); 26675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_file(int c MKSH_A_UNUSED) 26725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_COMPLETE); 26745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_file(int c MKSH_A_UNUSED) 26795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_LIST); 26815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_list(int c MKSH_A_UNUSED) 26865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLIST); 26885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_expand(int c MKSH_A_UNUSED) 26935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 26955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nwords, i; 26965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 269703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_FILE; 269803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, xbuf, xep - xbuf, xcp - xbuf, 269903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 27005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 27025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 27035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 27045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + start); 2706c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(end - start), false); 270703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 270803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 270903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (i < nwords) { 27105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_do_ins) < 0 || 27115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (++i < nwords && x_ins(" ") < 0)) { 27125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 27135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 27145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 27175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 27195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 272203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrado_complete( 272303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* XCF_{COMMAND,FILE,COMMAND_FILE} */ 272403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int flags, 272503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 0 for list, 1 for complete and 2 for complete-list */ 27265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Comp_type type) 27275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 27295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nlen, olen, nwords; 2730c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser bool completed; 27315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 273203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&flags, xbuf, xep - xbuf, xcp - xbuf, 273303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 27345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no match */ 27355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 27365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 27375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 27385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (type == CT_LIST) { 274003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, 274103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra tobool(flags & XCF_IS_COMMAND)); 27425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(0); 27435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 27445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 27455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = end - start; 27475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = x_longest_prefix(nwords, words); 2748c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (nwords == 1) { 2749c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2750c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * always complete single matches; 2751c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * any expansion of parameter substitution 2752c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * is always at most one result, too 2753c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 27545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru completed = true; 2755c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } else { 2756c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *unescaped; 2757c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2758c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* make a copy of the original string part */ 2759c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser strndupx(unescaped, xbuf + start, olen, ATEMP); 2760c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2761c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* expand any tilde and unescape the string for comparison */ 2762c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser unescaped = x_glob_hlp_tilde_and_rem_qchar(unescaped, true); 2763c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2764c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2765c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * match iff entire original string is part of the 2766c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * longest prefix, implying the latter is at least 2767c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * the same size (after unescaping) 2768c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2769c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser completed = !strncmp(words[0], unescaped, strlen(unescaped)); 2770c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2771c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afree(unescaped, ATEMP); 2772c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 2773c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (type == CT_COMPLIST && nwords > 1) { 2774c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2775c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * print expansions, since we didn't get back 2776c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * just a single match 2777c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2778c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_print_expansions(nwords, words, 2779c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser tobool(flags & XCF_IS_COMMAND)); 2780c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 2781c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (completed) { 2782c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* expand on the command line */ 2783c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xmp = NULL; 2784c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xcp = xbuf + start; 2785c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xep -= olen; 2786c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser memmove(xcp, xcp + olen, xep - xcp + 1); 2787c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_escape(words[0], nlen, x_do_ins); 27885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2789c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adjust(); 279003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 279103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * append a space if this is a single non-directory match 279203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * and not a parameter or homedir substitution 279303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 279403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (nwords == 1 && words[0][nlen - 1] != '/' && 2795c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser !(flags & XCF_IS_NOSPACE)) { 27965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(" "); 27975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 28005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 280203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 280303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 28045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_adjust - redraw the line adjusting starting point etc. 28055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 28065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 28075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function is called when we have exceeded the bounds 28085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of the edit window. It increments x_adj_done so that 28095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * functions like x_ins and x_delete know that we have been 28105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * called and can skip the x_bs() stuff which has already 28115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * been done by x_redraw. 28125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 28135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 28145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 28155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 28165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_adjust(void) 28185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 281903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* flag the fact that we were called. */ 282003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_adj_done++; 28215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 28225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we had a problem if the prompt length > xx_cols / 2 28235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 28245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((xbp = xcp - (x_displen / 2)) < xbuf) 28255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf; 28265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) 28275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((xbp > xbuf) && ((*xbp & 0xC0) == 0x80)) 28285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --xbp; 28295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 28305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 28315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 28325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_ungetc(int c) 28365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = c < 0 ? -1 : (c & 255); 28385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 28415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getc(void) 28425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 28445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (unget_char >= 0) { 28465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = unget_char; 28475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = -1; 28485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 28495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 28525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr) { 28535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = (unsigned char)*macroptr++)) 28545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 28555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = NULL; 28565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 28585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_getc()); 28605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc2(int c) 28645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1; 28665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 28685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 28695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 28705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 28715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char utf_tmp[3]; 28725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t x; 28735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0xA0) 28755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = 0xFFFD; 28765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x = utf_wctomb(utf_tmp, c); 28775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[0]); 28785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 1) 28795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[1]); 28805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 2) 28815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[2]); 28825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_wcwidth(c); 28835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 28845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 28855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 28865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 28875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 28895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 28905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 28925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 28935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 28955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 28965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 29005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 29015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 29045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc3(const char **cp) 29055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1, c = **(const unsigned char **)cp; 29075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 29095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 29105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 29115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 29125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 29135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_widthadj(*cp, (const char **)&cp2); 29155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp < cp2) 29165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*(*cp)++); 29175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 29185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 29195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 29205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 29225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 29235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 29255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 29265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 29285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 29295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 29315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 29325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 29365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 29375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 29405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_puts(const char *s) 29415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 29435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*s && adj == x_adj_done) 29455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3(&s); 29465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 294803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 294903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 29505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_set_arg - set an arg value for next function 29515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 29535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This is a simple implementation of M-[0-9]. 29545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 29565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 29575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 29585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 29595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_arg(int c) 29605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 296103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra unsigned int n = 0; 296203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool first = true; 29635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 296403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* strip command prefix */ 296503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra c &= 255; 296603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (c >= 0 && ksh_isdigit(c)) { 29675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = n * 10 + (c - '0'); 296803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (n > LINE) 296903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* upper bound for repeat */ 297003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra goto x_set_arg_too_big; 297103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra c = x_e_getc(); 297203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra first = false; 297303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 29745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0 || first) { 297503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_set_arg_too_big: 29765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 29775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 297803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 29795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 29805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 29815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = n; 298203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = false; 29835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 29855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Comment or uncomment the current line. */ 29885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 29895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comment(int c MKSH_A_UNUSED) 29905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize = x_size_str(xbuf); 299203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t len = xep - xbuf; 29935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(xbuf, xend - xbuf, &len); 29945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret < 0) 29965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 29975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 29985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 29995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + len; 30005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 30015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbp = xbuf; 30025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 30035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret > 0) 30045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 30055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_version(int c MKSH_A_UNUSED) 30115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbuf = xbuf, *o_xend = xend; 30135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbp = xbp, *o_xep = xep, *o_xcp = xcp; 301403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int lim = x_lastcp() - xbp; 301503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t vlen; 30165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *v; 30175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(v, KSH_VERSION, ATEMP); 30195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = xbp = xcp = v; 30215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = xep = v + (vlen = strlen(v)); 30225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(lim); 30235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 30245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 30265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = o_xbuf; 30275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = o_xend; 30285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = o_xbp; 30295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = o_xep; 30305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = o_xcp; 303103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_redraw((int)vlen); 30325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0) 30345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* This is what AT&T ksh seems to do... Very bizarre */ 30365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != ' ') 30375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 30385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(v, ATEMP); 30405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 30445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_edit_line(int c MKSH_A_UNUSED) 30465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) { 30485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf) { 30495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 30505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 30535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 30545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, xbuf, true, true); 30555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 0; 30565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 30575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = source->line - (histptr - x_histp); 30585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg) 30605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(xbuf, xend - xbuf, "%s %d", 30615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", x_arg); 30625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 30635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, "fc -e ${VISUAL:-${EDITOR:-vi}} --", xend - xbuf); 30645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + strlen(xbuf); 30655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 30665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 30685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 306903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 307003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 30715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_prev_histword - recover word from prev command 30725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 30745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function recovers the last word from the previous 30755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * command and inserts it into the current edit line. If a 30765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * numeric arg is supplied then the n'th word from the 30775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * start of the previous command is used. 30785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * As a side effect, trashes the mark in order to achieve 30795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * being called in a repeatable fashion. 30805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Bound to M-. 30825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 30845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 30855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_histword(int c MKSH_A_UNUSED) 30885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *rcp, *cp; 30905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **xhp; 309103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int m = 1; 309203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* -1 = defaulted; 0+ = argument */ 309303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra static int last_arg = -1; 309403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 309503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (x_last_command == XFUNC_prev_histword) { 309603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (xmp && modified > 1) 309703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_kill_region(0); 309803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (modified) 309903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra m = modified; 310003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else 310103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra last_arg = x_arg_defaulted ? -1 : x_arg; 31025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xhp = histptr - (m - 1); 31035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((xhp < history) || !(cp = *xhp)) { 31045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 31055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 31065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 31075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_set_mark(0); 310903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if ((x_arg = last_arg) == -1) { 311003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* x_arg_defaulted */ 311103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 31125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = &cp[strlen(cp) - 1]; 31135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 31145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space after the last word 31155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && is_cfs(*rcp)) 31175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 31185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && !is_cfs(*rcp)) 31195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 31205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_cfs(*rcp)) 31215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(rcp); 31235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 312403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* not x_arg_defaulted */ 31255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char ch; 31265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = cp; 31285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 31295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space at start of line 31305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 31325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 313303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (x_arg-- > 0) { 31345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 31355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 31375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = rcp; 31405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 31415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = *rcp; 31435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = '\0'; 31445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(cp); 31455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = ch; 31465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = m + 1; 31485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 31495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 31525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Uppercase N(1) words */ 31535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_upper(int c MKSH_A_UNUSED) 31555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('U')); 31575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Lowercase N(1) words */ 31605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_lower(int c MKSH_A_UNUSED) 31625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('L')); 31645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3166c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* Titlecase N(1) words */ 31675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_capitalise(int c MKSH_A_UNUSED) 31695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('C')); 31715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 317303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 317403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 31755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_fold_case - convert word to UPPER/lower/Capital case 31765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 31775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 3178c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * This function is used to implement M-U/M-u, M-L/M-l, M-C/M-c 3179c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * to UPPER CASE, lower case or Capitalise Words. 31805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 31815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 31825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 31835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_case(int c) 31865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 31885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 31905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 31915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 31925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 31945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 31955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * first skip over any white-space 31965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 31985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 31995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 32005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * do the first char on its own since it may be 32015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a different action than for the rest. 32025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp != xep) { 320403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (c == 'L') 320503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* lowercase */ 32065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 320703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra else 320803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* uppercase, capitalise */ 32095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 32105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 32115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 32135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * now for the rest of the word 32145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) { 321603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (c == 'U') 321703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* uppercase */ 32185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 321903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra else 322003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* lowercase, capitalise */ 32215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 32225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 32235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 32265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 32275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 32285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 32295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 32305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 323103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 323203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 32335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp - last visible char 32345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * SYNOPSIS: 32365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp() 32375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 32395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function returns a pointer to that char in the 32405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * edit buffer that will be the last displayed on the 32415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * screen. The sequence: 32425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp = x_lastcp(); 32445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * while (cp > xcp) 32455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_bs3(&cp); 32465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Will position the cursor correctly on the screen. 32485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 32505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp or NULL 32515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 32535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_lastcp(void) 32545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 32555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!xlp_valid) { 32565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i = 0, j; 32575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xlp2; 32585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp; 32605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (xlp < xep) { 32615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(xlp, &xlp2); 32625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i + j) > x_displen) 32635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 32645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i += j; 32655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xlp2; 32665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 32695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (xlp); 32705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 32715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 327203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic void 32735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mode(bool onoff) 32745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 32755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static bool x_cur_mode; 32765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_cur_mode == onoff) 327803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return; 32795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_cur_mode = onoff; 32805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (onoff) { 328203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_mkraw(tty_fd, NULL, false); 32835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 328403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.erase = tty_state.c_cc[VERASE]; 328503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.kill = tty_state.c_cc[VKILL]; 328603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.intr = tty_state.c_cc[VINTR]; 328703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.quit = tty_state.c_cc[VQUIT]; 328803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.eof = tty_state.c_cc[VEOF]; 32895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef VWERASE 329003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.werase = tty_state.c_cc[VWERASE]; 32915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 32925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef _POSIX_VDISABLE 32945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Convert unset values to internal 'unset' value */ 32955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase == _POSIX_VDISABLE) 32965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.erase = -1; 32975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill == _POSIX_VDISABLE) 32985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.kill = -1; 32995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr == _POSIX_VDISABLE) 33005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.intr = -1; 33015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit == _POSIX_VDISABLE) 33025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.quit = -1; 33035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.eof == _POSIX_VDISABLE) 33045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.eof = -1; 33055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase == _POSIX_VDISABLE) 33065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.werase = -1; 33075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 33085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase >= 0) { 33105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.erase, XFUNC_del_back); 33115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(1, edchars.erase, XFUNC_del_bword); 33125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 33135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill >= 0) 33145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.kill, XFUNC_del_line); 33155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase >= 0) 33165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.werase, XFUNC_del_bword); 33175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr >= 0) 33185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.intr, XFUNC_abort); 33195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit >= 0) 33205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.quit, XFUNC_noop); 33215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 3322c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser mksh_tcset(tty_fd, &tty_state); 33235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 33245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 33265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ vi editing mode +++ */ 33275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Ctrl(c) (c&0x1f) 33295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct edstate { 33315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cbuf; 333203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t winleft; 333303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t cbufsize; 333403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t linelen; 333503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t cursor; 33365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 33375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_hook(int); 33395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int nextstate(int); 33405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_insert(int); 33415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_cmd(int, const char *); 33425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int domove(int, const char *, int); 33435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int redo_insert(int); 33445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void yank_range(int, int); 33455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int bracktype(int); 33465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void save_cbuf(void); 33475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_cbuf(void); 334803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic int putbuf(const char *, ssize_t, int); 33495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void del_range(int, int); 33505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int findch(int, int, int, int); 33515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int forwword(int); 33525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int backword(int); 33535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int endword(int); 33545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Forwword(int); 33555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Backword(int); 33565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Endword(int); 33575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int grabhist(int, int); 3358c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic int grabsearch(int, int, int, const char *); 335903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic void redraw_line(bool); 33605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void refresh(int); 33615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int outofwin(void); 33625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void rewindow(void); 33635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int newcol(int, int); 33645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void display(char *, char *, int); 33655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void ed_mov_opt(int, char *); 33665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int expand_word(int); 33675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int complete_word(int, int); 33685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int print_expansions(struct edstate *, int); 33695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define char_len(c) ((c) < ' ' || (c) == 0x7F ? 2 : 1) 33705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_vi_zotc(int); 33715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_error(void); 33725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_macro_reset(void); 33735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_vi_putbuf(const char *, size_t); 33745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 337503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vC 0x01 /* a valid command that isn't a vM, vE, vU */ 337603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vM 0x02 /* movement command (h, l, etc.) */ 337703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vE 0x04 /* extended command (c, d, y) */ 337803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vX 0x08 /* long command (@, f, F, t, T, etc.) */ 337903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vU 0x10 /* an UN-undoable command (that isn't a vM) */ 338003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vB 0x20 /* bad command (^@) */ 338103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vZ 0x40 /* repeat count defaults to 0 (not 1) */ 338203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vS 0x80 /* search (/, ?) */ 338303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 338403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_bad(c) (classify[(c)&0x7f]&vB) 338503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_cmd(c) (classify[(c)&0x7f]&(vM|vE|vC|vU)) 338603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_move(c) (classify[(c)&0x7f]&vM) 338703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_extend(c) (classify[(c)&0x7f]&vE) 338803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_long(c) (classify[(c)&0x7f]&vX) 338903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_undoable(c) (!(classify[(c)&0x7f]&vU)) 339003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_srch(c) (classify[(c)&0x7f]&vS) 339103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_zerocount(c) (classify[(c)&0x7f]&vZ) 33925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const unsigned char classify[128] = { 33945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 1 2 3 4 5 6 7 */ 33955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 ^@ ^A ^B ^C ^D ^E ^F ^G */ 339603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vB, 0, 0, 0, 0, vC|vU, vC|vZ, 0, 33975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1 ^H ^I ^J ^K ^L ^M ^N ^O */ 339803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, vC|vZ, 0, 0, vC|vU, 0, vC, 0, 33995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 2 ^P ^Q ^R ^S ^T ^U ^V ^W */ 340003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vC|vU, 0, 0, 0, vC, 0, 34015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3 ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */ 340203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, 0, vC|vZ, 0, 0, 0, 0, 34035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 4 <space> ! " # $ % & ' */ 340403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, 0, 0, vC, vM, vM, 0, 0, 34055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5 ( ) * + , - . / */ 340603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, 0, vC, vC, vM, vC, 0, vC|vS, 34075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6 0 1 2 3 4 5 6 7 */ 340803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, 0, 0, 0, 0, 0, 0, 0, 34095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7 8 9 : ; < = > ? */ 341003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, 0, 0, vM, 0, vC, 0, vC|vS, 34115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8 @ A B C D E F G */ 341203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC|vX, vC, vM, vC, vC, vM, vM|vX, vC|vU|vZ, 34135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9 H I J K L M N O */ 341403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, vC, 0, 0, 0, 0, vC|vU, 0, 34155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* A P Q R S T U V W */ 341603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vC, vC, vM|vX, vC, 0, vM, 34175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* B X Y Z [ \ ] ^ _ */ 341803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, vC|vU, 0, 0, vC|vZ, 0, vM, vC|vZ, 34195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* C ` a b c d e f g */ 342003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, vC, vM, vE, vE, vM, vM|vX, vC|vZ, 34215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* D h i j k l m n o */ 342203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, vC, vC|vU, vC|vU, vM, 0, vC|vU, 0, 34235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* E p q r s t u v w */ 342403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vX, vC, vM|vX, vC|vU, vC|vU|vZ, vM, 34255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* F x y z { | } ~ ^? */ 342603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, vE|vU, 0, 0, vM|vZ, 0, vC, 0 34275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 34285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAXVICMD 3 34305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SRCHLEN 40 34315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INSERT 1 34335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REPLACE 2 34345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VNORMAL 0 /* command, insert or replace mode */ 34365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG1 1 /* digit prefix (first, eg, 5l) */ 34375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VEXTCMD 2 /* cmd + movement (eg, cl) */ 34385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG2 3 /* digit prefix (second, eg, 2c3l) */ 34395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VXCH 4 /* f, F, t, T, @ */ 34405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VFAIL 5 /* bad command */ 34415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VCMD 6 /* single char command (eg, X) */ 34425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VREDO 7 /* . */ 34435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VLIT 8 /* ^V */ 34445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VSEARCH 9 /* /, ? */ 34455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VVERSION 10 /* <ESC> ^V */ 34465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char undocbuf[LINE]; 34485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *save_edstate(struct edstate *old); 34505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_edstate(struct edstate *old, struct edstate *news); 34515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void free_edstate(struct edstate *old); 34525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate ebuf; 34545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate undobuf = { undocbuf, 0, LINE, 0, 0 }; 34555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *es; /* current editor state */ 34575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *undo; 34585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char ibuf[LINE]; /* input buffer */ 34605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int first_insert; /* set when starting in insert mode */ 34615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int saved_inslen; /* saved inslen for first insert */ 34625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int inslen; /* length of input buffer */ 34635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int srchlen; /* length of current search pattern */ 34645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char ybuf[LINE]; /* yank buffer */ 34655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int yanklen; /* length of yank buffer */ 34665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavecmd = ' '; /* last find command */ 34675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavech; /* character to find */ 34685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char lastcmd[MAXVICMD]; /* last non-move command */ 34695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastac; /* argcnt for lastcmd */ 34705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastsearch = ' '; /* last search command */ 34715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char srchpat[SRCHLEN]; /* last search pattern */ 34725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int insert; /* non-zero in insert mode */ 34735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hnum; /* position in history */ 34745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int ohnum; /* history line copied (after mod) */ 34755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hlast; /* 1 past last position in history */ 34765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int state; 34775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 347803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 347903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Information for keeping track of macros that are being expanded. 34805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The format of buf is the alias contents followed by a NUL byte followed 34815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * by the name (letter) of the alias. The end of the buffer is marked by 34825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a double NUL. The name of the alias is stored so recursive macros can 34835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be detected. 34845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 34855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct macro_state { 34865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *p; /* current position in buf */ 34875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf; /* pointer to macro(s) being expanded */ 348803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t len; /* how much data in buffer */ 34895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 34905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct macro_state macro; 34915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 349203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* last input was expanded */ 349303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic enum expand_mode { 349403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra NONE = 0, EXPAND, COMPLETE, PRINT 349503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} expanded; 34965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 34985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi(char *buf, size_t len) 34995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 35005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 35015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 35035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum = hlast = histnum(-1) + 1; 35045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 35055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = inslen; 35065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru first_insert = 1; 35075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 35085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 35095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &ebuf; 35115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf = buf; 35125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = &undobuf; 35135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->cbufsize = es->cbufsize = len > LINE ? LINE : len; 35145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = undo->linelen = 0; 35165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = undo->cursor = 0; 35175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->winleft = undo->winleft = 0; 35185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = promptlen(prompt); 35205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_trunc = (cur_col / x_cols) * x_cols; 35215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col -= prompt_trunc; 35225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, 0); 3524c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((mksh_uari_t)cur_col > (mksh_uari_t)x_cols - 3 - MIN_EDIT_SPACE) { 3525c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser prompt_redraw = false; 3526c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cur_col = 0; 35275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 35285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 3529c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser prompt_redraw = true; 35305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pwidth = cur_col; 35315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!wbuf_len || wbuf_len != x_cols - 3) { 35335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf_len = x_cols - 3; 35345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf[0] = aresize(wbuf[0], wbuf_len, APERM); 35355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf[1] = aresize(wbuf[1], wbuf_len, APERM); 35365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 353703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (wbuf_len) { 353803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[0], ' ', wbuf_len); 353903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[1], ' ', wbuf_len); 354003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 35415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru winwidth = x_cols - pwidth - 3; 35425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 0; 35435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 35445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = 1; 35455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = 0; 35465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 2; 35485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 354903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 35505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 35515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = *macro.p++; 35525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* end of current macro? */ 35535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!c) { 35545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more macros left to finish? */ 35555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*macro.p++) 35565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 35575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* must be the end of all the macros */ 35585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 35595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 35605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 35625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 35635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 35655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state != VLIT) { 35675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == edchars.intr || c == edchars.quit) { 35685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* pretend we got an interrupt */ 35695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(c); 35705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(c == edchars.intr ? SIGINT : SIGQUIT); 35725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 35735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 35745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c == edchars.eof && state != VVERSION) { 35755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) { 35765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(edchars.eof); 35775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = -1; 35785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 35815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (vi_hook(c)) 35845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 35895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 35905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1 || (ssize_t)len <= es->linelen) 35935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 35945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cbuf != buf) 35965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(buf, es->cbuf, es->linelen); 35975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[es->linelen++] = '\n'; 35995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (es->linelen); 36015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 36025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 36045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_hook(int ch) 36055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 36065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char curcmd[MAXVICMD], locpat[SRCHLEN]; 36075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static int cmdlen, argc1, argc2; 36085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 36105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VNORMAL: 36125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 36135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('v')) { 36145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VLIT; 36155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = '^'; 36165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_insert(ch)) { 36185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 36195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 36235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VLIT) { 36245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 36255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 36275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 0); 36285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 36305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n') 36345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmdlen = 0; 36365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = 0; 36375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 36385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = ch - '0'; 36395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG1; 36405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 36425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 36435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VSEARCH) { 36445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 36455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 36465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 36475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '/') { 36485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf("/", 1, 0) != 0) 36495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 36505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (putbuf("?", 1, 0) != 0) 36515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 36525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VVERSION) { 36555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 36565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 36575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 36585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf(KSH_VERSION, 36595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlen(KSH_VERSION), 0); 36605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VLIT: 36675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_bad(ch)) { 36685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + 1); 36695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 36715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 36725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(1); 36735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VVERSION: 36775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 36785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG1: 36835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 36845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc1 * 10 + ch - '0'; 36855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 36865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 36875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 36885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VEXTCMD: 36925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = 0; 36935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 36945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = ch - '0'; 36955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG2; 36965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 36995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 37005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 37025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 37035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 37055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG2: 37095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 37105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = argc2 * 10 + ch - '0'; 37115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 == 0) 37135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc2; 37145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 *= argc2; 37165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 37175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 37185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 37205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 37215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 37235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VXCH: 37275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('[')) 37285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 37315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VSEARCH: 37365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n' /*|| ch == Ctrl('[')*/ ) { 37375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 37385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Repeat last search? */ 37395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == 0) { 37405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!srchpat[0]) { 37415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen] = '\0'; 37485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(srchpat, locpat, srchlen + 1); 37495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.erase || ch == Ctrl('h')) { 37525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen != 0) { 37535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen--; 37545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[srchlen]); 37555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 37565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 37605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.kill) { 37635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 37645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 1; 37655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 1; 37665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.werase) { 37695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, n = srchlen; 37705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate new_es, *save_es; 37715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cursor = n; 37735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cbuf = locpat; 37745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_es = es; 37765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &new_es; 37775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = backword(1); 37785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = save_es; 37795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = srchlen; --i >= n; ) 37815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[i]); 37825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = n; 37835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 37845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == SRCHLEN - 1) 37885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen++] = ch; 37915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 3792c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((size_t)es->linelen + 2 > 3793c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (size_t)es->cbufsize) 37945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = '^'; 37965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch ^ '@'; 37975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize) 37995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch; 38015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 38035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 38065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 38115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VCMD: 38125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(argc1, curcmd)) { 38145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 38155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 38195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) 38205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 38215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 0); 38225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 38245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 2: 38275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* back from a 'v' command - don't redraw the screen */ 38285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VREDO: 38335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 != 0) 38355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argc1; 38365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(lastac, lastcmd)) { 38375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 38385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 38425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 38435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 38445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') { 38455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(1) != 0) 38465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 38485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(lastac) != 0) 38495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 38555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 2: 38585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* back from a 'v' command - can't happen */ 38595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VFAIL: 38645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 38695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 38705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 38725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunextstate(int ch) 38735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 38745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_extend(ch)) 38755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VEXTCMD); 38765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_srch(ch)) 38775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VSEARCH); 38785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_long(ch)) 38795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VXCH); 38805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == '.') 38815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VREDO); 38825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == Ctrl('v')) 38835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VVERSION); 38845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_cmd(ch)) 38855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VCMD); 38865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 38875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VFAIL); 38885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 38895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 38915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_insert(int ch) 38925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 38935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcursor; 38945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.erase || ch == Ctrl('h')) { 38965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE) { 38975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == undo->cursor) { 38985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 39025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 39035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 39045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor >= undo->linelen) 39055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 39065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor] = undo->cbuf[es->cursor]; 39085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 39095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == 0) 39105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 39125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 39135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 39145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 39155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], &es->cbuf[es->cursor + 1], 39165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor + 1); 39175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.kill) { 39225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 39235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 39245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, &es->cbuf[es->cursor], 39255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 39265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor; 39275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 39285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.werase) { 39335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 39345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcursor = backword(1); 39355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[tcursor], &es->cbuf[es->cursor], 39365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 39375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor - tcursor; 39385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen < es->cursor - tcursor) 39395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 39405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen -= es->cursor - tcursor; 39425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = tcursor; 39435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 394703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 394803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If any chars are entered before escape, trash the saved insert 39495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * buffer (if user inserts & deletes char, ibuf gets trashed and 39505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we don't want to use it) 39515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 39525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert && ch != Ctrl('[')) 39535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = 0; 39545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 39555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\0': 39565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 39595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 39605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 39615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('['): 39635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert) { 39655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru first_insert = 0; 39665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen == 0) { 39675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = saved_inslen; 39685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 39695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] = 'a'; 39715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 1; 39725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 39745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') 39755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 39765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(lastac - 1)); 39785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* { Begin nonstandard vi commands */ 39805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('x'): 39815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(0); 39825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('f'): 39855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 39865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('e'): 39895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 0); 39905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('i'): 39935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (Flag(FVITABCOMPLETE)) { 39945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 39955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 39985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* End nonstandard vi commands } */ 39995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 40015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize - 1) 40025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ibuf[inslen++] = ch; 40045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == INSERT) { 40055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + 1], &es->cbuf[es->cursor], 40065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 40075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 40085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 40105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE && es->cursor > es->linelen) 40115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 40125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 40135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 40155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 40165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 40185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_cmd(int argcnt, const char *cmd) 40195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 40205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 40215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, c1, c2, c3 = 0; 40225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int any; 40235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *t; 40245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt == 0 && !is_zerocount(*cmd)) 40265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 40275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_move(*cmd)) { 40295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cur = domove(argcnt, cmd, 0)) >= 0) { 40305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->linelen && cur != 0) 40315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur--; 40325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = cur; 40335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 40345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 40365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Don't save state in middle of macro.. */ 40375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_undoable(*cmd) && !macro.p) { 40385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->winleft = es->winleft; 40395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(undo->cbuf, es->cbuf, es->linelen); 40405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->linelen = es->linelen; 40415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->cursor = es->cursor; 40425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argcnt; 40435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(lastcmd, cmd, MAXVICMD); 40445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 40465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('l'): 40485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('r'): 404903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(true); 40505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '@': 40535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 40545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char alias[] = "_\0"; 40555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *ap; 405603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t olen, nlen; 40575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *nbuf; 40585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* lookup letter in alias list... */ 40605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru alias[1] = cmd[1]; 40615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ap = ktsearch(&aliases, alias, hash(alias)); 40625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!cmd[1] || !ap || !(ap->flag & ISSET)) 40635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* check if this is a recursive call... */ 40655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((p = (char *)macro.p)) 40665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((p = strnul(p)) && p[1]) 40675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++p == cmd[1]) 40685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* insert alias into macro buffer */ 40705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = strlen(ap->val.s) + 1; 40715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = !macro.p ? 2 : 40725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len - (macro.p - macro.buf); 407303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 407403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * at this point, it's fairly reasonable that 407503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * nlen + olen + 2 doesn't overflow 407603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 40775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf = alloc(nlen + 1 + olen, APERM); 40785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf, ap->val.s, nlen); 40795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = cmd[1]; 40805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 40815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf + nlen, macro.p, olen); 40825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(macro.buf, APERM); 40835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen += olen; 40845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 40855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 40865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 40875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.p = macro.buf = (unsigned char *)nbuf; 40895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len = nlen; 40905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'a': 40945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 40975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 40985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 40995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'A': 41025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(0, 0); 41055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 41065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'S': 41105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 41115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 41125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'Y': 41185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmd = "y$"; 41195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhhhhh... */ 41205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'c': 41215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'd': 41225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'y': 41235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == cmd[1]) { 41245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = *cmd == 'c' ? domove(1, "^", 1) : 0; 41255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->linelen; 41265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (!is_move(cmd[1])) 41275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 41295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ncursor = domove(argcnt, &cmd[1], 1)) < 0) 41305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c' && 41325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cmd[1] == 'w' || cmd[1] == 'W') && 41335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[es->cursor])) { 41345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 41355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --ncursor; 41365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (ksh_isspace(es->cbuf[ncursor])); 41375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 41385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->cursor) { 41405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = es->cursor; 41415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = ncursor; 41425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 41435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = ncursor; 41445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->cursor; 41455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == '%') 41465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2++; 41475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'c' && c1 != c2) 41505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(c1, c2); 41515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'y') { 41525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(c1, c2); 41535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = c1; 41545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c') { 41565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'p': 41635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 41665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 41675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (putbuf(ybuf, yanklen, 0) == 0 && --argcnt > 0) 41685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 41695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 41705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 41715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 41725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'P': 41765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 0; 41795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (putbuf(ybuf, yanklen, 0) == 0 && --argcnt > 0) 41805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 1; 41815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (any && es->cursor != 0) 41825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 41835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 41845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 41885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 41915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 41955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->linelen); 41965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 41975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 41985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 41995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'g': 42025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 42035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast; 42045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 42055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'G': 42065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 42075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 42085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 42095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast - (source->line - argcnt); 42105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, argcnt - 1) < 0) 42115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = argcnt - 1; 42155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'i': 42195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'I': 42255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 42285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'j': 42325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '+': 42335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('n'): 42345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum + argcnt) < 0) 42355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum += argcnt; 42395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'k': 42435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '-': 42445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('p'): 42455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum - argcnt) < 0) 42465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum -= argcnt; 42505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'r': 42545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 42555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == 0) 42595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 42605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n; 42625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 42645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (n = 0; n < argcnt; ++n) 42665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor + n] = cmd[1]; 42675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += n - 1; 42685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'R': 42725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = REPLACE; 42755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 's': 42785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 42795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 42835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 42845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 42855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'v': 42895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) { 42905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 42915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 42935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen] = '\0'; 42945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, es->cbuf, true, 42955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru true); 42965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 42975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = source->line + 1 - 42985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (hlast - hnum); 42995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) 43015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(es->cbuf, es->cbufsize, "%s %d", 43025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 43035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt); 43045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 43055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(es->cbuf, 43065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 43075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbufsize); 43085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = strlen(es->cbuf); 43095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 43105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'x': 43125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 43135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 43175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 43185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->cursor + argcnt); 43195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 43205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'X': 43235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) { 43245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < argcnt) 43275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->cursor; 43285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor - argcnt, es->cursor); 43295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor - argcnt, es->cursor); 43305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor -= argcnt; 43315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 43325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'u': 43365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = es; 43375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = undo; 43385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = t; 43395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'U': 43425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) 43435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, ohnum) < 0) 43455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 43475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = ohnum; 43485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '?': 43515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hnum == hlast) 43525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = -1; 43535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhh */ 43545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '/': 43555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c3 = 1; 43565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 43575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastsearch = *cmd; 43585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 43595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'n': 43605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'N': 43615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == ' ') 43625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == '?') 43645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 1; 43655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 43665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 0; 43675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'N') 43685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = !c1; 43695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c2 = grabsearch(modified, hnum, 43705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1, srchpat)) < 0) { 43715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c3) { 43725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 43735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 43745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 43775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 43785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = c2; 43795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum; 43805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '_': 43835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 4384c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser bool inspace; 43855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *sp; 43865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (histnum(-1) < 0) 43885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = *histpos(); 43905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define issp(c) (ksh_isspace(c) || (c) == '\n') 43915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) { 43925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 43935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 43945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && --argcnt) { 43955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) 43965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 43975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 43985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 43995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*p) 44015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 44035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 44045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 4405c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = false; 44065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p) { 44075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (issp(*p)) 4408c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = true; 44095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (inspace) { 4410c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = false; 44115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 44125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = sp; 44165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != es->linelen) 44205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 44215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) { 44225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt++; 44235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4425c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (putbuf(" ", 1, 0) != 0 || 4426c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser putbuf(sp, argcnt, 0) != 0) { 44275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 44285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 44295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 44325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 44365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 44375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p; 44385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 44395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 44415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < argcnt; i++) { 44435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = &es->cbuf[es->cursor]; 44445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_islower(*p)) { 44455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_toupper(*p); 44485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ksh_isupper(*p)) { 44495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_tolower(*p); 44525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->linelen - 1) 44545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 44555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '#': 44605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 44615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(es->cbuf, es->cbufsize, 44625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &es->linelen); 44635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret >= 0) 44645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 44655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ret); 44665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 446803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 446903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '=': 447003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 447103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('e'): 44725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 1); 44735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 447603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 447703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('i'): 44785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVITABCOMPLETE)) 44795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 44815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 448303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* some annoying AT&T kshs */ 448403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('['): 44855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVIESCCOMPLETE)) 44865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 448703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 448803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '\\': 448903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 449003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('f'): 44915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 44925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 449503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 449603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '*': 449703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 449803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('x'): 44995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(1); 45005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == 0 && es->cursor != 0 && es->cursor >= es->linelen) 45035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 45045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 45065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 45095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudomove(int argcnt, const char *cmd, int sub) 45105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int bcount, i = 0, t; 45125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor = 0; 45135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 45155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'b': 45165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 45175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = backword(argcnt); 45195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'B': 45225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 45235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Backword(argcnt); 45255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'e': 45285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = endword(argcnt); 45315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 45325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 45335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'E': 45365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Endword(argcnt); 45395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 45405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 45415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'f': 45445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'F': 45455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 't': 45465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'T': 45475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavecmd = *cmd; 45485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavech = cmd[1]; 45495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* drop through */ 45505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ',': 45525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 45535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fsavecmd == ' ') 45545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = fsavecmd == 'f' || fsavecmd == 'F'; 45565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = fsavecmd > 'a'; 45575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == ',') 45585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = !t; 45595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ncursor = findch(fsavech, argcnt, t, i)) < 0) 45605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && t) 45625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 45635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'h': 45665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('h'): 45675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 45685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor - argcnt; 45705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < 0) 45715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 45725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ' ': 45755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'l': 45765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) { 45795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor + argcnt; 45805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 45815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 45825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'w': 45865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = forwword(argcnt); 45895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'W': 45925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Forwword(argcnt); 45955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '0': 45985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 45995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '^': 46025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && 46045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 46055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '|': 46095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = argcnt; 46105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 46115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 46125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor) 46135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 46145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '$': 46175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 46185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 46195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 46205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '%': 46245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 46255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && 46265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (i = bracktype(es->cbuf[ncursor])) == 0) 46275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor == es->linelen) 46295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount = 1; 46315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 46325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i > 0) { 46335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor >= es->linelen) 46345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 46365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 46375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = bracktype(es->cbuf[ncursor]); 46405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (t == i) 46415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount++; 46425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (t == -i) 46435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount--; 46445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (bcount != 0); 46455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && i > 0) 46465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 46505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 46535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruredo_insert(int count) 46575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (count-- > 0) 46595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf(ibuf, inslen, insert == REPLACE) != 0) 46605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) 46625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 46635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = 0; 46645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 46655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 46685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruyank_range(int a, int b) 46695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yanklen = b - a; 46715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (yanklen != 0) 46725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(ybuf, &es->cbuf[a], yanklen); 46735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubracktype(int ch) 46775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 46795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '(': 46815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 46825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '[': 46845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 46855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '{': 46875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (3); 46885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ')': 46905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ']': 46935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-2); 46945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '}': 46965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-3); 46975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 46995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 47005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 47045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Non user interface editor routines below here 47055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 47065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_cbuf(void) 47095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(holdbuf, es->cbuf, es->linelen); 47115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = es->linelen; 47125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdbuf[holdlen] = '\0'; 47135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_cbuf(void) 47175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 47195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = holdlen; 47205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, holdbuf, holdlen); 47215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return a new edstate */ 47245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate * 47255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_edstate(struct edstate *old) 47265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *news; 47285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news = alloc(sizeof(struct edstate), APERM); 47305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cbuf = alloc(old->cbufsize, APERM); 47315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 47325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cbufsize = old->cbufsize; 47335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 47345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 47355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 47365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 47375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_edstate(struct edstate *news, struct edstate *old) 47415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 47435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 47445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 47455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 47465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(old); 47475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querufree_edstate(struct edstate *old) 47515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(old->cbuf, APERM); 47535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(old, APERM); 47545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 47575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * this is used for calling x_escape() in complete_word() 47585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 47595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_putbuf(const char *s, size_t len) 47615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (putbuf(s, len, 0)); 47635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 476603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraputbuf(const char *buf, ssize_t len, int repl) 47675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0) 47695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 47705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (repl) { 47715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len >= es->cbufsize) 47725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 47735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len > es->linelen) 47745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cursor + len; 47755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 47765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen + len >= es->cbufsize) 47775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 47785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + len], &es->cbuf[es->cursor], 47795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 47805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen += len; 47815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], buf, len); 47835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += len; 47845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 47855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudel_range(int a, int b) 47895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != b) 47915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[a], &es->cbuf[b], es->linelen - b); 47925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= b - a; 47935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querufindch(int ch, int cnt, int forw, int incl) 47975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 48015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 48045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 48055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) { 48065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor == es->linelen) 48075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 48095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 48105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (es->cbuf[ncursor] != ch); 48135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!incl) { 48155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) 48165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 48175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruforwword(int argcnt) 48255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 48305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 48315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isalnux(es->cbuf[ncursor]) && 48325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (!ksh_isspace(es->cbuf[ncursor])) 48355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isalnux(es->cbuf[ncursor]) && 48365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor]) && 48375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 48405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubackword(int argcnt) 48485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 48535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor > 0 && ksh_isspace(es->cbuf[ncursor])) 48545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > 0) { 48565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 48575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 48585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 48595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 48625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 48635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 48645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruendword(int argcnt) 48735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 48785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 48795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 48805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 48825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 48835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 48845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 48855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 48885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 48895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 48905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 48915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 48925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruForwword(int argcnt) 48995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 49045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isspace(es->cbuf[ncursor]) && 49055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 49065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 49085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 49095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruBackword(int argcnt) 49165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 49215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && ksh_isspace(es->cbuf[ncursor])) 49225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor >= 0 && !ksh_isspace(es->cbuf[ncursor])) 49245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 49255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEndword(int argcnt) 49325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && argcnt--) { 49375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 49385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 49395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 49415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 49425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 49435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 49455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querugrabhist(int save, int n) 49525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 49545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n < 0 || n > hlast) 49565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 49575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n == hlast) { 49585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 49595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 49605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 49615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)histnum(n); 49635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hptr = *histpos()) == NULL) { 496403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra internal_warningf("%s: %s", "grabhist", "bad history array"); 49655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 49665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 49685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 49695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 49705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 49715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 49725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 49735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 49745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 49755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 4978c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasergrabsearch(int save, int start, int fwd, const char *pat) 49795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 49815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int hist; 49825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int anchored; 49835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((start == 0 && fwd == 0) || (start >= hlast - 1 && fwd == 1)) 49855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 49865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fwd) 49875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start++; 49885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 49895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start--; 49905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru anchored = *pat == '^' ? (++pat, 1) : 0; 49915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hist = findhist(start, fwd, pat, anchored)) < 0) { 4992c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* (start != 0 && fwd && match(holdbuf, pat) >= 0) */ 49935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (start != 0 && fwd && strcmp(holdbuf, pat) >= 0) { 49945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 49955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 49965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 49975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 49985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 50005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 50015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histnum(hist); 50025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hptr = *histpos(); 50035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 50045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 50055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 50065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 50075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (hist); 50085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 501103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraredraw_line(bool newl) 50125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 501303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (wbuf_len) 501403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[win], ' ', wbuf_len); 50155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (newl) { 50165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 50175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 50185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 50205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 50215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = pwidth; 50225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 50235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 50265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurefresh(int leftside) 50275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (leftside < 0) 50295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru leftside = lastref; 50305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 50315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = leftside; 50325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (outofwin()) 50335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rewindow(); 50345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru display(wbuf[1 - win], wbuf[win], leftside); 50355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 1 - win; 50365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 50395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruoutofwin(void) 50405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col; 50425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->winleft) 50445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 50455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 50465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 50475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur < es->cursor) 50485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = newcol((unsigned char)es->cbuf[cur++], col); 50495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col >= winwidth) 50505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 50515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 50525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 50555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurewindow(void) 50565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcur, tcol; 50585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur1, holdcol1; 50595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur2, holdcol2; 50605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2 = tcur = 0; 50625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2 = tcol = 0; 50635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcur < es->cursor) { 50645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (tcol - holdcol2 > winwidth / 2) { 50655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2; 50665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2; 50675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur2 = tcur; 50685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol2 = tcol; 50695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcol = newcol((unsigned char)es->cbuf[tcur++], tcol); 50715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcol - holdcol1 > winwidth / 2) 50735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = newcol((unsigned char)es->cbuf[holdcur1++], 50745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1); 50755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->winleft = holdcur1; 50765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 50795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunewcol(int ch, int col) 50805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\t') 50825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((col | 7) + 1); 50835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (col + char_len(ch)); 50845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 50875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudisplay(char *wb1, char *wb2, int leftside) 50885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char ch; 50905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *twb1, *twb2, mc; 50915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col, cnt; 50925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncol = 0; 50935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int moreright; 50945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 50965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 50975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright = 0; 50985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 50995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth && cur < es->linelen) { 51005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && leftside) 51015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 51025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ch = es->cbuf[cur]) == '\t') 51035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 51045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 51055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (++col < winwidth && (col & 7) != 0); 51065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (col < winwidth) { 51075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 51085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = '^'; 51095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++col < winwidth) { 51105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch ^ '@'; 51115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 51145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch; 51155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && !leftside) 51195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth - 1; 51205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur++; 51215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor) 51235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 51245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col < winwidth) { 51255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth) { 51265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 51275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 51305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright++; 51315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1 = ' '; 51325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = pwidth; 51345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cnt = winwidth; 51355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 51365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2 = wb2; 51375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 51385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*twb1 != *twb2) { 51395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur_col != col) 51405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(col, wb1); 51415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(*twb1); 51425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col++; 51435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1++; 51455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2++; 51465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->winleft > 0 && moreright) 514903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 515003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * POSIX says to use * for this but that is a globbing 51515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * character and may confuse people; + is more innocuous 51525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 51535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '+'; 51545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (es->winleft > 0) 51555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '<'; 51565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (moreright) 51575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '>'; 51585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 51595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = ' '; 51605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (mc != morec) { 51615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(pwidth + winwidth + 1, wb1); 51625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(mc); 51635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col++; 51645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = mc; 51655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur_col != ncol) 51675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(ncol, wb1); 51685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 51695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 51715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querued_mov_opt(int col, char *wb) 51725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col < cur_col) { 51745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col + 1 < cur_col - col) { 51755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 51765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 51775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 51785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = pwidth; 51795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col++ < col) 51805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 51815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 51825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col-- > col) 51835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\b'); 51845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 51865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wb = &wb[cur_col - pwidth]; 51875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col++ < col) 51885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 51895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = col; 51915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 51925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* replace word with all expansions (ie, expand word*) */ 51955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 51965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruexpand_word(int cmd) 51975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 519903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int rval = 0, nwords, start, end, i; 52005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 52015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous expansion */ 52035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == EXPAND && buf) { 52045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 52055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 52075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 52085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 52105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 52115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 521403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_COMMAND_FILE | XCF_FULLPATH; 521503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, es->cbuf, es->linelen, es->cursor, 521603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 52175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 52185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 52195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 52205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 52235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = EXPAND; 52245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 52255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 522603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 522703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (i < nwords) { 52285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_vi_putbuf) != 0) { 52295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 52305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 52315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++i < nwords && putbuf(" ", 1, 0) != 0) { 52335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 52345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 52355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = buf->cursor - end; 52385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && i > 0) 52395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += i; 52405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 52415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 52425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 52435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 0; 52445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 52455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 52465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 52495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querucomplete_word(int cmd, int count) 52505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 525203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int rval, nwords, start, end, flags; 525303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t match_len; 52545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 52555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *match; 525603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool is_unique; 52575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous completion */ 52595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == COMPLETE && buf) { 52605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(buf, 0); 52615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = PRINT; 52625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 52635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == PRINT && buf) { 52655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 52665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 52685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 52695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 52715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 52725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 527503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 527603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * XCF_FULLPATH for count 'cause the menu printed by 527703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * print_expansions() was done this way. 52785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 527903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra flags = XCF_COMMAND_FILE; 528003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (count) 528103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra flags |= XCF_FULLPATH; 528203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&flags, es->cbuf, es->linelen, es->cursor, 528303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 52845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 52855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 52865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 52875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count) { 52895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 52905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru count--; 52925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count >= nwords) { 52935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 529403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, 529503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra tobool(flags & XCF_IS_COMMAND)); 52965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 529703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(false); 52985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 52995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 53015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Expand the count'th word to its basename 53025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 530303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (flags & XCF_IS_COMMAND) { 53045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count] + 53055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_basename(words[count], NULL); 53065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If more than one possible match, use full path */ 53075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 53085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i != count && 53095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(words[i] + x_basename(words[i], 53105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru NULL), match) == 0) { 53115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 53125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 53135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 53155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 53165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = strlen(match); 53175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = true; 53185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* expanded = PRINT; next call undo */ 53195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 53205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[0]; 53215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = x_longest_prefix(nwords, words); 532203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* next call will list completions */ 532303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra expanded = COMPLETE; 53245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = nwords == 1; 53255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 53285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 53295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 53305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 533103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 533203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * escape all shell-sensitive characters and put the result into 533303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * command buffer 533403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 53355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = x_escape(match, match_len, x_vi_putbuf); 53365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && is_unique) { 533803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 533903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If exact match, don't undo. Allows directory completions 53405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to be used (ie, complete the next portion of the path). 53415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 53425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 53435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 534403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 534503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * append a space if this is a non-directory match 534603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * and not a parameter or homedir substitution 534703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 534803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (match_len > 0 && match[match_len - 1] != '/' && 5349c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser !(flags & XCF_IS_NOSPACE)) 53505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = putbuf(" ", 1, 0); 53515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 53535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 53555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 53565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 535703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* prevent this from being redone... */ 535803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra lastac = 0; 53595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 53605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 53625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 53635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 53655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruprint_expansions(struct edstate *est, int cmd MKSH_A_UNUSED) 53665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 536703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int start, end, nwords, i; 53685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 53695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 537003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_COMMAND_FILE | XCF_FULLPATH; 537103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, est->cbuf, est->linelen, est->cursor, 537203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 53735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 53745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 53755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 53765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 537703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, tobool(i & XCF_IS_COMMAND)); 53785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 537903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(false); 53805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 53815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 53825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Similar to x_zotc(emacs.c), but no tab weirdness */ 53845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 53855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_zotc(int c) 53865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 53875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 53885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('^'); 53895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c ^= '@'; 53905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 53925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 53935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 53955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_error(void) 53965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 53975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Beem out of any macros as soon as an error occurs */ 53985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 53995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(7); 54005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 54015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 54045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_macro_reset(void) 54055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 54065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 54075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(macro.buf, APERM); 54085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset((char *)¯o, 0, sizeof(macro)); 54095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 54105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif /* !MKSH_S_NOVI */ 541203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5413c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* called from main.c */ 541403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid 5415c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_init(void) 541603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra{ 5417c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser int i, j; 541803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5419c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 5420c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Set edchars to -2 to force initial binding, except 5421c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * we need default values for some deficient systems… 5422c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 5423c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.erase = edchars.kill = edchars.intr = edchars.quit = 5424c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.eof = -2; 5425c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ^W */ 5426c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.werase = 027; 542703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5428c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* initialise Emacs command line editing mode */ 5429c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ainit(AEDIT); 5430c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_nextcmd = -1; 5431c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 5432c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab = alloc2(X_NTABS, sizeof(*x_tab), AEDIT); 5433c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5434c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[0][j] = XFUNC_insert; 5435c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 1; i < X_NTABS; i++) 5436c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5437c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[i][j] = XFUNC_error; 5438c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 0; i < (int)NELEM(x_defbindings); i++) 5439c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[x_defbindings[i].xdb_tab][x_defbindings[i].xdb_char] 5440c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser = x_defbindings[i].xdb_func; 5441c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 5442c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_SMALL 5443c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_atab = alloc2(X_NTABS, sizeof(*x_atab), AEDIT); 5444c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 1; i < X_NTABS; i++) 5445c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5446c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_atab[i][j] = NULL; 544703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 5448c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 544903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5450c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef DEBUG_LEAKS 5451c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid 5452c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_done(void) 5453c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 5454c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_tab != NULL) 5455c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afreeall(AEDIT); 545603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} 5457c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 5458c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif /* !MKSH_NO_CMDLINE_EDITING */ 5459