edit.c revision 811a575c0f6a5ef00a921d14c1830ef5ae1bd796
1811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser/* $OpenBSD: edit.c,v 1.38 2013/06/03 15:41:59 tedu 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 31811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.270 2013/08/14 20:26:17 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" */ 69811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic char *holdbufp; /* 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)); 84811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int x_emacs(char *); 855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_init_prompt(void); 865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 87811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int x_vi(char *); 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 113811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserx_read(char *buf) 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)) 120811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser i = x_emacs(buf); 1215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 1225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (Flag(FVI)) 123811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser i = x_vi(buf); 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_displen; 9235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_arg; /* general purpose arg */ 92403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic bool x_arg_defaulted; /* x_arg not explicitly set; defaulted to 1 */ 9255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 926c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic bool xlp_valid; /* lastvis pointer was recalculated */ 9275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char **x_histp; /* history position */ 9295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_nextcmd; /* for newline-and-next */ 930c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char **x_histncp; /* saved x_histp for " */ 9315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xmp; /* mark pointer */ 9325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_last_command; 9335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char (*x_tab)[X_TABSZ]; /* key definition */ 9345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *(*x_atab)[X_TABSZ]; /* macro definitions */ 9365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_bound[(X_TABSZ * X_NTABS + 7) / 8]; 9385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KILLSIZE 20 9395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *killstack[KILLSIZE]; 9405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int killsp, killtp; 9415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_curprefix; 9425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 94303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic char *macroptr; /* bind key macro active? */ 9445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 9465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int winwidth; /* width of window */ 9475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *wbuf[2]; /* window buffers */ 9485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int wbuf_len; /* length of window buffers (x_cols - 3) */ 9495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int win; /* window buffer in use */ 9505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char morec; /* more character at right of window */ 9515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastref; /* argument to last refresh() */ 9525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int holdlen; /* length of holdbuf */ 9535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 954811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int pwidth; /* width of prompt */ 955811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int prompt_trunc; /* how much of prompt to truncate or -1 */ 956811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int x_col; /* current column on line */ 9575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_ins(const char *); 959c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic void x_delete(size_t, bool); 960c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_bword(void); 961c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_fword(bool); 9625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_goto(char *); 963811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic char *x_bs0(char *, char *); 9645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_bs3(char **); 9655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size_str(char *); 9665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size2(char *, char **); 9675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zots(char *); 9685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc2(int); 9695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc3(char **); 9705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_load_hist(char **); 9715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search(char *, int, int); 9725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search_dir(int); 9745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_match(char *, char *); 9765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_redraw(int); 9775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_push(int); 978c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic char *x_mapin(const char *, Area *); 9795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_mapout(int); 9805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_mapout2(int, char **); 9815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_print(int, int); 9825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_adjust(void); 9835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_ungetc(int); 9845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_getc(void); 9855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc2(int); 9865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc3(const char **); 9875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_puts(const char *); 9885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_fold_case(int); 9905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_lastcp(void); 9925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void do_complete(int, Comp_type); 993c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t x_nb2nc(size_t); 9945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int unget_char = -1; 9965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_do_ins(const char *, size_t); 9985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void bind_if_not_bound(int, int, int); 9995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum emacs_funcs { 10015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ENUMS 10025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XFUNC_MAX 10045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_DEFNS 10075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const struct x_ftab x_ftab[] = { 10105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ITEMS 10115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 10125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 0, NULL, 0 } 10135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct x_defbindings const x_defbindings[] = { 10165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('?') }, 10175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('?') }, 10185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_eot_del, 0, CTRL('D') }, 10195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('H') }, 10205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('H') }, 10215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, 'h' }, 10225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_bword, 1, 'b' }, 10235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_fword, 1, 'f' }, 10245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_fword, 1, 'd' }, 10255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 0, CTRL('B') }, 10265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 0, CTRL('F') }, 10275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_forw, 0, CTRL(']') }, 10285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_back, 1, CTRL(']') }, 10295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('M') }, 10305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('J') }, 10315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_of_text, 0, CTRL('_') }, 10325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_abort, 0, CTRL('G') }, 10335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 0, CTRL('P') }, 10345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 0, CTRL('N') }, 10355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_nl_next_com, 0, CTRL('O') }, 10365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist, 0, CTRL('R') }, 10375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_beg_hist, 1, '<' }, 10385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_hist, 1, '>' }, 10395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_goto_hist, 1, 'g' }, 10405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 0, CTRL('E') }, 10415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 0, CTRL('A') }, 10425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_draw_line, 0, CTRL('L') }, 10435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_cls, 1, CTRL('L') }, 10445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta1, 0, CTRL('[') }, 10455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 0, CTRL('X') }, 10465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill, 0, CTRL('K') }, 10475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_yank, 0, CTRL('Y') }, 10485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta_yank, 1, 'y' }, 10495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('^') }, 10505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comment, 1, '#' }, 10515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_transpose, 0, CTRL('T') }, 10525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_complete, 1, CTRL('[') }, 10535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 0, CTRL('I') }, 10545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 1, '=' }, 10555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_enumerate, 1, '?' }, 10565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_expand, 1, '*' }, 10575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_file, 1, CTRL('X') }, 10585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_comm, 2, CTRL('[') }, 10595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_comm, 2, '?' }, 10605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_file, 2, CTRL('Y') }, 10615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_mark, 1, ' ' }, 10625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill_region, 0, CTRL('W') }, 10635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_xchg_point_mark, 2, CTRL('X') }, 10645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('V') }, 10655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_version, 1, CTRL('V') }, 10665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '.' }, 10675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '_' }, 10685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '0' }, 10695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '1' }, 10705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '2' }, 10715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '3' }, 10725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '4' }, 10735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '5' }, 10745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '6' }, 10755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '7' }, 10765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '8' }, 10775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '9' }, 10785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 10795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'U' }, 10805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'u' }, 10815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'L' }, 10825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'l' }, 10835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'C' }, 10845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'c' }, 10855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 108603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 108703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * These for ANSI arrow keys: arguablely shouldn't be here by 10885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * default, but its simpler/faster/smaller than using termcap 10895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * entries. 10905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, '[' }, 10925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, 'O' }, 10935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 2, 'A' }, 10945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 2, 'B' }, 10955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 2, 'C' }, 10965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 2, 'D' }, 10975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 10985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_vt_hack, 2, '1' }, 10995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin | 0x80, 2, '7' }, 11005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 2, 'H' }, 11015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '4' }, 11025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '8' }, 11035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 2, 'F' }, 11045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_char | 0x80, 2, '3' }, 11055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_up | 0x80, 2, '5' }, 11065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_dn | 0x80, 2, '6' }, 11075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more non-standard ones */ 11085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_edit_line, 2, 'e' } 11095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 11105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 11115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1112c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 1113c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_nb2nc(size_t nb) 1114c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 1115c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *cp; 1116c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nc = 0; 1117c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 1118c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (cp = xcp; cp < (xcp + nb); ++nc) 1119c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser cp += utf_ptradj(cp); 1120c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (nc); 1121c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 1122c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 11235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 11245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_modified(void) 11255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) { 11275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 11285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 11295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1131c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 1132c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef MKSH_SMALL 11335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f) 11345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 11355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f & 0x7F) 11365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 11375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 11395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getmbc(char *sbuf) 11405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, pos = 0; 11425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf = (unsigned char *)sbuf; 11435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset(buf, 0, 4); 11455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 11465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 11495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xC2) && (buf[0] < 0xF0)) { 11505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 11515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c & 0xC0) != 0x80) { 11545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 11555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 11565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c; 11585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xE0) && (buf[0] < 0xF0)) { 11605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 11615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 11625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 11635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 11645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (pos); 11675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 11685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 11705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_init_prompt(void) 11715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1172811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser prompt_trunc = pprompt(prompt, 0); 1173811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser pwidth = prompt_trunc % x_cols; 1174811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser prompt_trunc -= pwidth; 1175811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if ((mksh_uari_t)pwidth > ((mksh_uari_t)x_cols - 3 - MIN_EDIT_SPACE)) { 1176811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* force newline after prompt */ 1177811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser prompt_trunc = -1; 1178811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser pwidth = 0; 11795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 11805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 11825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 1184811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserx_emacs(char *buf) 11855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, i; 11875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 11885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1189811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xbp = xbuf = buf; 1190811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xend = buf + LINE; 11915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xcp = xep = buf; 11925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 11935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 11945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 11955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 11965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 11975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = XFUNC_error; 11985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_init_prompt(); 1200811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_displen = (xx_cols = x_cols) - 2 - (x_col = pwidth); 1201811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_adj_done = 0; 1202811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_adj_ok = true; 12035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1204c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = NULL; 12055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_nextcmd >= 0) { 12065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int off = source->line - x_nextcmd; 1207c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (histptr - history >= off) { 12085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr - off); 1209c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = x_histp; 1210c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 12115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_nextcmd = -1; 12125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 1; 121403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 12155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 12165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 12175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 12185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_curprefix == -1 ? XFUNC_insert : 12205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[x_curprefix][c]; 12215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 12225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 12235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 12245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = x_e_getc()) != '~') 12255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(i); 12265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* avoid bind key macro recursion */ 12295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr && f == XFUNC_ins_string) 12305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 12315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 12325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX) && 12345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command != XFUNC_set_arg) { 12355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 123603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 12375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = c | (x_curprefix << 8); 12395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 12405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((*x_ftab[f].xf_func)(i)) { 12415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KSTD: 12425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX)) 12435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = f; 12445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 12455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KEOL: 12465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 12475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 124803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case KINTR: 124903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* special case for interrupt */ 12505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(SIGINT); 12515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 12525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 12535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ad-hoc hack for fixing the cursor position */ 12555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp); 12565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_insert(int c) 12615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 126203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra static int left, pos, save_arg; 12635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char str[4]; 12645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 12665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Should allow tab and control chars. 12675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == 0) { 12695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru invmbs: 12705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 12715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 12725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 12755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (((c & 0xC0) == 0x80) && left) { 12765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos++] = c; 12775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!--left) { 12785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 12795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = save_arg; 12805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 12815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 12825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 12865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_curprefix == -1) { 12875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* flush invalid multibyte */ 12885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 12895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (save_arg--) 12905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 12915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c >= 0xC2) && (c < 0xE0)) 12945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 1; 12955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if ((c >= 0xE0) && (c < 0xF0)) 12965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 2; 12975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (c > 0x7F) 12985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto invmbs; 12995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 13005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 13015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 13025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_arg = x_arg; 13035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pos = 1; 13045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 13055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 13095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 13105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[1] = '\0'; 13115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 13125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 13135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 13175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins_string(int c) 13195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = x_atab[c >> 8][c & 255]; 13215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we no longer need to bother checking if macroptr is 13235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * not NULL but first char is NUL; x_e_getc() does it 13245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 13285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_do_ins(const char *cp, size_t len) 13315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep + len >= xend) { 13335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 13345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 13355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp + len, xcp, xep - xcp + 1); 13375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp, cp, len); 13385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp += len; 13395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep += len; 13405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 13415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 13425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins(const char *s) 13465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 13485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 13495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_do_ins(s, strlen(s)) < 0) 13515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 13525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_zots() may result in a call to x_adjust() 13545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we want xcp to reflect the new position. 13555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 13575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 1358c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = tobool(xcp >= xlp); 13595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(cp); 136003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* has x_adjust() been called? */ 136103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (adj == x_adj_done) { 13625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no */ 13635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 13645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 13655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 13665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xlp == xep - 1) 13685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 1369c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 13705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 13715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_back(int c MKSH_A_UNUSED) 13755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1376c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ssize_t i = 0; 13775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 13795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 13805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 13835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 13845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while ((++i < x_arg) && (xcp != xbuf)); 13855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 13865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_char(int c MKSH_A_UNUSED) 13915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp, *cp2; 1393c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i = 0; 13945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 1396c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (i < (size_t)x_arg) { 13975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 13985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 13995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 14005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 14015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i++; 14025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!i) { 14055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 14065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 14095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Delete nc chars to the right of the cursor (including cursor position) */ 14135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 1414c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_delete(size_t nc, bool push) 14155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1416c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t i, nb, nw; 14175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 14185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nc == 0) 14205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 14215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = 0; 14235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 14245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nc; ++i) { 14255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 14265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int j; 14275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(cp, &cp2); 14295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 14305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 14315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 14325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw += j; 14335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb = cp - xcp; 14355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* nc = i; */ 14365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp != NULL && xmp > xcp) { 14385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp + nb > xmp) 14395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 14405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 14415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp -= nb; 14425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 14445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This lets us yank a word we have deleted. 14455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 14465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (push) 14475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(nb); 14485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep -= nb; 145003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Copies the NUL */ 145103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memmove(xcp, xcp + nb, xep - xcp + 1); 145203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* don't redraw */ 1453c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = false; 14545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 14555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xcp); 14565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 14575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * if we are already filling the line, 145803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * there is no need to ' ', '\b'. 14595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * But if we must, make sure we do the minimum. 14605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 14615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = xx_cols - 2 - x_col) > 0 || xep - xlp == 0) { 14625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = i = (nw < i) ? nw : i; 14635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 14645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 14655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col == xx_cols - 2) { 14665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2((xep > xlp) ? '>' : (xbp > xbuf) ? '<' : ' '); 14675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ++nw; 14685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (nw--) 14705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 14715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*x_goto(xcp);*/ 1473c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 14745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 14755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = x_lastcp(); 14765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 14775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 14785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 14805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 14815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_bword(int c MKSH_A_UNUSED) 14855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(x_bword(), true); 14875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_bword(int c MKSH_A_UNUSED) 14925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bword(); 14945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_fword(int c MKSH_A_UNUSED) 14995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1500c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_fword(true); 15015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_fword(int c MKSH_A_UNUSED) 15065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1507c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_fword(false), true); 15085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1511c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 15125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bword(void) 15135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1514c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nb = 0; 15155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 15165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xbuf) { 15185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 15205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && is_mfs(cp[-1])) { 15235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 15245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 15255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && !is_mfs(cp[-1])) { 15275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 15285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 15295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 1532c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser return (x_nb2nc(nb)); 15335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1535c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic size_t 1536c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_fword(bool move) 15375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1538c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t nc; 1539c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *cp = xcp; 15405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 15425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 15445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 15475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 15485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) 15495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 15505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1551c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser nc = x_nb2nc(cp - xcp); 15525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (move) 15535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 15545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nc); 15555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto(char *cp) 15595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1560811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser cp = cp >= xep ? xep : x_bs0(cp, xbuf); 15615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp < xbp || cp >= utf_skipcols(xbp, x_displen)) { 15625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we are heading off screen */ 15635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = cp; 15645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 156503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else if (cp < xcp) { 156603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* move back */ 15675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp < xcp) 15685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 156903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else if (cp > xcp) { 157003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* move forward */ 15715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 15725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 15735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1576811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic char * 1577811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserx_bs0(char *cp, char *lower_bound) 1578811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser{ 1579811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (UTFMODE) 1580811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while ((!lower_bound || (cp > lower_bound)) && 1581811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser ((*(unsigned char *)cp & 0xC0) == 0x80)) 1582811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser --cp; 1583811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser return (cp); 1584811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser} 1585811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 15865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bs3(char **p) 15885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 15905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1591811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser *p = x_bs0((*p) - 1, NULL); 15925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_size2(*p, NULL); 15935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 15945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 15955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size_str(char *cp) 15995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int size = 0; 16015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) 16025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size += x_size2(cp, &cp); 16035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (size); 16045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size2(char *cp, char **dcp) 16085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c = *(unsigned char *)cp; 16105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) 16125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (utf_widthadj(cp, (const char **)dcp)); 16135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (dcp) 16145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *dcp = cp + 1; 16155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') 161603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Kludge, tabs are always four spaces. */ 161703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return (4); 16185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) 161903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* control unsigned char */ 162003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return (2); 16215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 16225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zots(char *str) 16265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 16285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 16305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*str && str < xlp && adj == x_adj_done) 16315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&str); 16325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc2(int c) 16365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 16385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 16395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 16405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 16415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 16425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 16435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 16445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(c); 16455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 16485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc3(char **cp) 16495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char c = **(unsigned char **)cp; 16515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 16535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 16545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 16555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 16565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 16575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 16585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 16595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 16605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 16615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3((const char **)cp); 16625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_back(int c MKSH_A_UNUSED) 16665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 16685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 16725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 16735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) 16745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 16755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_forw(int c MKSH_A_UNUSED) 16815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *cp2; 16835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xep) { 16855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 16895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 16905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 16915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 16925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 16935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 16955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_forw(int c MKSH_A_UNUSED) 17005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 17025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char tmp[4]; 17035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 17055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 17065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 17105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cp = (cp == xep) ? NULL : strstr(cp + 1, tmp)) == NULL && 17115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cp = strstr(xbuf, tmp)) == NULL) { 17125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 17175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_back(int c MKSH_A_UNUSED) 17225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *p, tmp[4]; 17245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool b; 17255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 17275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; x_arg--; cp = p) 17315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = cp; ; ) { 17325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p-- == xbuf) 17335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = xep; 17345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == cp) { 17355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((tmp[1] && ((p+1) > xep)) || 17395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (tmp[2] && ((p+2) > xep))) 17405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 17415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = true; 17425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*p != tmp[0]) 17435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[1] && p[1] != tmp[1]) 17455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[2] && p[2] != tmp[2]) 17475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 17485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b) 17495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 17505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 17525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_newline(int c MKSH_A_UNUSED) 17575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 17595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 17605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 17615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep++ = '\n'; 17625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 17635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_of_text(int c MKSH_A_UNUSED) 17675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc2(edchars.eof); 17695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 17705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 17715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 17725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 17735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_beg_hist(int c MKSH_A_UNUSED) 17775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 17795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_hist(int c MKSH_A_UNUSED) 17845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr); 17865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_com(int c MKSH_A_UNUSED) 17915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp - x_arg); 17935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_next_com(int c MKSH_A_UNUSED) 17985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp + x_arg); 18005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 180303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 180403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Goto a particular history number obtained from argument. 18055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If no argument is given history 1 is probably not what you 18065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * want so we'll simply go to the oldest one. 18075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 18085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto_hist(int c MKSH_A_UNUSED) 18105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) 18125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 18135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 18145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + x_arg - source->line); 18155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 18195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_load_hist(char **hp) 18205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize; 18225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 18235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hp == histptr + 1) { 1825811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser sp = holdbufp; 18265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 18275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (hp < history || hp > histptr) { 18285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 18295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 18305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sp == NULL) 18325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = *hp; 18335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = hp; 18345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru oldsize = x_size_str(xbuf); 18355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) 1836811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser strlcpy(holdbufp, xbuf, LINE); 18375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, sp, xend - xbuf); 18385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf; 18395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xcp = xbuf + strlen(xbuf); 18405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 18415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep <= x_lastcp()) { 18425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 18435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 18455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 18465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_nl_next_com(int c MKSH_A_UNUSED) 18505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1851c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (!x_histncp || (x_histp != x_histncp && x_histp != histptr + 1)) 1852c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* fresh start of ^O */ 1853c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_histncp = x_histp; 1854c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_nextcmd = source->line - (histptr - x_histncp) + 1; 18555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 18565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_eot_del(int c) 18605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf && x_arg_defaulted) 18625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_end_of_text(c)); 18635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 18645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_del_char(c)); 18655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* reverse incremental history search */ 18685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist(int c) 18705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int offset = -1; /* offset of match in xbuf, else -1 */ 1872c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char pat[80 + 1]; /* pattern buffer */ 18735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = pat; 18745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 18755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = '\0'; 187703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 18785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) { 18795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nI-search: "); 18805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(pat); 18815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 18835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 18845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[0][c]; 18865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == CTRL('[')) { 18875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((f & 0x7F) == XFUNC_meta1) { 18885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 18895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[1][c] & 0x7F; 18915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1 || f == XFUNC_meta2) 18925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_meta1(CTRL('[')); 18935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 18945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 18985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 18995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 19005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '~') 19015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 19025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 19045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_search_hist) 19055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 19065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_del_back) { 19075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) { 19085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 19095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 19105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p > pat) 19125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *--p = '\0'; 19135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) 19145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 19155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 19165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 1, offset); 19175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_insert) { 19195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* add char to pattern */ 19205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* overflow check... */ 1921c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((size_t)(p - pat) >= sizeof(pat) - 1) { 19225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 19235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c, *p = '\0'; 19265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 19275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* already have partial match */ 19285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_match(xbuf, pat); 19295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 19305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + offset + (p - pat) - 19315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*pat == '^')); 19325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 19335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 19365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_abort) { 19375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) 19385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + 1); 19395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 194003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else { 194103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* other command */ 19425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 19435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 19445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 19475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 19485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* search backward from current line */ 19525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search(char *pat, int sameline, int offset) 19545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp; 19565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 19575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (hp = x_histp - (sameline ? 0 : 1); hp >= history; --hp) { 19595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_match(*hp, pat); 19605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i >= 0) { 19615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 19625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 19635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 19645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + i + strlen(pat) - (*pat == '^')); 19655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 19665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 19695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr; 19705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 19715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 19745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search up from current line */ 19755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_up(int c MKSH_A_UNUSED) 19775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(-1)); 19795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search down from current line */ 19825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_dn(int c MKSH_A_UNUSED) 19845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(1)); 19865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search in the indicated direction */ 19895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_dir(int search_dir /* should've been bool */) 19915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp = x_histp + search_dir; 19935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t curs = xcp - xbuf; 19945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (histptr >= hp && hp >= history) { 19965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strncmp(xbuf, *hp, curs) == 0) { 19975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 19985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + curs); 19995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 20005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hp += search_dir; 20025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 20065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return position of first match of pattern in string, else -1 */ 20085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_match(char *str, char *pat) 20105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*pat == '^') { 20125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((strncmp(str, pat + 1, strlen(pat + 1)) == 0) ? 0 : -1); 20135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 20145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *q = strstr(str, pat); 20155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((q == NULL) ? -1 : q - str); 20165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_line(int c MKSH_A_UNUSED) 20215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j; 20235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = 0; 20255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 20265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size_str(xbuf); 20275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbuf; 20285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(i); 20295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp = xep = xbuf; 20305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 20315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 20325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 20335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(j); 20345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 20355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_end(int c MKSH_A_UNUSED) 20405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 20425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_begin(int c MKSH_A_UNUSED) 20475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf); 20495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_draw_line(int c MKSH_A_UNUSED) 20545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 20565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_rebuildline(const char *clrstr) 20615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(clrstr, shl_out); 20635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 20645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_cls(int c MKSH_A_UNUSED) 20695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_e_rebuildline(MKSH_CLS_STRING)); 20715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 207303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 207403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Redraw (part of) the line. If limit is < 0, the everything is redrawn 20755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * on a NEW line, otherwise limit is the screen column up to which needs 20765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * redrawing. 20775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 20785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 20795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_redraw(int limit) 20805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2081811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser int i, j; 20825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 20835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2084c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = false; 20855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit == -1) 20865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 20875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 20885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 20895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 20905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp == xbuf) { 2091811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (prompt_trunc != -1) 2092811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser pprompt(prompt, prompt_trunc); 2093811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col = pwidth; 20945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2095811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_displen = xx_cols - 2 - x_col; 20965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 20975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xbp); 20985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp != xbuf || xep > xlp) 20995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru limit = xx_cols; 21005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit >= 0) { 21015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep > xlp) 210203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* we fill the line */ 210303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 21045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 21055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cpl = xbp; 21065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = limit; 21085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cpl < xlp) 21095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i -= x_size2(cpl, &cpl); 21105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = 0; 21135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((j < i) || (x_col < (xx_cols - 2))) { 21145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_col < (xx_cols - 2))) 21155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 21165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 21175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 21185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = ' '; 212003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (xep > xlp) { 212103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* more off screen */ 21225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp > xbuf) 21235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '*'; 21245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 21255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '>'; 21265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xbp > xbuf) 21275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '<'; 21285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(i); 21295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 21305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (j--) 21315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 21325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 21345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 21355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 2136c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adj_ok = true; 21375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 21385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_transpose(int c MKSH_A_UNUSED) 21425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned int tmpa, tmpb; 21445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 214503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /*- 214603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * What transpose is meant to do seems to be up for debate. This 21475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is a general summary of the options; the text is abcd with the 21485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * upper case character or underscore indicating the cursor position: 21495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Who Before After Before After 21505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in emacs mode: abCd abdC abcd_ (bell) 21515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in gmacs mode: abCd baCd abcd_ abdc_ 21525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * gnu emacs: abCd acbD abcd_ abdc_ 21535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Pdksh currently goes with GNU behavior since I believe this is the 21545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * most common version of emacs, unless in gmacs mode, in which case 21555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * it does the AT&T ksh gmacs mode. 21565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This should really be broken up into 3 functions so users can bind 21575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to the one they want. 21585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 21595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 21605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xcp == xep || Flag(FGMACS)) { 21635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp - xbuf == 1) { 21645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 216703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 216803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Gosling/Unipress emacs style: Swap two characters before 216903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * the cursor, do not change cursor position 21705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 21715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 21725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 21735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 21775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 21785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 21825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 21835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 21845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 21855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 218603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 218703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * GNU emacs style: Swap the characters before and under the 21885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cursor, move cursor position along one. 21895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 21905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 21915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 21955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 21965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 21975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 22005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 22015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 22025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 22035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 22055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_literal(int c MKSH_A_UNUSED) 22105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = -1; 22125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta1(int c MKSH_A_UNUSED) 22175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 1; 22195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta2(int c MKSH_A_UNUSED) 22245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 2; 22265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill(int c MKSH_A_UNUSED) 22315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2232c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t col = xcp - xbuf; 2233c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t lastcol = xep - xbuf; 2234c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t ndel, narg; 22355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2236c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_arg_defaulted || (narg = x_arg) > lastcol) 2237c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser narg = lastcol; 2238c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (narg < col) { 2239c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_goto(xbuf + narg); 2240c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ndel = col - narg; 2241c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } else 2242c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ndel = narg - col; 2243c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(ndel), true); 22445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 22485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_push(int nchars) 22495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 22515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2252c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser mkssert(xcp != NULL); 22535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strndupx(cp, xcp, nchars, AEDIT); 22545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killsp]) 22555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(killstack[killsp], AEDIT); 22565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killsp] = cp; 22575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killsp = (killsp + 1) % KILLSIZE; 22585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_yank(int c MKSH_A_UNUSED) 22625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killsp == 0) 22645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE; 22655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 22665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 22675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 22685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killtp] == 0) { 22695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nnothing to yank"); 22705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 22715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 22745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 22755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta_yank(int c MKSH_A_UNUSED) 22805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 228103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t len; 22825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((x_last_command != XFUNC_yank && x_last_command != XFUNC_meta_yank) || 22845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killtp] == 0) { 22855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 22865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nyank something first"); 22875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 22885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru len = strlen(killstack[killtp]); 22915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - len); 2292c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(len), false); 22935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 22945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killtp == 0) 22955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE - 1; 22965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 22975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 22985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (killstack[killtp] == 0); 22995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 23005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 23015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_abort(int c MKSH_A_UNUSED) 23055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* x_zotc(c); */ 23075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xep = xcp = xbp = xbuf; 23085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 23095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 23105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 23115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KINTR); 23125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_error(int c MKSH_A_UNUSED) 23165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 23185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 23195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* special VT100 style key sequence hack */ 23235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 23245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vt_hack(int c) 23255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we only support PF2-'1' for now */ 23275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != (2 << 8 | '1')) 23285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 23295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* what's the next character? */ 23315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 23325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 23335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 233403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 23355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_begin(0)); 23365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 23375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* "interesting" sequence detected */ 23385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 23395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 23405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 23415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 23445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '5' && c != '3') 23455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 23465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*- 23485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * At this point, we have read the following octets so far: 234903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * - ESC+[ or ESC+O or Ctrl-X (Prefix 2) 23505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 1 (vt_hack) 23515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - ; 23525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 5 (Ctrl key combiner) or 3 (Alt key combiner) 23535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * We can now accept one more octet designating the key. 23545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 23555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 23575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 23585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_fword(c)); 23595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 23605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_bword(c)); 23615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind_err: 23645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 23655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 23665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 23705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapin(const char *cp, Area *ap) 23715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *news, *op; 23735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(news, cp, ap); 23755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru op = news; 23765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) { 23775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX -- should handle \^ escape? */ 23785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cp == '^') { 23795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 238003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (*cp >= '?') 238103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* includes '?'; ASCII */ 23825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = CTRL(*cp); 23835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 23845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = '^'; 23855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 23865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 23885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = *cp; 23895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 23905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op = '\0'; 23925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 23945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 23975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout2(int c, char **buf) 23985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = *buf; 24005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 24025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = '^'; 24035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = UNCTRL(c); 24045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 24055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c; 24065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = 0; 24075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *buf = p; 24085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 24115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout(int c) 24125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char buf[8]; 24145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *bp = buf; 24155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(c, &bp); 24175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (buf); 24185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 24215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_print(int prefix, int key) 24225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int f = x_tab[prefix][key]; 24245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prefix) 24265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* prefix == 1 || prefix == 2 */ 24275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(x_mapout(prefix == 1 ? 24285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CTRL('[') : CTRL('X')), shl_stdout); 24295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 24305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s = ", x_mapout(key)); 24315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 24325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s%s = ", x_mapout(key), (f & 0x80) ? "~" : ""); 24335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(f) != XFUNC_ins_string) 24345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[XFUNC_VALUE(f)].xf_name); 24365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 24385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("'%s'\n", x_atab[prefix][key]); 24395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint 24435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bind(const char *a1, const char *a2, 24445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 244503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* bind -m */ 244603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool macro, 24475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 244803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* bind -l */ 244903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool list) 24505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 24525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int prefix, key; 24535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *m1, *m2; 24545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 24565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool hastilde; 24575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_tab == NULL) { 246003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("can't bind, not a tty"); 24615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 24625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* List function names */ 24645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (list) { 24655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 24665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 24675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !(x_ftab[f].xf_flags & XF_NOBIND)) 24685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[f].xf_name); 24695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a1 == NULL) { 24725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (prefix = 0; prefix < X_NTABS; prefix++) 24735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (key = 0; key < X_TABSZ; key++) { 24745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 24755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert || f == XFUNC_error 24765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru || (macro && f != XFUNC_ins_string) 24785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) 24805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 24815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 24825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru m2 = m1 = x_mapin(a1, ATEMP); 24865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 0; 24875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (;; m1++) { 24885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru key = (unsigned char)*m1; 24895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 24905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1) 24915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 1; 24925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_meta2) 24935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 2; 24945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 24955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 24965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++m1 24985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru && ((*m1 != '~') || *(m1 + 1)) 25005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) { 250203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra char msg[256]; 25035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *c = a1; 250403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra m1 = msg; 2505c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser while (*c && (size_t)(m1 - msg) < sizeof(msg) - 3) 25065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(*c++, &m1); 250703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("%s: %s", "too long key sequence", msg); 25085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 25095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 251103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra hastilde = tobool(*m1); 25125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(m2, ATEMP); 25145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a2 == NULL) { 25165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 25175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 25185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*a2 == 0) { 25205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 25215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (macro) { 25235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_ins_string; 25245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = x_mapin(a2, AEDIT); 25255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 25275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 25285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 25295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(x_ftab[f].xf_name, a2) == 0) 25305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 25315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == NELEM(x_ftab) || x_ftab[f].xf_flags & XF_NOBIND) { 253203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bi_errorf("%s: %s %s", a2, "no such", Tfunction); 25335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 25345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(x_tab[prefix][key]) == XFUNC_ins_string && 25395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key]) 25405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(x_atab[prefix][key], AEDIT); 25415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[prefix][key] = f 25435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru | (hastilde ? 0x80 : 0) 25455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 25475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 25485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key] = sp; 25495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 25505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Track what the user has bound so x_mode(true) won't toast things */ 25525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert) 25535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] &= 25545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ~(1 << ((prefix * X_TABSZ + key) % 8)); 25555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 25565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] |= 25575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (1 << ((prefix * X_TABSZ + key) % 8)); 25585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 25605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 25635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubind_if_not_bound(int p, int k, int func) 25645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2565c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser int t; 2566c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2567c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2568c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Has user already bound this key? 2569c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * If so, do not override it. 2570c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2571c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser t = p * X_TABSZ + k; 2572c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_bound[t >> 3] & (1 << (t & 7))) 25735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 25745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[p][k] = func; 25765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_mark(int c MKSH_A_UNUSED) 25805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 25825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill_region(int c MKSH_A_UNUSED) 25875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2588c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser size_t rsize; 25895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xr; 25905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 25925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 25935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp > xcp) { 25965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xmp - xcp; 25975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xcp; 25985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 25995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xcp - xmp; 26005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xmp; 26015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xr); 2603c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(rsize), true); 26045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xr; 26055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_xchg_point_mark(int c MKSH_A_UNUSED) 26105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *tmp; 26125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 26145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tmp = xmp; 26185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 26195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(tmp); 26205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_noop(int c MKSH_A_UNUSED) 26255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 26305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * File/command name completion routines 26315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 26325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_comm(int c MKSH_A_UNUSED) 26345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_COMPLETE); 26365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_comm(int c MKSH_A_UNUSED) 26415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_LIST); 26435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_complete(int c MKSH_A_UNUSED) 26485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLETE); 26505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_enumerate(int c MKSH_A_UNUSED) 26555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_LIST); 26575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_file(int c MKSH_A_UNUSED) 26625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_COMPLETE); 26645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_file(int c MKSH_A_UNUSED) 26695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_LIST); 26715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_list(int c MKSH_A_UNUSED) 26765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLIST); 26785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_expand(int c MKSH_A_UNUSED) 26835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 26855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nwords, i; 26865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 268703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_FILE; 268803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, xbuf, xep - xbuf, xcp - xbuf, 268903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 26905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 26925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + start); 2696c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_delete(x_nb2nc(end - start), false); 269703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 269803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 269903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (i < nwords) { 27005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_do_ins) < 0 || 27015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (++i < nwords && x_ins(" ") < 0)) { 27025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 27035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 27045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 27075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 27095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 271203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrado_complete( 271303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* XCF_{COMMAND,FILE,COMMAND_FILE} */ 271403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int flags, 271503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 0 for list, 1 for complete and 2 for complete-list */ 27165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Comp_type type) 27175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 27195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nlen, olen, nwords; 2720c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser bool completed; 27215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 272203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&flags, xbuf, xep - xbuf, xcp - xbuf, 272303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 27245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no match */ 27255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 27265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 27275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 27285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (type == CT_LIST) { 273003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, 273103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra tobool(flags & XCF_IS_COMMAND)); 27325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(0); 27335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 27345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 27355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = end - start; 27375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = x_longest_prefix(nwords, words); 2738c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (nwords == 1) { 2739c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2740c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * always complete single matches; 2741c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * any expansion of parameter substitution 2742c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * is always at most one result, too 2743c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 27445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru completed = true; 2745c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } else { 2746c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser char *unescaped; 2747c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2748c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* make a copy of the original string part */ 2749c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser strndupx(unescaped, xbuf + start, olen, ATEMP); 2750c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2751c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* expand any tilde and unescape the string for comparison */ 2752c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser unescaped = x_glob_hlp_tilde_and_rem_qchar(unescaped, true); 2753c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2754c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2755c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * match iff entire original string is part of the 2756c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * longest prefix, implying the latter is at least 2757c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * the same size (after unescaping) 2758c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2759c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser completed = !strncmp(words[0], unescaped, strlen(unescaped)); 2760c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 2761c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afree(unescaped, ATEMP); 2762c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 2763c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (type == CT_COMPLIST && nwords > 1) { 2764c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 2765c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * print expansions, since we didn't get back 2766c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * just a single match 2767c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 2768c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_print_expansions(nwords, words, 2769c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser tobool(flags & XCF_IS_COMMAND)); 2770c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser } 2771c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (completed) { 2772c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* expand on the command line */ 2773c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xmp = NULL; 2774c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xcp = xbuf + start; 2775c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser xep -= olen; 2776c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser memmove(xcp, xcp + olen, xep - xcp + 1); 2777c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_escape(words[0], nlen, x_do_ins); 27785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2779c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_adjust(); 278003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 278103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * append a space if this is a single non-directory match 278203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * and not a parameter or homedir substitution 278303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 278403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (nwords == 1 && words[0][nlen - 1] != '/' && 2785c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser !(flags & XCF_IS_NOSPACE)) { 27865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(" "); 27875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 27905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 279203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 279303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 27945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_adjust - redraw the line adjusting starting point etc. 27955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 27965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 27975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function is called when we have exceeded the bounds 27985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of the edit window. It increments x_adj_done so that 27995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * functions like x_ins and x_delete know that we have been 28005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * called and can skip the x_bs() stuff which has already 28015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * been done by x_redraw. 28025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 28035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 28045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 28055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 28065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_adjust(void) 28085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2809811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser int col_left, n; 2810811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 2811811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* flag the fact that we were called */ 281203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_adj_done++; 2813811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 28145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 2815811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * calculate the amount of columns we need to "go back" 2816811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * from xcp to set xbp to (but never < xbuf) to 2/3 of 2817811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * the display width; take care of pwidth though 28185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2819811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if ((col_left = xx_cols * 2 / 3) < MIN_EDIT_SPACE) { 2820811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* 2821811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * cowardly refuse to do anything 2822811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * if the available space is too small; 2823811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser * fall back to dumb pdksh code 2824811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser */ 2825811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if ((xbp = xcp - (x_displen / 2)) < xbuf) 2826811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xbp = xbuf; 2827811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* elide UTF-8 fixup as penalty */ 2828811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser goto x_adjust_out; 2829811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 2830811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 2831811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* fix up xbp to just past a character end first */ 2832811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xbp = xcp >= xep ? xep : x_bs0(xcp, xbuf); 2833811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* walk backwards */ 2834811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (xbp > xbuf && col_left > 0) { 2835811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xbp = x_bs0(xbp - 1, xbuf); 2836811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser col_left -= (n = x_size2(xbp, NULL)); 2837811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 2838811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* check if we hit the prompt */ 2839811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (xbp == xbuf && xcp != xbuf && col_left >= 0 && col_left < pwidth) { 2840811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* so we did; force scrolling occurs */ 2841811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser xbp += utf_ptradj(xbp); 2842811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 2843811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 2844811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_adjust_out: 28455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 28465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 28475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 28485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_ungetc(int c) 28525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = c < 0 ? -1 : (c & 255); 28545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 28575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getc(void) 28585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 28605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (unget_char >= 0) { 28625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = unget_char; 28635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = -1; 28645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 28655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 28685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr) { 28695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = (unsigned char)*macroptr++)) 28705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 28715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = NULL; 28725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 28745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_getc()); 28765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc2(int c) 28805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1; 28825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 28845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 28855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 28865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 28875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char utf_tmp[3]; 28885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t x; 28895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0xA0) 28915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = 0xFFFD; 28925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x = utf_wctomb(utf_tmp, c); 28935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[0]); 28945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 1) 28955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[1]); 28965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 2) 28975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[2]); 28985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_wcwidth(c); 28995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 29005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 29015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 29025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 29035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 29055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 29065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 29085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 29095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 29115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 29125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 29165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 29175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 29205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc3(const char **cp) 29215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1, c = **(const unsigned char **)cp; 29235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 29255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 29265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 29275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 29285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 29295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_widthadj(*cp, (const char **)&cp2); 29315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp < cp2) 29325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*(*cp)++); 29335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 29345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 29355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 29365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 29385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 29395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 29415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 29425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 29445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 29455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 29475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 29485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 29495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 29525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 29535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 29565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_puts(const char *s) 29575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 29595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*s && adj == x_adj_done) 29615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3(&s); 29625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 296403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 296503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 29665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_set_arg - set an arg value for next function 29675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 29695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This is a simple implementation of M-[0-9]. 29705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 29725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 29735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 29745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 29755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_arg(int c) 29765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 297703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra unsigned int n = 0; 297803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool first = true; 29795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 298003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* strip command prefix */ 298103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra c &= 255; 298203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (c >= 0 && ksh_isdigit(c)) { 29835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = n * 10 + (c - '0'); 298403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (n > LINE) 298503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* upper bound for repeat */ 298603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra goto x_set_arg_too_big; 298703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra c = x_e_getc(); 298803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra first = false; 298903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 29905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0 || first) { 299103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_set_arg_too_big: 29925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 29935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 299403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = true; 29955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 29965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 29975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = n; 299803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_arg_defaulted = false; 29995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Comment or uncomment the current line. */ 30045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comment(int c MKSH_A_UNUSED) 30065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize = x_size_str(xbuf); 300803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t len = xep - xbuf; 30095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(xbuf, xend - xbuf, &len); 30105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret < 0) 30125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 30135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 30145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 30155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + len; 30165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 30175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbp = xbuf; 30185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 30195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret > 0) 30205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 30215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_version(int c MKSH_A_UNUSED) 30275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbuf = xbuf, *o_xend = xend; 30295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbp = xbp, *o_xep = xep, *o_xcp = xcp; 303003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int lim = x_lastcp() - xbp; 303103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t vlen; 30325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *v; 30335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(v, KSH_VERSION, ATEMP); 30355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = xbp = xcp = v; 30375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = xep = v + (vlen = strlen(v)); 30385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(lim); 30395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 30405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 30425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = o_xbuf; 30435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = o_xend; 30445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = o_xbp; 30455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = o_xep; 30465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = o_xcp; 304703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_redraw((int)vlen); 30485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0) 30505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* This is what AT&T ksh seems to do... Very bizarre */ 30525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != ' ') 30535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 30545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(v, ATEMP); 30565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 30605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_edit_line(int c MKSH_A_UNUSED) 30625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) { 30645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf) { 30655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 30665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 30695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 30705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, xbuf, true, true); 30715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 0; 30725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 30735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = source->line - (histptr - x_histp); 30745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg) 30765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(xbuf, xend - xbuf, "%s %d", 30775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", x_arg); 30785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 30795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, "fc -e ${VISUAL:-${EDITOR:-vi}} --", xend - xbuf); 30805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + strlen(xbuf); 30815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 30825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 30845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 308503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 308603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 30875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_prev_histword - recover word from prev command 30885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 30905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function recovers the last word from the previous 30915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * command and inserts it into the current edit line. If a 30925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * numeric arg is supplied then the n'th word from the 30935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * start of the previous command is used. 30945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * As a side effect, trashes the mark in order to achieve 30955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * being called in a repeatable fashion. 30965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Bound to M-. 30985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 31005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 31015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_histword(int c MKSH_A_UNUSED) 31045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *rcp, *cp; 31065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **xhp; 310703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int m = 1; 310803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* -1 = defaulted; 0+ = argument */ 310903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra static int last_arg = -1; 311003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 311103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (x_last_command == XFUNC_prev_histword) { 311203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (xmp && modified > 1) 311303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_kill_region(0); 311403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (modified) 311503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra m = modified; 311603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } else 311703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra last_arg = x_arg_defaulted ? -1 : x_arg; 31185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xhp = histptr - (m - 1); 31195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((xhp < history) || !(cp = *xhp)) { 31205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 31215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 31225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 31235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_set_mark(0); 312503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if ((x_arg = last_arg) == -1) { 312603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* x_arg_defaulted */ 312703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 31285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = &cp[strlen(cp) - 1]; 31295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 31305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space after the last word 31315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && is_cfs(*rcp)) 31335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 31345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && !is_cfs(*rcp)) 31355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 31365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_cfs(*rcp)) 31375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(rcp); 31395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 314003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* not x_arg_defaulted */ 31415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char ch; 31425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = cp; 31445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 31455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space at start of line 31465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 31475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 31485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 314903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (x_arg-- > 0) { 31505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 31515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 31535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = rcp; 31565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 31575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 31585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = *rcp; 31595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = '\0'; 31605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(cp); 31615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = ch; 31625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = m + 1; 31645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 31655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 31685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Uppercase N(1) words */ 31695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_upper(int c MKSH_A_UNUSED) 31715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('U')); 31735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Lowercase N(1) words */ 31765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_lower(int c MKSH_A_UNUSED) 31785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('L')); 31805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3182c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* Titlecase N(1) words */ 31835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 31845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_capitalise(int c MKSH_A_UNUSED) 31855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('C')); 31875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 318903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 319003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 31915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_fold_case - convert word to UPPER/lower/Capital case 31925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 31935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 3194c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * This function is used to implement M-U/M-u, M-L/M-l, M-C/M-c 3195c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * to UPPER CASE, lower case or Capitalise Words. 31965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 31975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 31985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 31995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 32015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_case(int c) 32025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 32035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 32045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 32065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 32075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 32085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 32105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 32115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * first skip over any white-space 32125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 32145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 32155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 32165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * do the first char on its own since it may be 32175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a different action than for the rest. 32185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp != xep) { 322003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (c == 'L') 322103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* lowercase */ 32225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 322303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra else 322403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* uppercase, capitalise */ 32255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 32265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 32275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 32295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * now for the rest of the word 32305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) { 323203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (c == 'U') 323303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* uppercase */ 32345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 323503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra else 323603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* lowercase, capitalise */ 32375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 32385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 32395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 32425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 32435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 32445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 32455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 32465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 324703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/*- 324803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * NAME: 32495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp - last visible char 32505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * SYNOPSIS: 32525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp() 32535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 32555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function returns a pointer to that char in the 32565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * edit buffer that will be the last displayed on the 32575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * screen. The sequence: 32585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp = x_lastcp(); 32605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * while (cp > xcp) 32615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_bs3(&cp); 32625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Will position the cursor correctly on the screen. 32645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 32655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 32665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp or NULL 32675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 32685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 32695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_lastcp(void) 32705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 32715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!xlp_valid) { 32725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i = 0, j; 32735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xlp2; 32745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp; 32765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (xlp < xep) { 32775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(xlp, &xlp2); 32785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i + j) > x_displen) 32795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 32805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i += j; 32815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xlp2; 32825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 32845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 32855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (xlp); 32865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 32875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 328803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic void 32895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mode(bool onoff) 32905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 32915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static bool x_cur_mode; 32925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_cur_mode == onoff) 329403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra return; 32955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_cur_mode = onoff; 32965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (onoff) { 329803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_mkraw(tty_fd, NULL, false); 32995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 330003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.erase = tty_state.c_cc[VERASE]; 330103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.kill = tty_state.c_cc[VKILL]; 330203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.intr = tty_state.c_cc[VINTR]; 330303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.quit = tty_state.c_cc[VQUIT]; 330403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.eof = tty_state.c_cc[VEOF]; 33055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef VWERASE 330603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra edchars.werase = tty_state.c_cc[VWERASE]; 33075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 33085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef _POSIX_VDISABLE 33105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Convert unset values to internal 'unset' value */ 33115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase == _POSIX_VDISABLE) 33125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.erase = -1; 33135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill == _POSIX_VDISABLE) 33145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.kill = -1; 33155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr == _POSIX_VDISABLE) 33165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.intr = -1; 33175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit == _POSIX_VDISABLE) 33185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.quit = -1; 33195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.eof == _POSIX_VDISABLE) 33205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.eof = -1; 33215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase == _POSIX_VDISABLE) 33225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.werase = -1; 33235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 33245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase >= 0) { 33265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.erase, XFUNC_del_back); 33275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(1, edchars.erase, XFUNC_del_bword); 33285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 33295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill >= 0) 33305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.kill, XFUNC_del_line); 33315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase >= 0) 33325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.werase, XFUNC_del_bword); 33335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr >= 0) 33345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.intr, XFUNC_abort); 33355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit >= 0) 33365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.quit, XFUNC_noop); 33375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 3338c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser mksh_tcset(tty_fd, &tty_state); 33395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 33405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 33425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ vi editing mode +++ */ 33435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Ctrl(c) (c&0x1f) 33455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct edstate { 33475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cbuf; 334803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t winleft; 334903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t cbufsize; 335003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t linelen; 335103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra ssize_t cursor; 33525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 33535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_hook(int); 33555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int nextstate(int); 33565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_insert(int); 33575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_cmd(int, const char *); 33585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int domove(int, const char *, int); 33595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int redo_insert(int); 33605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void yank_range(int, int); 33615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int bracktype(int); 33625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void save_cbuf(void); 33635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_cbuf(void); 3364811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int putbuf(const char *, ssize_t, bool); 33655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void del_range(int, int); 3366811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int findch(int, int, bool, bool); 33675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int forwword(int); 33685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int backword(int); 33695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int endword(int); 33705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Forwword(int); 33715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Backword(int); 33725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Endword(int); 33735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int grabhist(int, int); 3374c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserstatic int grabsearch(int, int, int, const char *); 337503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic void redraw_line(bool); 33765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void refresh(int); 33775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int outofwin(void); 33785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void rewindow(void); 33795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int newcol(int, int); 33805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void display(char *, char *, int); 33815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void ed_mov_opt(int, char *); 33825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int expand_word(int); 33835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int complete_word(int, int); 33845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int print_expansions(struct edstate *, int); 33855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define char_len(c) ((c) < ' ' || (c) == 0x7F ? 2 : 1) 33865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_vi_zotc(int); 33875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_error(void); 33885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_macro_reset(void); 33895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_vi_putbuf(const char *, size_t); 33905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 339103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vC 0x01 /* a valid command that isn't a vM, vE, vU */ 339203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vM 0x02 /* movement command (h, l, etc.) */ 339303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vE 0x04 /* extended command (c, d, y) */ 339403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vX 0x08 /* long command (@, f, F, t, T, etc.) */ 339503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vU 0x10 /* an UN-undoable command (that isn't a vM) */ 339603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vB 0x20 /* bad command (^@) */ 339703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vZ 0x40 /* repeat count defaults to 0 (not 1) */ 339803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define vS 0x80 /* search (/, ?) */ 339903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 340003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_bad(c) (classify[(c)&0x7f]&vB) 340103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_cmd(c) (classify[(c)&0x7f]&(vM|vE|vC|vU)) 340203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_move(c) (classify[(c)&0x7f]&vM) 340303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_extend(c) (classify[(c)&0x7f]&vE) 340403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_long(c) (classify[(c)&0x7f]&vX) 340503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_undoable(c) (!(classify[(c)&0x7f]&vU)) 340603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_srch(c) (classify[(c)&0x7f]&vS) 340703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#define is_zerocount(c) (classify[(c)&0x7f]&vZ) 34085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const unsigned char classify[128] = { 34105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 1 2 3 4 5 6 7 */ 34115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 ^@ ^A ^B ^C ^D ^E ^F ^G */ 341203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vB, 0, 0, 0, 0, vC|vU, vC|vZ, 0, 34135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1 ^H ^I ^J ^K ^L ^M ^N ^O */ 341403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, vC|vZ, 0, 0, vC|vU, 0, vC, 0, 34155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 2 ^P ^Q ^R ^S ^T ^U ^V ^W */ 341603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vC|vU, 0, 0, 0, vC, 0, 34175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3 ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */ 341803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, 0, vC|vZ, 0, 0, 0, 0, 34195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 4 <space> ! " # $ % & ' */ 342003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, 0, 0, vC, vM, vM, 0, 0, 34215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5 ( ) * + , - . / */ 342203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, 0, vC, vC, vM, vC, 0, vC|vS, 34235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6 0 1 2 3 4 5 6 7 */ 342403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, 0, 0, 0, 0, 0, 0, 0, 34255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7 8 9 : ; < = > ? */ 342603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, 0, 0, vM, 0, vC, 0, vC|vS, 34275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8 @ A B C D E F G */ 342803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC|vX, vC, vM, vC, vC, vM, vM|vX, vC|vU|vZ, 34295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9 H I J K L M N O */ 3430811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 0, vC, 0, 0, 0, 0, vC|vU, vU, 34315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* A P Q R S T U V W */ 343203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vC, vC, vM|vX, vC, 0, vM, 34335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* B X Y Z [ \ ] ^ _ */ 3434811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser vC, vC|vU, 0, vU, vC|vZ, 0, vM, vC|vZ, 34355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* C ` a b c d e f g */ 343603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 0, vC, vM, vE, vE, vM, vM|vX, vC|vZ, 34375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* D h i j k l m n o */ 343803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vM, vC, vC|vU, vC|vU, vM, 0, vC|vU, 0, 34395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* E p q r s t u v w */ 344003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, 0, vX, vC, vM|vX, vC|vU, vC|vU|vZ, vM, 34415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* F x y z { | } ~ ^? */ 344203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra vC, vE|vU, 0, 0, vM|vZ, 0, vC, 0 34435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 34445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAXVICMD 3 34465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SRCHLEN 40 34475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INSERT 1 34495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REPLACE 2 34505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VNORMAL 0 /* command, insert or replace mode */ 34525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG1 1 /* digit prefix (first, eg, 5l) */ 34535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VEXTCMD 2 /* cmd + movement (eg, cl) */ 34545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG2 3 /* digit prefix (second, eg, 2c3l) */ 34555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VXCH 4 /* f, F, t, T, @ */ 34565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VFAIL 5 /* bad command */ 34575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VCMD 6 /* single char command (eg, X) */ 34585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VREDO 7 /* . */ 34595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VLIT 8 /* ^V */ 34605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VSEARCH 9 /* /, ? */ 34615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VVERSION 10 /* <ESC> ^V */ 3462811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser#define VPREFIX2 11 /* ^[[ and ^[O in insert mode */ 34635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *save_edstate(struct edstate *old); 34655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_edstate(struct edstate *old, struct edstate *news); 34665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void free_edstate(struct edstate *old); 34675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate ebuf; 3469811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic struct edstate undobuf; 34705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3471811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic struct edstate *es; /* current editor state */ 34725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *undo; 34735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3474811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic char *ibuf; /* input buffer */ 3475811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic bool first_insert; /* set when starting in insert mode */ 34765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int saved_inslen; /* saved inslen for first insert */ 34775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int inslen; /* length of input buffer */ 34785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int srchlen; /* length of current search pattern */ 3479811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic char *ybuf; /* yank buffer */ 34805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int yanklen; /* length of yank buffer */ 34815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavecmd = ' '; /* last find command */ 34825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavech; /* character to find */ 34835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char lastcmd[MAXVICMD]; /* last non-move command */ 34845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastac; /* argcnt for lastcmd */ 34855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastsearch = ' '; /* last search command */ 34865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char srchpat[SRCHLEN]; /* last search pattern */ 3487811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserstatic int insert; /* <>0 in insert mode */ 34885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hnum; /* position in history */ 34895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int ohnum; /* history line copied (after mod) */ 34905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hlast; /* 1 past last position in history */ 34915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int state; 34925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 349303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* 349403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * Information for keeping track of macros that are being expanded. 34955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The format of buf is the alias contents followed by a NUL byte followed 34965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * by the name (letter) of the alias. The end of the buffer is marked by 34975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a double NUL. The name of the alias is stored so recursive macros can 34985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be detected. 34995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 35005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct macro_state { 35015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *p; /* current position in buf */ 35025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf; /* pointer to macro(s) being expanded */ 350303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t len; /* how much data in buffer */ 35045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 35055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct macro_state macro; 35065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 350703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra/* last input was expanded */ 350803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condrastatic enum expand_mode { 350903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra NONE = 0, EXPAND, COMPLETE, PRINT 351003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} expanded; 35115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 3513811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserx_vi(char *buf) 35145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 35155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 35165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 35185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum = hlast = histnum(-1) + 1; 35195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 35205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = inslen; 3521811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser first_insert = true; 35225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 35235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 35245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3525811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser ebuf.cbuf = buf; 3526811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (undobuf.cbuf == NULL) { 3527811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser ibuf = alloc(LINE, AEDIT); 3528811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser ybuf = alloc(LINE, AEDIT); 3529811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser undobuf.cbuf = alloc(LINE, AEDIT); 3530811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 3531811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser undobuf.cbufsize = ebuf.cbufsize = LINE; 3532811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser undobuf.linelen = ebuf.linelen = 0; 3533811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser undobuf.cursor = ebuf.cursor = 0; 3534811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser undobuf.winleft = ebuf.winleft = 0; 35355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &ebuf; 35365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = &undobuf; 35375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3538811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_init_prompt(); 3539811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col = pwidth; 35405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3541811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (wbuf_len != x_cols - 3 && ((wbuf_len = x_cols - 3))) { 3542811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser wbuf[0] = aresize(wbuf[0], wbuf_len, AEDIT); 3543811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser wbuf[1] = aresize(wbuf[1], wbuf_len, AEDIT); 35445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 354503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (wbuf_len) { 354603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[0], ' ', wbuf_len); 354703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[1], ' ', wbuf_len); 354803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra } 35495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru winwidth = x_cols - pwidth - 3; 35505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 0; 35515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 35525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = 1; 35535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = 0; 35545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 2; 35565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 355703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (/* CONSTCOND */ 1) { 35585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 35595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = *macro.p++; 35605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* end of current macro? */ 35615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!c) { 35625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more macros left to finish? */ 35635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*macro.p++) 35645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 35655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* must be the end of all the macros */ 35665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 35675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 35685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 35705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 35715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 35735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state != VLIT) { 35755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == edchars.intr || c == edchars.quit) { 35765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* pretend we got an interrupt */ 35775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(c); 35785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(c == edchars.intr ? SIGINT : SIGQUIT); 35805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 35815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 35825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c == edchars.eof && state != VVERSION) { 35835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) { 35845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(edchars.eof); 35855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = -1; 35865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 35895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (vi_hook(c)) 35925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 35975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 35985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 35995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3600811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (c == -1 || (ssize_t)LINE <= es->linelen) 36015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 36025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cbuf != buf) 3604811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser memcpy(buf, es->cbuf, es->linelen); 36055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[es->linelen++] = '\n'; 36075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (es->linelen); 36095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 36105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 36125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_hook(int ch) 36135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 36145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char curcmd[MAXVICMD], locpat[SRCHLEN]; 36155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static int cmdlen, argc1, argc2; 36165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 36185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VNORMAL: 36205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 36215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('v')) { 36225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VLIT; 36235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = '^'; 36245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_insert(ch)) { 36265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 36275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 36315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VLIT) { 36325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 36335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 36355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 0); 36365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 36385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n') 36425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmdlen = 0; 36445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = 0; 36455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 36465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = ch - '0'; 36475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG1; 36485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 36505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 36515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VSEARCH) { 36525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 36535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 36545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 3655811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (putbuf(ch == '/' ? "/" : "?", 1, 3656811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser false) != 0) 36575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 36585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VVERSION) { 36615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 36625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 36635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 36645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf(KSH_VERSION, 3665811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser strlen(KSH_VERSION), false); 36665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VLIT: 36735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_bad(ch)) { 36745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + 1); 36755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 36775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 36785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(1); 36795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VVERSION: 36835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 36845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG1: 36895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 36905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc1 * 10 + ch - '0'; 36915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 36925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 36935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 36945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VEXTCMD: 36985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = 0; 36995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 37005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = ch - '0'; 37015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG2; 37025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 37055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 37065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 37085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 37095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 37115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG2: 37155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 37165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = argc2 * 10 + ch - '0'; 37175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 == 0) 37195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc2; 37205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 *= argc2; 37225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 37235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 37245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 37265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 37275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 37295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VXCH: 37335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('[')) 37345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 37375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VSEARCH: 37425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n' /*|| ch == Ctrl('[')*/ ) { 37435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 37445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Repeat last search? */ 37455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == 0) { 37465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!srchpat[0]) { 37475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen] = '\0'; 37545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(srchpat, locpat, srchlen + 1); 37555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 37575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.erase || ch == Ctrl('h')) { 37585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen != 0) { 37595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen--; 37605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[srchlen]); 37615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 37625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 37665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.kill) { 37695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 37705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 1; 37715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 1; 37725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.werase) { 37755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, n = srchlen; 37765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate new_es, *save_es; 37775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cursor = n; 37795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cbuf = locpat; 37805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_es = es; 37825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &new_es; 37835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = backword(1); 37845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = save_es; 37855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = srchlen; --i >= n; ) 37875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[i]); 37885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = n; 37895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 37905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == SRCHLEN - 1) 37945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 37965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen++] = ch; 37975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 3798c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if ((size_t)es->linelen + 2 > 3799c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser (size_t)es->cbufsize) 38005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = '^'; 38025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch ^ '@'; 38035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 38045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize) 38055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch; 38075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 38095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 38125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 3814811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 3815811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser case VPREFIX2: 3816811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser state = VFAIL; 3817811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser switch (ch) { 3818811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser case 'A': 3819811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* the cursor may not be at the BOL */ 3820811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (!es->cursor) 3821811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser break; 3822811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* nor further in the line than we can search for */ 3823811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if ((size_t)es->cursor >= sizeof(srchpat) - 1) 3824811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser es->cursor = sizeof(srchpat) - 2; 3825811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* anchor the search pattern */ 3826811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser srchpat[0] = '^'; 3827811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* take the current line up to the cursor */ 3828811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser memmove(srchpat + 1, es->cbuf, es->cursor); 3829811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser srchpat[es->cursor + 1] = '\0'; 3830811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* set a magic flag */ 3831811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser argc1 = 2 + (int)es->cursor; 3832811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* and emulate a backwards history search */ 3833811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser lastsearch = '/'; 3834811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser *curcmd = 'n'; 3835811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser goto pseudo_VCMD; 3836811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 3837811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser break; 38385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 38415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VCMD: 3842811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser pseudo_VCMD: 38435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(argc1, curcmd)) { 38455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 38465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 38505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) 38515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 38525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 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 - don't redraw the screen */ 38595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VREDO: 38645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 != 0) 38665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argc1; 38675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(lastac, lastcmd)) { 38685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 38695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 38735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 38745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 38755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') { 38765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(1) != 0) 38775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 38795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(lastac) != 0) 38805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 38865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 38875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 2: 38895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* back from a 'v' command - can't happen */ 38905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VFAIL: 38955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 38965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 38975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 39015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 39035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunextstate(int ch) 39045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 39055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_extend(ch)) 39065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VEXTCMD); 39075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_srch(ch)) 39085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VSEARCH); 39095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_long(ch)) 39105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VXCH); 39115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == '.') 39125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VREDO); 39135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == Ctrl('v')) 39145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VVERSION); 39155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_cmd(ch)) 39165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VCMD); 39175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VFAIL); 39195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 39205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 39225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_insert(int ch) 39235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 39245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcursor; 39255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.erase || ch == Ctrl('h')) { 39275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE) { 39285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == undo->cursor) { 39295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 39305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 39335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 39345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 39355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor >= undo->linelen) 39365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 39375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor] = undo->cbuf[es->cursor]; 39395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 39405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == 0) 39415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 39435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 39445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 39455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 39465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], &es->cbuf[es->cursor + 1], 39475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor + 1); 39485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.kill) { 39535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 39545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 39555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, &es->cbuf[es->cursor], 39565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 39575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor; 39585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 39595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.werase) { 39645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 39655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcursor = backword(1); 39665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[tcursor], &es->cbuf[es->cursor], 39675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 39685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor - tcursor; 39695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen < es->cursor - tcursor) 39705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 39715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 39725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen -= es->cursor - tcursor; 39735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = tcursor; 39745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 39775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 397803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 397903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If any chars are entered before escape, trash the saved insert 39805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * buffer (if user inserts & deletes char, ibuf gets trashed and 39815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we don't want to use it) 39825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 39835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert && ch != Ctrl('[')) 39845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = 0; 39855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 39865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\0': 39875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 39905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 39915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 39925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('['): 39945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 39955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert) { 3996811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser first_insert = false; 39975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen == 0) { 39985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = saved_inslen; 39995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 40005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] = 'a'; 40025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 1; 40035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 40055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') 40065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 40075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 40085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(lastac - 1)); 40095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* { Begin nonstandard vi commands */ 40115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('x'): 40125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(0); 40135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('f'): 40165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 40175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('e'): 40205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 0); 40215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('i'): 40245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (Flag(FVITABCOMPLETE)) { 40255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 40265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 40295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* End nonstandard vi commands } */ 40305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 40325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize - 1) 40335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ibuf[inslen++] = ch; 40355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == INSERT) { 40365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + 1], &es->cbuf[es->cursor], 40375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 40385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 40395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 40415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE && es->cursor > es->linelen) 40425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 40435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 40445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 40465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 40475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 40495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_cmd(int argcnt, const char *cmd) 40505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 40515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 40525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, c1, c2, c3 = 0; 40535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int any; 40545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *t; 40555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt == 0 && !is_zerocount(*cmd)) 40575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 40585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_move(*cmd)) { 40605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cur = domove(argcnt, cmd, 0)) >= 0) { 40615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->linelen && cur != 0) 40625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur--; 40635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = cur; 40645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 40655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 40675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Don't save state in middle of macro.. */ 40685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_undoable(*cmd) && !macro.p) { 40695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->winleft = es->winleft; 40705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(undo->cbuf, es->cbuf, es->linelen); 40715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->linelen = es->linelen; 40725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->cursor = es->cursor; 40735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argcnt; 40745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(lastcmd, cmd, MAXVICMD); 40755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 40775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('l'): 40795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('r'): 408003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(true); 40815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '@': 40845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 40855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char alias[] = "_\0"; 40865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *ap; 408703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t olen, nlen; 40885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *nbuf; 40895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* lookup letter in alias list... */ 40915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru alias[1] = cmd[1]; 40925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ap = ktsearch(&aliases, alias, hash(alias)); 40935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!cmd[1] || !ap || !(ap->flag & ISSET)) 40945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* check if this is a recursive call... */ 40965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((p = (char *)macro.p)) 40975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((p = strnul(p)) && p[1]) 40985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++p == cmd[1]) 40995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* insert alias into macro buffer */ 41015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = strlen(ap->val.s) + 1; 41025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = !macro.p ? 2 : 41035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len - (macro.p - macro.buf); 410403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 410503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * at this point, it's fairly reasonable that 410603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * nlen + olen + 2 doesn't overflow 410703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 4108811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser nbuf = alloc(nlen + 1 + olen, AEDIT); 41095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf, ap->val.s, nlen); 41105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = cmd[1]; 41115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 41125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf + nlen, macro.p, olen); 4113811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser afree(macro.buf, AEDIT); 41145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen += olen; 41155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 41165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 41175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 41185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.p = macro.buf = (unsigned char *)nbuf; 41205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len = nlen; 41215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'a': 41255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 41285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 41295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'A': 41335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(0, 0); 41365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 41375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'S': 41415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 41425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 41435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'Y': 41495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmd = "y$"; 41505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhhhhh... */ 41515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'c': 41525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'd': 41535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'y': 41545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == cmd[1]) { 41555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = *cmd == 'c' ? domove(1, "^", 1) : 0; 41565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->linelen; 41575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (!is_move(cmd[1])) 41585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 41605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ncursor = domove(argcnt, &cmd[1], 1)) < 0) 41615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c' && 41635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cmd[1] == 'w' || cmd[1] == 'W') && 41645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[es->cursor])) { 41655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 41665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --ncursor; 41675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (ksh_isspace(es->cbuf[ncursor])); 41685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 41695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->cursor) { 41715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = es->cursor; 41725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = ncursor; 41735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 41745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = ncursor; 41755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->cursor; 41765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == '%') 41775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2++; 41785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'c' && c1 != c2) 41815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(c1, c2); 41825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'y') { 41835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(c1, c2); 41845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = c1; 41855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c') { 41875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'p': 41945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 41975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 4198811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (putbuf(ybuf, yanklen, false) == 0 && 4199811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser --argcnt > 0) 42005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 42015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 42025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 42035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 42045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'P': 42085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 0; 4211811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (putbuf(ybuf, yanklen, false) == 0 && 4212811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser --argcnt > 0) 42135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 1; 42145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (any && es->cursor != 0) 42155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 42165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 42175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 42215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 42245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 42285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->linelen); 42295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 42305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 42315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 42325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'g': 42355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 42365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast; 42375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 42385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'G': 42395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 42405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 42415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 42425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast - (source->line - argcnt); 42435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, argcnt - 1) < 0) 42445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = argcnt - 1; 42485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'i': 42525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'I': 42585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 42615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'j': 42655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '+': 42665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('n'): 42675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum + argcnt) < 0) 42685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum += argcnt; 42725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'k': 42765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '-': 42775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('p'): 42785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum - argcnt) < 0) 42795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum -= argcnt; 42835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'r': 42875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 42885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == 0) 42925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 42935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 42945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n; 42955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 42975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (n = 0; n < argcnt; ++n) 42995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor + n] = cmd[1]; 43005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += n - 1; 43015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'R': 43055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = REPLACE; 43085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 's': 43115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 43125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 43165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 43175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 43185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 43195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'v': 43225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) { 43235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 43245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 43265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen] = '\0'; 43275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, es->cbuf, true, 43285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru true); 43295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 43305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = source->line + 1 - 43315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (hlast - hnum); 43325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) 43345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(es->cbuf, es->cbufsize, "%s %d", 43355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 43365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt); 43375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 43385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(es->cbuf, 43395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 43405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbufsize); 43415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = strlen(es->cbuf); 43425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 43435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'x': 43455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 43465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 43505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 43515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->cursor + argcnt); 43525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 43535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'X': 43565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) { 43575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < argcnt) 43605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->cursor; 43615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor - argcnt, es->cursor); 43625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor - argcnt, es->cursor); 43635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor -= argcnt; 43645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 43655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'u': 43695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = es; 43705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = undo; 43715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = t; 43725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'U': 43755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) 43765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, ohnum) < 0) 43785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 43805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = ohnum; 43815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '?': 43845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hnum == hlast) 43855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = -1; 43865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhh */ 43875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '/': 43885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c3 = 1; 43895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 43905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastsearch = *cmd; 43915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 43925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'n': 43935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'N': 43945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == ' ') 43955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == '?') 43975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 1; 43985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 43995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 0; 44005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'N') 44015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = !c1; 44025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c2 = grabsearch(modified, hnum, 44035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1, srchpat)) < 0) { 44045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c3) { 44055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 44065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 44075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 44105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 44115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = c2; 44125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum; 44135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4414811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (argcnt >= 2) { 4415811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* flag from cursor-up command */ 4416811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser es->cursor = argcnt - 2; 4417811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser return (0); 4418811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser } 44195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '_': 44215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 4422c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser bool inspace; 44235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *sp; 44245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (histnum(-1) < 0) 44265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = *histpos(); 44285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define issp(c) (ksh_isspace(c) || (c) == '\n') 44295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) { 44305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 44315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && --argcnt) { 44335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) 44345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 44365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*p) 44395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 44415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 44425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 4443c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = false; 44445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p) { 44455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (issp(*p)) 4446c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = true; 44475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (inspace) { 4448c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser inspace = false; 44495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 44505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = sp; 44545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != es->linelen) 44585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 44595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) { 44605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt++; 44615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 44625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4463811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (putbuf(" ", 1, false) != 0 || 4464811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser putbuf(sp, argcnt, false) != 0) { 44655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 44665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 44675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 44705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 44745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 44755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p; 44765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 44775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 44795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < argcnt; i++) { 44815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = &es->cbuf[es->cursor]; 44825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_islower(*p)) { 44835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_toupper(*p); 44865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ksh_isupper(*p)) { 44875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 44885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 44895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_tolower(*p); 44905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->linelen - 1) 44925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 44935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '#': 44985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 44995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(es->cbuf, es->cbufsize, 45005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &es->linelen); 45015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret >= 0) 45025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 45035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ret); 45045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 450603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 450703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '=': 450803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 450903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('e'): 45105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 1); 45115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 451403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 451503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('i'): 45165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVITABCOMPLETE)) 45175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 45195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 452103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* some annoying AT&T kshs */ 452203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('['): 45235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVIESCCOMPLETE)) 45245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 452503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 452603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '\\': 452703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 452803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('f'): 45295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 45305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 453303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* AT&T ksh */ 453403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case '*': 453503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* Nonstandard vi/ksh */ 453603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra case Ctrl('x'): 45375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(1); 45385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 4539811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 4540811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 4541811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* mksh: cursor movement */ 4542811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser case '[': 4543811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser case 'O': 4544811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser state = VPREFIX2; 4545811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (es->linelen != 0) 4546811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser es->cursor++; 4547811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser insert = INSERT; 4548811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser return (0); 45495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == 0 && es->cursor != 0 && es->cursor >= es->linelen) 45515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 45525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 45545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 45575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudomove(int argcnt, const char *cmd, int sub) 45585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int bcount, i = 0, t; 45605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor = 0; 45615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 45635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'b': 45645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 45655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = backword(argcnt); 45675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'B': 45705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 45715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Backword(argcnt); 45735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'e': 45765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = endword(argcnt); 45795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 45805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 45815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'E': 45845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 45855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Endword(argcnt); 45875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 45885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 45895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 45905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'f': 45925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'F': 45935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 't': 45945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'T': 45955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavecmd = *cmd; 45965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavech = cmd[1]; 45975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* drop through */ 45985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ',': 46005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 46015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fsavecmd == ' ') 46025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = fsavecmd == 'f' || fsavecmd == 'F'; 46045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = fsavecmd > 'a'; 46055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == ',') 46065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = !t; 4607811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if ((ncursor = findch(fsavech, argcnt, tobool(t), 4608811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser tobool(i))) < 0) 46095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && t) 46115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'h': 46155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('h'): 46165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 46175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor - argcnt; 46195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < 0) 46205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ' ': 46245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'l': 46255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 46265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) { 46285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor + argcnt; 46295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 46305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 46315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'w': 46355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 46365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = forwword(argcnt); 46385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'W': 46415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 46425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Forwword(argcnt); 46445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '0': 46475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '^': 46515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && 46535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 46545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '|': 46585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = argcnt; 46595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 46605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 46615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor) 46625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 46635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '$': 46665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 46675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 46685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 46695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 46705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '%': 46735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 46745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && 46755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (i = bracktype(es->cbuf[ncursor])) == 0) 46765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor == es->linelen) 46785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount = 1; 46805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 46815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i > 0) { 46825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor >= es->linelen) 46835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 46855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 46865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = bracktype(es->cbuf[ncursor]); 46895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (t == i) 46905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount++; 46915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (t == -i) 46925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount--; 46935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (bcount != 0); 46945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && i > 0) 46955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 46975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 46995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 47005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruredo_insert(int count) 47065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (count-- > 0) 4708811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (putbuf(ibuf, inslen, tobool(insert == REPLACE)) != 0) 47095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 47105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) 47115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 47125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = 0; 47135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 47145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruyank_range(int a, int b) 47185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yanklen = b - a; 47205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (yanklen != 0) 47215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(ybuf, &es->cbuf[a], yanklen); 47225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubracktype(int ch) 47265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 47285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '(': 47305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 47315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '[': 47335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 47345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '{': 47365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (3); 47375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ')': 47395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 47405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ']': 47425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-2); 47435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '}': 47455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-3); 47465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 47485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 47495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 47535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Non user interface editor routines below here 47545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 47555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_cbuf(void) 47585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 4759811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser memmove(holdbufp, es->cbuf, es->linelen); 47605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = es->linelen; 4761811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser holdbufp[holdlen] = '\0'; 47625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_cbuf(void) 47665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 47685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = holdlen; 4769811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser memmove(es->cbuf, holdbufp, holdlen); 47705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return a new edstate */ 47735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate * 47745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_edstate(struct edstate *old) 47755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *news; 47775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4778811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser news = alloc(sizeof(struct edstate), AEDIT); 4779811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser news->cbuf = alloc(old->cbufsize, AEDIT); 47805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 47815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cbufsize = old->cbufsize; 47825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 47835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 47845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 47855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 47865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_edstate(struct edstate *news, struct edstate *old) 47905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 47925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 47935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 47945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 47955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(old); 47965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 47995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querufree_edstate(struct edstate *old) 48005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 4801811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser afree(old->cbuf, AEDIT); 4802811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser afree(old, AEDIT); 48035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 48065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * this is used for calling x_escape() in complete_word() 48075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 48085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_putbuf(const char *s, size_t len) 48105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 4811811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser return (putbuf(s, len, false)); 48125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 4815811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserputbuf(const char *buf, ssize_t len, bool repl) 48165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0) 48185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 48195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (repl) { 48205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len >= es->cbufsize) 48215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len > es->linelen) 48235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cursor + len; 48245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 48255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen + len >= es->cbufsize) 48265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + len], &es->cbuf[es->cursor], 48285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 48295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen += len; 48305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], buf, len); 48325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += len; 48335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 48345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 48375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudel_range(int a, int b) 48385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != b) 48405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[a], &es->cbuf[b], es->linelen - b); 48415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= b - a; 48425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 4845811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaserfindch(int ch, int cnt, bool forw, bool incl) 48465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 48505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 48535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 48545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) { 48555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor == es->linelen) 48565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 48585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 48595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (es->cbuf[ncursor] != ch); 48625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!incl) { 48645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) 48655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 48665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruforwword(int argcnt) 48745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 48785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 48795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 48805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isalnux(es->cbuf[ncursor]) && 48815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (!ksh_isspace(es->cbuf[ncursor])) 48845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isalnux(es->cbuf[ncursor]) && 48855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor]) && 48865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 48895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 48905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 48915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 48935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubackword(int argcnt) 48975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 48995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 49025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor > 0 && ksh_isspace(es->cbuf[ncursor])) 49035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > 0) { 49055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 49065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 49075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 49085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 49105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 49115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 49125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 49135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruendword(int argcnt) 49225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 49275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 49285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 49295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 49315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 49325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 49335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 49345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 49365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 49375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 49385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 49395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 49415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruForwword(int argcnt) 49485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 49535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isspace(es->cbuf[ncursor]) && 49545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 49555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 49575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 49585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruBackword(int argcnt) 49655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 49705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && ksh_isspace(es->cbuf[ncursor])) 49715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor >= 0 && !ksh_isspace(es->cbuf[ncursor])) 49735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 49745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 49755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEndword(int argcnt) 49815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 49835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 49855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && argcnt--) { 49865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 49875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 49885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 49905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 49915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 49925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 49935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 49945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 49975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 50005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querugrabhist(int save, int n) 50015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 50035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n < 0 || n > hlast) 50055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 50065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n == hlast) { 50075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 50085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 50095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 50105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)histnum(n); 50125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hptr = *histpos()) == NULL) { 501303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra internal_warningf("%s: %s", "grabhist", "bad history array"); 50145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 50155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 50175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 50185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 50195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 50205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 50215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 50225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 50235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 50245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 5027c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glasergrabsearch(int save, int start, int fwd, const char *pat) 50285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 50305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int hist; 50315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int anchored; 50325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((start == 0 && fwd == 0) || (start >= hlast - 1 && fwd == 1)) 50345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 50355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fwd) 50365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start++; 50375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 50385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start--; 50395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru anchored = *pat == '^' ? (++pat, 1) : 0; 50405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hist = findhist(start, fwd, pat, anchored)) < 0) { 5041811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* (start != 0 && fwd && match(holdbufp, pat) >= 0) */ 5042811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (start != 0 && fwd && strcmp(holdbufp, pat) >= 0) { 50435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 50445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 50455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 50465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 50475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 50495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 50505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histnum(hist); 50515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hptr = *histpos(); 50525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 50535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 50545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 50555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 50565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (hist); 50575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 506003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condraredraw_line(bool newl) 50615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 506203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (wbuf_len) 506303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra memset(wbuf[win], ' ', wbuf_len); 50645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (newl) { 50655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 50665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 50675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5068811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (prompt_trunc != -1) 50695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 5070811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col = pwidth; 50715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 50725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 50755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurefresh(int leftside) 50765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (leftside < 0) 50785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru leftside = lastref; 50795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 50805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = leftside; 50815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (outofwin()) 50825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rewindow(); 50835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru display(wbuf[1 - win], wbuf[win], leftside); 50845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 1 - win; 50855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 50885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruoutofwin(void) 50895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col; 50915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->winleft) 50935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 50945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 50955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 50965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur < es->cursor) 50975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = newcol((unsigned char)es->cbuf[cur++], col); 50985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col >= winwidth) 50995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 51005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 51015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 51025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 51045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurewindow(void) 51055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcur, tcol; 51075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur1, holdcol1; 51085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur2, holdcol2; 51095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2 = tcur = 0; 51115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2 = tcol = 0; 51125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcur < es->cursor) { 51135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (tcol - holdcol2 > winwidth / 2) { 51145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2; 51155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2; 51165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur2 = tcur; 51175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol2 = tcol; 51185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcol = newcol((unsigned char)es->cbuf[tcur++], tcol); 51205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcol - holdcol1 > winwidth / 2) 51225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = newcol((unsigned char)es->cbuf[holdcur1++], 51235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1); 51245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->winleft = holdcur1; 51255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 51265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 51285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunewcol(int ch, int col) 51295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\t') 51315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((col | 7) + 1); 51325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (col + char_len(ch)); 51335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 51345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 51365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudisplay(char *wb1, char *wb2, int leftside) 51375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char ch; 51395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *twb1, *twb2, mc; 51405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col, cnt; 51415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncol = 0; 51425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int moreright; 51435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 51455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 51465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright = 0; 51475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 51485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth && cur < es->linelen) { 51495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && leftside) 51505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 51515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ch = es->cbuf[cur]) == '\t') 51525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 51535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 51545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (++col < winwidth && (col & 7) != 0); 51555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (col < winwidth) { 51565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 51575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = '^'; 51585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++col < winwidth) { 51595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch ^ '@'; 51605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 51635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch; 51645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && !leftside) 51685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth - 1; 51695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur++; 51705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor) 51725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 51735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col < winwidth) { 51745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth) { 51755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 51765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 51795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright++; 51805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1 = ' '; 51815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = pwidth; 51835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cnt = winwidth; 51845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 51855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2 = wb2; 51865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 51875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*twb1 != *twb2) { 5188811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (x_col != col) 51895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(col, wb1); 51905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(*twb1); 5191811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col++; 51925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1++; 51945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2++; 51955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 51965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->winleft > 0 && moreright) 519803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 519903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * POSIX says to use * for this but that is a globbing 52005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * character and may confuse people; + is more innocuous 52015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 52025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '+'; 52035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (es->winleft > 0) 52045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '<'; 52055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (moreright) 52065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '>'; 52075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 52085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = ' '; 52095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (mc != morec) { 52105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(pwidth + winwidth + 1, wb1); 52115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(mc); 5212811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col++; 52135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = mc; 52145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5215811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (x_col != ncol) 52165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(ncol, wb1); 52175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 52205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querued_mov_opt(int col, char *wb) 52215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 5222811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (col < x_col) { 5223811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (col + 1 < x_col - col) { 52245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 5225811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (prompt_trunc != -1) 52265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 5227811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col = pwidth; 5228811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (x_col++ < col) 52295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 52305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 5231811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (x_col-- > col) 52325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\b'); 52335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 5235811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser wb = &wb[x_col - pwidth]; 5236811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser while (x_col++ < col) 52375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 52385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5239811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser x_col = col; 52405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* replace word with all expansions (ie, expand word*) */ 52445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 52455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruexpand_word(int cmd) 52465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 524803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int rval = 0, nwords, start, end, i; 52495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 52505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous expansion */ 52525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == EXPAND && buf) { 52535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 52545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 52565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 52575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 52595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 52605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 52615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 526303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_COMMAND_FILE | XCF_FULLPATH; 526403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, es->cbuf, es->linelen, es->cursor, 526503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 52665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 52675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 52685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 52695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 52725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = EXPAND; 52735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 52745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 527503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = 0; 527603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra while (i < nwords) { 52775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_vi_putbuf) != 0) { 52785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 52795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 52805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5281811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser if (++i < nwords && putbuf(" ", 1, false) != 0) { 52825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 52835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 52845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = buf->cursor - end; 52875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && i > 0) 52885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += i; 52895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 52905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 52915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 52925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 0; 52935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 52945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 52955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 52985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querucomplete_word(int cmd, int count) 52995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 53005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 530103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int rval, nwords, start, end, flags; 530203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra size_t match_len; 53035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 53045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *match; 530503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra bool is_unique; 53065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous completion */ 53085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == COMPLETE && buf) { 53095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(buf, 0); 53105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = PRINT; 53115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 53125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == PRINT && buf) { 53145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 53155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 53165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 53175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 53185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 53205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 53215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 53225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 532403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 532503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * XCF_FULLPATH for count 'cause the menu printed by 532603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * print_expansions() was done this way. 53275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 532803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra flags = XCF_COMMAND_FILE; 532903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (count) 533003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra flags |= XCF_FULLPATH; 533103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&flags, es->cbuf, es->linelen, es->cursor, 533203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 53335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 53345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 53355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 53365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count) { 53385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 53395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru count--; 53415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count >= nwords) { 53425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 534303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, 534403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra tobool(flags & XCF_IS_COMMAND)); 53455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 534603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(false); 53475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 53485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 53505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Expand the count'th word to its basename 53515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 535203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (flags & XCF_IS_COMMAND) { 53535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count] + 53545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_basename(words[count], NULL); 53555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If more than one possible match, use full path */ 53565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 53575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i != count && 53585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(words[i] + x_basename(words[i], 53595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru NULL), match) == 0) { 53605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 53615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 53625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 53645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 53655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = strlen(match); 53665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = true; 53675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* expanded = PRINT; next call undo */ 53685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 53695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[0]; 53705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = x_longest_prefix(nwords, words); 537103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* next call will list completions */ 537203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra expanded = COMPLETE; 53735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = nwords == 1; 53745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 53755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 53775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 53785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 53795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 538003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 538103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * escape all shell-sensitive characters and put the result into 538203ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * command buffer 538303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 53845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = x_escape(match, match_len, x_vi_putbuf); 53855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 53865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && is_unique) { 538703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 538803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * If exact match, don't undo. Allows directory completions 53895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to be used (ie, complete the next portion of the path). 53905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 53915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 53925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 539303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* 539403ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * append a space if this is a non-directory match 539503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra * and not a parameter or homedir substitution 539603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra */ 539703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra if (match_len > 0 && match[match_len - 1] != '/' && 5398c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser !(flags & XCF_IS_NOSPACE)) 5399811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser rval = putbuf(" ", 1, false); 54005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 54015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 54025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 54045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 54055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 540603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra /* prevent this from being redone... */ 540703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra lastac = 0; 54085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 54095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 54115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 54145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruprint_expansions(struct edstate *est, int cmd MKSH_A_UNUSED) 54155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 541603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra int start, end, nwords, i; 54175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 54185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 541903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra i = XCF_COMMAND_FILE | XCF_FULLPATH; 542003ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra nwords = x_cf_glob(&i, est->cbuf, est->linelen, est->cursor, 542103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra &start, &end, &words); 54225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 54235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 54245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 54255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 542603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra x_print_expansions(nwords, words, tobool(i & XCF_IS_COMMAND)); 54275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 542803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra redraw_line(false); 54295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 54305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Similar to x_zotc(emacs.c), but no tab weirdness */ 54335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 54345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_zotc(int c) 54355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 54365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 54375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('^'); 54385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c ^= '@'; 54395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 54405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 54415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 54445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_error(void) 54455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 54465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Beem out of any macros as soon as an error occurs */ 54475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 54485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(7); 54495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 54505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 54525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 54535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_macro_reset(void) 54545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 54555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 5456811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser afree(macro.buf, AEDIT); 54575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset((char *)¯o, 0, sizeof(macro)); 54585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 54595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 54605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif /* !MKSH_S_NOVI */ 546103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5462c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser/* called from main.c */ 546303ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condravoid 5464c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_init(void) 546503ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra{ 5466c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser int i, j; 546703ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5468c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* 5469c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * Set edchars to -2 to force initial binding, except 5470c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser * we need default values for some deficient systems… 5471c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser */ 5472c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.erase = edchars.kill = edchars.intr = edchars.quit = 5473c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.eof = -2; 5474c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser /* ^W */ 5475c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser edchars.werase = 027; 547603ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5477811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* command line editing specific memory allocation */ 5478c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser ainit(AEDIT); 5479811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser holdbufp = alloc(LINE, AEDIT); 5480811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser 5481811a575c0f6a5ef00a921d14c1830ef5ae1bd796Thorsten Glaser /* initialise Emacs command line editing mode */ 5482c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_nextcmd = -1; 5483c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 5484c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab = alloc2(X_NTABS, sizeof(*x_tab), AEDIT); 5485c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5486c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[0][j] = XFUNC_insert; 5487c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 1; i < X_NTABS; i++) 5488c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5489c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[i][j] = XFUNC_error; 5490c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 0; i < (int)NELEM(x_defbindings); i++) 5491c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_tab[x_defbindings[i].xdb_tab][x_defbindings[i].xdb_char] 5492c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser = x_defbindings[i].xdb_func; 5493c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser 5494c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifndef MKSH_SMALL 5495c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_atab = alloc2(X_NTABS, sizeof(*x_atab), AEDIT); 5496c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (i = 1; i < X_NTABS; i++) 5497c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser for (j = 0; j < X_TABSZ; j++) 5498c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser x_atab[i][j] = NULL; 549903ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra#endif 5500c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser} 550103ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra 5502c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#ifdef DEBUG_LEAKS 5503c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaservoid 5504c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaserx_done(void) 5505c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser{ 5506c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser if (x_tab != NULL) 5507c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser afreeall(AEDIT); 550803ebf06f4e1112a0e9533b93062d169232c4cbfeGeremy Condra} 5509c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif 5510c2dc5def5e2273bb1d78b4ba032a3903dd0f980cThorsten Glaser#endif /* !MKSH_NO_CMDLINE_EDITING */ 5511