edit.c revision 5155f1c7438ef540d7b25eb70aa1639579795b07
15155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: edit.c,v 1.34 2010/05/20 01:13:07 fgsch Exp $ */ 25155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: edit.h,v 1.8 2005/03/28 21:28:22 deraadt Exp $ */ 35155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: emacs.c,v 1.42 2009/06/02 06:47:47 halex Exp $ */ 45155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* $OpenBSD: vi.c,v 1.26 2009/06/29 22:50:19 martynas Exp $ */ 55155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 65155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/*- 75155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 85155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Thorsten Glaser <tg@mirbsd.org> 95155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Provided that these terms and disclaimer and all copyright notices 115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are retained or reproduced in an accompanying document, permission 125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is granted to deal in this work without restriction, including un- 135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * limited rights to use, publicly perform, distribute, sell, modify, 145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * merge, give away, or sublicence. 155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to 175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * the utmost extent permitted by applicable law, neither express nor 185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * implied; without malicious intent or gross negligence. In no event 195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * may a licensor, author or contributor be held liable for indirect, 205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * direct, other damage, loss, or other issues arising in any way out 215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of dealing in the work, even if advised of the possibility of such 225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * damage or existence of a defect, except proven that it results out 235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of said person's immediate fault when using the work as intended. 245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "sh.h" 275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.196 2010/07/25 11:35:40 tg Exp $"); 295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * in later versions we might use libtermcap for this, but since external 325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * dependencies are problematic, this has not yet been decided on; another 335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * good string is "\033c" except on hardware terminals like the DEC VT420 345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * which do a full power cycle then... 355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CLS_STRING 375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CLS_STRING "\033[;H\033[J" 385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_CLRTOEOL_STRING 405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MKSH_CLRTOEOL_STRING "\033[K" 415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tty driver characters we are interested in */ 445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef struct { 455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int erase; 465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int kill; 475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int werase; 485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int intr; 495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int quit; 505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int eof; 515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} X_chars; 525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic X_chars edchars; 545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* x_fc_glob() flags */ 565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_COMMAND BIT(0) /* Do command completion */ 575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_FILE BIT(1) /* Do file completion */ 585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_FULLPATH BIT(2) /* command completion: store full path */ 595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XCF_COMMAND_FILE (XCF_COMMAND|XCF_FILE) 605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char editmode; 625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int xx_cols; /* for Emacs mode */ 635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int modified; /* buffer has been "modified" */ 645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char holdbuf[LINE]; /* place to hold last edit buffer */ 655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_getc(void); 675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_putcf(int); 685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic bool x_mode(bool); 695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_do_comment(char *, int, int *); 705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_print_expansions(int, char *const *, bool); 715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_cf_glob(int, const char *, int, int, int *, int *, char ***, 725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool *); 735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_longest_prefix(int, char *const *); 745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_basename(const char *, const char *); 755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_free_words(int, char **); 765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_escape(const char *, size_t, int (*)(const char *, size_t)); 775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_emacs(char *, size_t); 785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_init_emacs(void); 795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_init_prompt(void); 805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_vi(char *, size_t); 825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_flush() shf_flush(shl_out) 855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_putc(c) x_putcf(c) 875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_putc(c) shf_putc((c), shl_out) 895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int path_order_cmp(const void *aa, const void *bb); 925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *add_glob(const char *, int) 935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NONNULL((nonnull (1))) 945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_BOUNDED(string, 1, 2); 955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void glob_table(const char *, XPtrV *, struct table *); 965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void glob_path(int flags, const char *, XPtrV *, const char *); 975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_file_glob(int, const char *, int, char ***) 985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NONNULL((nonnull (2))) 995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_BOUNDED(string, 2, 3); 1005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_command_glob(int, const char *, int, char ***) 1015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NONNULL((nonnull (2))) 1025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_BOUNDED(string, 2, 3); 1035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_locate_word(const char *, int, int, int *, bool *); 1045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_getmbc(char *); 1065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_rebuildline(const char *); 1075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ generic editing functions +++ */ 1095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Called from main */ 1115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvoid 1125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_init(void) 1135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* set to -2 to force initial binding */ 1155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.erase = edchars.kill = edchars.intr = edchars.quit = 1165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.eof = -2; 1175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* default value for deficient systems */ 1185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.werase = 027; /* ^W */ 1195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_init_emacs(); 1205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * read an edited command line 1245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint 1265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_read(char *buf, size_t len) 1275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 1295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(true); 1315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 1325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (Flag(FEMACS) || Flag(FGMACS)) 1335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_emacs(buf, len); 1345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 1355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (Flag(FVI)) 1365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_vi(buf, len); 1375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 1395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = -1; /* internal error */ 1405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 0; 1415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 1425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 1435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* tty I/O */ 1465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 1485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_getc(void) 1495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char c; 1515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n; 1525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((n = blocking_read(STDIN_FILENO, &c, 1)) < 0 && errno == EINTR) 1545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (trap) { 1555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 1565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru runtraps(0); 1575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef SIGWINCH 1585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (got_winch) { 1595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru change_winsz(); 1605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_cols != xx_cols && editmode == 1) { 1615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* redraw line in Emacs mode */ 1625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xx_cols = x_cols; 1635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_rebuildline(MKSH_CLRTOEOL_STRING); 1645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 1675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(true); 1685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 1695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((n == 1) ? (int)(unsigned char)c : -1); 1705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 1735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_putcf(int c) 1745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_putc(c, shl_out); 1765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 1775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/********************************* 1795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Misc common code for vi/emacs * 1805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *********************************/ 1815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Handle the commenting/uncommenting of a line. 1835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Returns: 1845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 1 if a carriage return is indicated (comment added) 1855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 if no return (comment removed) 1865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * -1 if there is an error (not enough room for comment chars) 1875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If successful, *lenp contains the new length. Note: cursor should be 1885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * moved to the start of the line after (un)commenting. 1895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 1905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 1915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_do_comment(char *buf, int bsize, int *lenp) 1925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 1935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j, len = *lenp; 1945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0) 1965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); /* somewhat arbitrary - it's what AT&T ksh does */ 1975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 1985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Already commented? */ 1995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[0] == '#') { 2005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool saw_nl = false; 2015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0, i = 1; i < len; i++) { 2035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!saw_nl || buf[i] != '#') 2045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[j++] = buf[i]; 2055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saw_nl = buf[i] == '\n'; 2065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *lenp = j; 2085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 2095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 2105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n = 1; 2115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* See if there's room for the #s - 1 per \n */ 2135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < len; i++) 2145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[i] == '\n') 2155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n++; 2165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len + n >= bsize) 2175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 2185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Now add them... */ 2195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = len, j = len + n; --i >= 0; ) { 2205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[i] == '\n') 2215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[--j] = '#'; 2225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[--j] = buf[i]; 2235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[0] = '#'; 2255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *lenp += n; 2265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 2275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 2295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/**************************************************** 2315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Common file/command completion code for vi/emacs * 2325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ****************************************************/ 2335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 2355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_print_expansions(int nwords, char * const *words, bool is_command) 2365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool use_copy = false; 2385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int prefix_len; 2395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV l = { NULL, NULL, NULL }; 2405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Check if all matches are in the same directory (in this 2425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * case, we want to omit the directory name) 2435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!is_command && 2455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (prefix_len = x_longest_prefix(nwords, words)) > 0) { 2465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 2475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Special case for 1 match (prefix is whole word) */ 2495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1) 2505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = x_basename(words[0], NULL); 2515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Any (non-trailing) slashes in non-common word suffixes? */ 2525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 2535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_basename(words[i] + prefix_len, NULL) > 2545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len) 2555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 2565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* All in same directory? */ 2575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i == nwords) { 2585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (prefix_len > 0 && words[0][prefix_len - 1] != '/') 2595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len--; 2605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru use_copy = true; 2615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(l, nwords + 1); 2625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 2635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(l, words[i] + prefix_len); 2645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(l, NULL); 2655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 2675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 2685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Enumerate expansions 2695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 2715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 2725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pr_list(use_copy ? (char **)XPptrv(l) : words); 2735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (use_copy) 2755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPfree(l); /* not x_free_words() */ 2765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 2775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/** 2795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Do file globbing: 2805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - appends * to (copy of) str if no globbing chars found 2815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - does expansion, checks for no match, etc. 2825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - sets *wordsp to array of matching strings 2835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - returns number of matching strings 2845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 2855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 2865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_file_glob(int flags MKSH_A_UNUSED, const char *str, int slen, char ***wordsp) 2875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 2885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *toglob, **words; 2895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int nwords, i, idx; 2905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool escaping; 2915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV w; 2925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct source *s, *sold; 2935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (slen < 0) 2955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 2965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob = add_glob(str, slen); 2985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 2995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* remove all escaping backward slashes */ 3005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru escaping = false; 3015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0, idx = 0; toglob[i]; i++) { 3025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (toglob[i] == '\\' && !escaping) { 3035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru escaping = true; 3045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 3055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* specially escape escaped [ or $ or ` for globbing */ 3075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (escaping && (toglob[i] == '[' || 3085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[i] == '$' || toglob[i] == '`')) 3095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[idx++] = QCHAR; 3105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[idx] = toglob[i]; 3125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru idx++; 3135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (escaping) 3145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru escaping = false; 3155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[idx] = '\0'; 3175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 3195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Convert "foo*" (toglob) to an array of strings (words) 3205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sold = source; 3225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s = pushs(SWSTR, ATEMP); 3235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s->start = s->str = toglob; 3245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = s; 3255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (yylex(ONEWORD | LQCHAR) != LWORD) { 3265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = sold; 3275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru internal_warningf("fileglob: substitute error"); 3285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 3295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru source = sold; 3315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(w, 32); 3325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand(yylval.cp, &w, DOGLOB | DOTILDE | DOMARKDIRS); 3335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(w, NULL); 3345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = (char **)XPclose(w); 3355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (nwords = 0; words[nwords]; nwords++) 3375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 3385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1) { 3395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct stat statb; 3405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Check if globbing failed (returned glob pattern), 3425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * but be careful (E.g. toglob == "ab*" when the file 3435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * "ab*" exists is not an error). 3445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Also, check for empty result - happens if we tried 3455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to glob something which evaluated to an empty 3465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * string (e.g., "$FOO" when there is no FOO, etc). 3475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 3485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((strcmp(words[0], toglob) == 0 && 3495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru stat(words[0], &statb) < 0) || 3505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[0][0] == '\0') { 3515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 3525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = NULL; 3535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = 0; 3545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 3565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(toglob, ATEMP); 3575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((*wordsp = nwords ? words : NULL) == NULL && words != NULL) 3595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 3605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 3625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 3635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Data structure used in x_command_glob() */ 3655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct path_order_info { 3665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *word; 3675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int base; 3685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int path_order; 3695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 3705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Compare routine used in x_command_glob() */ 3725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 3735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querupath_order_cmp(const void *aa, const void *bb) 3745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 3755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const struct path_order_info *a = (const struct path_order_info *)aa; 3765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const struct path_order_info *b = (const struct path_order_info *)bb; 3775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int t; 3785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = strcmp(a->word + a->base, b->word + b->base); 3805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (t ? t : a->path_order - b->path_order); 3815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 3825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 3845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_command_glob(int flags, const char *str, int slen, char ***wordsp) 3855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 3865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *toglob, *pat, *fpath; 3875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int nwords; 3885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPtrV w; 3895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct block *l; 3905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (slen < 0) 3925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 3935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob = add_glob(str, slen); 3955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 3965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Convert "foo*" (toglob) to a pattern for future use */ 3975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pat = evalstr(toglob, DOPAT | DOTILDE); 3985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(toglob, ATEMP); 3995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPinit(w, 32); 4015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &keywords); 4035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &aliases); 4045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &builtins); 4055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (l = e->loc; l; l = l->next) 4065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_table(pat, &w, &l->funs); 4075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_path(flags, pat, &w, path); 4095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((fpath = str_val(global("FPATH"))) != null) 4105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_path(flags, pat, &w, fpath); 4115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = XPsize(w); 4135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!nwords) { 4155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = NULL; 4165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPfree(w); 4175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 4185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort entries */ 4205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (flags & XCF_FULLPATH) { 4215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort by basename, then path order */ 4225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct path_order_info *info, *last_info = NULL; 4235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = (char **)XPptrv(w); 4245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, path_order = 0; 4255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info = (struct path_order_info *) 4275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru alloc(nwords * sizeof(struct path_order_info), ATEMP); 4285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) { 4295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].word = words[i]; 4305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].base = x_basename(words[i], NULL); 4315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!last_info || info[i].base != last_info->base || 4325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strncmp(words[i], last_info->word, info[i].base) != 0) { 4335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru last_info = &info[i]; 4345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru path_order++; 4355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru info[i].path_order = path_order; 4375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru qsort(info, nwords, sizeof(struct path_order_info), 4395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru path_order_cmp); 4405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 4415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[i] = info[i].word; 4425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(info, ATEMP); 4435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 4445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Sort and remove duplicate entries */ 4455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = (char **)XPptrv(w); 4465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j; 4475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru qsort(words, nwords, sizeof(void *), xstrcmp); 4495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = j = 0; i < nwords - 1; i++) { 4505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strcmp(words[i], words[i + 1])) 4515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j++] = words[i]; 4525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 4535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[i], ATEMP); 4545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j++] = words[i]; 4565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = j; 4575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru w.cur = (void **)&words[j]; 4585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(w, NULL); 4615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = (char **)XPclose(w); 4625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 4645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 4655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define IS_WORDC(c) (!ctype(c, C_LEX1) && (c) != '\'' && (c) != '"' && \ 4675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (c) != '`' && (c) != '=' && (c) != ':') 4685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 4705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_locate_word(const char *buf, int buflen, int pos, int *startp, 4715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool *is_commandp) 4725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 4735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end; 4745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Bad call? Probably should report error */ 4765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (pos < 0 || pos > buflen) { 4775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *startp = pos; 4785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *is_commandp = false; 4795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 4805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* The case where pos == buflen happens to take care of itself... */ 4825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start = pos; 4845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Keep going backwards to start of word (has effect of allowing 4855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * one blank after the end of a word) 4865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 4875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; (start > 0 && IS_WORDC(buf[start - 1])) || 4885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (start > 1 && buf[start - 2] == '\\'); start--) 4895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 4905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Go forwards to end of word */ 4915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (end = start; end < buflen && IS_WORDC(buf[end]); end++) { 4925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[end] == '\\' && (end + 1) < buflen) 4935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru end++; 4945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 4955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 4965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_commandp) { 4975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool iscmd; 4985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int p = start - 1; 4995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Figure out if this is a command */ 5015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (p >= 0 && ksh_isspace(buf[p])) 5025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p--; 5035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru iscmd = p < 0 || vstrchr(";|&()`", buf[p]); 5045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (iscmd) { 5055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If command has a /, path, etc. is not searched; 5065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * only current directory is searched which is just 5075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * like file globbing. 5085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = start; p < end; p++) 5105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf[p] == '/') 5115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 5125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru iscmd = p == end; 5135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *is_commandp = iscmd; 5155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *startp = start; 5175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (end - start); 5195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 5205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 5225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_cf_glob(int flags, const char *buf, int buflen, int pos, int *startp, 5235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int *endp, char ***wordsp, bool *is_commandp) 5245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 5255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int len, nwords; 5265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words = NULL; 5275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command; 5285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru len = x_locate_word(buf, buflen, pos, startp, &is_command); 5305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(flags & XCF_COMMAND)) 5315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_command = false; 5325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Don't do command globing on zero length strings - it takes too 5335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * long and isn't very useful. File globs are more likely to be 5345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * useful, so allow these. 5355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0 && is_command) 5375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 5385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = is_command ? 5405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_command_glob(flags, buf + *startp, len, &words) : 5415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_file_glob(flags, buf + *startp, len, &words); 5425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 5435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = NULL; 5445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 5455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_commandp) 5475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *is_commandp = is_command; 5485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *wordsp = words; 5495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *endp = *startp + len; 5505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nwords); 5525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 5535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Given a string, copy it and possibly add a '*' to the end. 5555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The new string is returned. 5565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 5585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruadd_glob(const char *str, int slen) 5595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 5605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *toglob, *s; 5615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool saw_slash = false; 5625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (slen < 0) 5645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (NULL); 5655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* for clang's static analyser, the nonnull attribute isn't enough */ 5675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mkssert(str != NULL); 5685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strndupx(toglob, str, slen + 1, ATEMP); /* + 1 for "*" */ 5705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[slen] = '\0'; 5715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 5735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If the pathname contains a wildcard (an unquoted '*', 5745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * '?', or '[') or parameter expansion ('$'), or a ~username 5755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * with no trailing slash, then it is globbed based on that 5765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * value (i.e., without the appended '*'). 5775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (s = toglob; *s; s++) { 5795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*s == '\\' && s[1]) 5805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s++; 5815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (*s == '*' || *s == '[' || *s == '?' || *s == '$' || 5825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (s[1] == '(' /*)*/ && /* *s in '*','?' already checked */ 5835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*s == '+' || *s == '@' || *s == '!'))) 5845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 5855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (*s == '/') 5865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saw_slash = true; 5875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*s && (*toglob != '~' || saw_slash)) { 5895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[slen] = '*'; 5905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru toglob[slen + 1] = '\0'; 5915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 5925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (toglob); 5935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 5945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 5955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Find longest common prefix 5975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 5985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 5995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_longest_prefix(int nwords, char * const * words) 6005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 6015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j, prefix_len; 6025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p; 6035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords <= 0) 6055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 6065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = strlen(words[0]); 6085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 1; i < nwords; i++) 6095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0, p = words[i]; j < prefix_len; j++) 6105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p[j] != words[0][j]) { 6115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix_len = j; 6125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 6135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 6145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (prefix_len); 6155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 6185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_free_words(int nwords, char **words) 6195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 6205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (nwords) 6215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[--nwords], ATEMP); 6225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words, ATEMP); 6235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Return the offset of the basename of string s (which ends at se - need not 6265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be null terminated). Trailing slashes are ignored. If s is just a slash, 6275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * then the offset is 0 (actually, length - 1). 6285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * s Return 6295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc 1 6305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc/ 1 6315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc// 1 6325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /etc/fo 5 6335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * foo 0 6345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * /// 2 6355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 6365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 6385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_basename(const char *s, const char *se) 6395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 6405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *p; 6415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (se == NULL) 6435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru se = s + strlen(s); 6445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (s == se) 6455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 6465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Skip trailing slashes */ 6485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = se - 1; p > s && *p == '/'; p--) 6495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 6505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; p > s && *p != '/'; p--) 6515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 6525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*p == '/' && p + 1 < se) 6535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 6545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (p - s); 6565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Apply pattern matching to a table: all table entries that match a pattern 6605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * are added to wp. 6615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 6635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruglob_table(const char *pat, XPtrV *wp, struct table *tp) 6645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 6655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tstate ts; 6665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *te; 6675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ktwalk(&ts, tp); 6695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((te = ktnext(&ts))) 6705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (gmatchx(te->name, pat, false)) { 6715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 6725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(cp, te->name, ATEMP); 6745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XPput(*wp, cp); 6755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 6765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 6775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 6795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruglob_path(int flags, const char *pat, XPtrV *wp, const char *lpath) 6805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 6815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *sp, *p; 6825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xp, **words; 6835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int staterr, pathlen, patlen, oldsize, newsize, i, j; 6845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XString xs; 6855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 6865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru patlen = strlen(pat) + 1; 6875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = lpath; 6885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Xinit(xs, xp, patlen + 128, ATEMP); 6895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (sp) { 6905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xp = Xstring(xs, xp); 6915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(p = cstrchr(sp, ':'))) 6925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = sp + strlen(sp); 6935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pathlen = p - sp; 6945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (pathlen) { 6955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Copy sp into xp, stuffing any MAGIC characters 6965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * on the way 6975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 6985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *s = sp; 6995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XcheckN(xs, xp, pathlen * 2); 7015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (s < p) { 7025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ISMAGIC(*s)) 7035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = MAGIC; 7045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = *s++; 7055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xp++ = '/'; 7075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pathlen++; 7085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 7105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XcheckN(xs, xp, patlen); 7115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(xp, pat, patlen); 7125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru oldsize = XPsize(*wp); 7145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru glob_str(Xstring(xs, xp), wp, 1); /* mark dirs */ 7155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru newsize = XPsize(*wp); 7165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Check that each match is executable... */ 7185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words = (char **)XPptrv(*wp); 7195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = j = oldsize; i < newsize; i++) { 7205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru staterr = 0; 7215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((search_access(words[i], X_OK, &staterr) >= 0) || 7225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (staterr == EISDIR)) { 7235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru words[j] = words[i]; 7245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(flags & XCF_FULLPATH)) 7255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(words[j], words[j] + pathlen, 7265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlen(words[j] + pathlen) + 1); 7275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 7285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 7295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(words[i], ATEMP); 7305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wp->cur = (void **)&words[j]; 7325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*sp++) 7345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 7355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Xfree(xs, xp); 7375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 7385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * if argument string contains any special characters, they will 7415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be escaped and the result will be put into edit buffer by 7425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * keybinding-specific function 7435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 7445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 7455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_escape(const char *s, size_t len, int (*putbuf_func)(const char *, size_t)) 7465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 7475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t add = 0, wlen = len; 7485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *ifs = str_val(local("IFS", 0)); 7495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rval = 0; 7505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (wlen - add > 0) 7525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (vstrchr("\"#$&'()*:;<=>?[\\`{|}", s[add]) || 7535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vstrchr(ifs, s[add])) { 7545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf_func(s, add) != 0) { 7555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 7565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 7575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 7585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func(s[add] == '\n' ? "'" : "\\", 1); 7595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func(&s[add], 1); 7605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (s[add] == '\n') 7615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf_func("'", 1); 7625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru add++; 7645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wlen -= add; 7655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru s += add; 7665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru add = 0; 7675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 7685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ++add; 7695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (wlen > 0 && rval == 0) 7705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = putbuf_func(s, wlen); 7715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 7735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 7745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ emacs editing mode +++ */ 7775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic Area aedit; 7795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define AEDIT &aedit /* area for kill ring and macro defns */ 7805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* values returned by keyboard functions */ 7825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KSTD 0 7835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KEOL 1 /* ^M, ^J */ 7845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KINTR 2 /* ^G, ^C */ 7855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct x_ftab { 7875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int (*xf_func)(int c); 7885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *xf_name; 7895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru short xf_flags; 7905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 7915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct x_defbindings { 7935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_func; /* XFUNC_* */ 7945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_tab; 7955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char xdb_char; 7965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 7975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 7985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_ARG 1 /* command takes number prefix */ 7995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_NOBIND 2 /* not allowed to bind to function */ 8005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XF_PREFIX 4 /* function sets prefix */ 8015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Separator for completion */ 8035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_cfs(c) ((c) == ' ' || (c) == '\t' || (c) == '"' || (c) == '\'') 8045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Separator for motion */ 8055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_mfs(c) (!(ksh_isalnux(c) || (c) == '$' || ((c) & 0x80))) 8065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_NTABS 3 /* normal, meta1, meta2 */ 8085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_TABSZ 256 /* size of keydef tables etc */ 8095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Arguments for do_complete() 8115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 0 = enumerate M-= complete as much as possible and then list 8125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 1 = complete M-Esc 8135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 2 = list M-? 8145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querutypedef enum { 8165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_LIST, /* list the possible completions */ 8175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_COMPLETE, /* complete to longest prefix */ 8185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CT_COMPLIST /* complete and then list (if non-exact) */ 8195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} Comp_type; 8205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The following are used for my horizontal scrolling stuff 8235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xbuf; /* beg input buffer */ 8255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xend; /* end input buffer */ 8265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xcp; /* current position */ 8275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xep; /* current end */ 8285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xbp; /* start of visible portion of input buffer */ 8295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xlp; /* last char visible on screen */ 8305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_adj_ok; 8315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we use x_adj_done so that functions can tell 8335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * whether x_adjust() has been called while they are active. 8345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 8355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_adj_done; 8365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_col; 8385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_displen; 8395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_arg; /* general purpose arg */ 8405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_arg_defaulted; /* x_arg not explicitly set; defaulted to 1 */ 8415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int xlp_valid; 8435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char **x_histp; /* history position */ 8455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_nextcmd; /* for newline-and-next */ 8465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *xmp; /* mark pointer */ 8475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_last_command; 8485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char (*x_tab)[X_TABSZ]; /* key definition */ 8495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 8505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *(*x_atab)[X_TABSZ]; /* macro definitions */ 8515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 8525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic unsigned char x_bound[(X_TABSZ * X_NTABS + 7) / 8]; 8535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define KILLSIZE 20 8545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *killstack[KILLSIZE]; 8555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int killsp, killtp; 8565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_curprefix; 8575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 8585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *macroptr = NULL; /* bind key macro active? */ 8595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 8605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 8615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int cur_col; /* current column on line */ 8625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int pwidth; /* width of prompt */ 8635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int prompt_trunc; /* how much of prompt to truncate */ 8645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int winwidth; /* width of window */ 8655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *wbuf[2]; /* window buffers */ 8665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int wbuf_len; /* length of window buffers (x_cols - 3) */ 8675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int win; /* window buffer in use */ 8685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char morec; /* more character at right of window */ 8695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastref; /* argument to last refresh() */ 8705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int holdlen; /* length of holdbuf */ 8715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 8725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int prompt_redraw; /* 0 if newline forced after prompt */ 8735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 8745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_ins(const char *); 8755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_delete(int, int); 8765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_bword(void); 8775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_fword(int); 8785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_goto(char *); 8795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_bs3(char **); 8805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size_str(char *); 8815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_size2(char *, char **); 8825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zots(char *); 8835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc2(int); 8845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_zotc3(char **); 8855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_load_hist(char **); 8865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search(char *, int, int); 8875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 8885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_search_dir(int); 8895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 8905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_match(char *, char *); 8915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_redraw(int); 8925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_push(int); 8935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_mapin(const char *, Area *) 8945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru MKSH_A_NONNULL((nonnull (1))); 8955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_mapout(int); 8965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_mapout2(int, char **); 8975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_print(int, int); 8985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_adjust(void); 8995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_ungetc(int); 9005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_e_getc(void); 9015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc2(int); 9025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_putc3(const char **); 9035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_e_puts(const char *); 9045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_fold_case(int); 9065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 9075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char *x_lastcp(void); 9085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void do_complete(int, Comp_type); 9095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int unget_char = -1; 9115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_do_ins(const char *, size_t); 9135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void bind_if_not_bound(int, int, int); 9145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum emacs_funcs { 9165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ENUMS 9175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 9185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru XFUNC_MAX 9195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_DEFNS 9225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 9235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const struct x_ftab x_ftab[] = { 9255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define EMACSFN_ITEMS 9265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#include "emacsfn.h" 9275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 0, NULL, 0 } 9285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 9295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 9305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct x_defbindings const x_defbindings[] = { 9315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('?') }, 9325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('?') }, 9335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_eot_del, 0, CTRL('D') }, 9345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_back, 0, CTRL('H') }, 9355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, CTRL('H') }, 9365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_bword, 1, 'h' }, 9375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_bword, 1, 'b' }, 9385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_fword, 1, 'f' }, 9395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_fword, 1, 'd' }, 9405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 0, CTRL('B') }, 9415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 0, CTRL('F') }, 9425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_forw, 0, CTRL(']') }, 9435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_char_back, 1, CTRL(']') }, 9445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('M') }, 9455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_newline, 0, CTRL('J') }, 9465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_of_text, 0, CTRL('_') }, 9475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_abort, 0, CTRL('G') }, 9485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 0, CTRL('P') }, 9495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 0, CTRL('N') }, 9505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_nl_next_com, 0, CTRL('O') }, 9515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist, 0, CTRL('R') }, 9525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_beg_hist, 1, '<' }, 9535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_end_hist, 1, '>' }, 9545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_goto_hist, 1, 'g' }, 9555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 0, CTRL('E') }, 9565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 0, CTRL('A') }, 9575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_draw_line, 0, CTRL('L') }, 9585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_cls, 1, CTRL('L') }, 9595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta1, 0, CTRL('[') }, 9605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 0, CTRL('X') }, 9615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill, 0, CTRL('K') }, 9625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_yank, 0, CTRL('Y') }, 9635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta_yank, 1, 'y' }, 9645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('^') }, 9655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comment, 1, '#' }, 9665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_transpose, 0, CTRL('T') }, 9675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_complete, 1, CTRL('[') }, 9685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 0, CTRL('I') }, 9695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_list, 1, '=' }, 9705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_enumerate, 1, '?' }, 9715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_expand, 1, '*' }, 9725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_file, 1, CTRL('X') }, 9735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_comp_comm, 2, CTRL('[') }, 9745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_comm, 2, '?' }, 9755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_list_file, 2, CTRL('Y') }, 9765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_mark, 1, ' ' }, 9775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_kill_region, 0, CTRL('W') }, 9785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_xchg_point_mark, 2, CTRL('X') }, 9795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_literal, 0, CTRL('V') }, 9805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_version, 1, CTRL('V') }, 9815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '.' }, 9825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_histword, 1, '_' }, 9835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '0' }, 9845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '1' }, 9855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '2' }, 9865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '3' }, 9875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '4' }, 9885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '5' }, 9895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '6' }, 9905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '7' }, 9915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '8' }, 9925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_set_arg, 1, '9' }, 9935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 9945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'U' }, 9955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_upper, 1, 'u' }, 9965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'L' }, 9975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_lower, 1, 'l' }, 9985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'C' }, 9995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_fold_capitalise, 1, 'c' }, 10005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 10015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* These for ansi arrow keys: arguablely shouldn't be here by 10025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * default, but its simpler/faster/smaller than using termcap 10035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * entries. 10045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 10055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, '[' }, 10065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_meta2, 1, 'O' }, 10075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_prev_com, 2, 'A' }, 10085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_next_com, 2, 'B' }, 10095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_forw, 2, 'C' }, 10105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_back, 2, 'D' }, 10115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 10125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_vt_hack, 2, '1' }, 10135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin | 0x80, 2, '7' }, 10145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_begin, 2, 'H' }, 10155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '4' }, 10165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end | 0x80, 2, '8' }, 10175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_mv_end, 2, 'F' }, 10185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_del_char | 0x80, 2, '3' }, 10195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_up | 0x80, 2, '5' }, 10205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_search_hist_dn | 0x80, 2, '6' }, 10215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more non-standard ones */ 10225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { XFUNC_edit_line, 2, 'e' } 10235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 10245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 10255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 10275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_modified(void); 10285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 10295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_modified(void) 10305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 10315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) { 10325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 10335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 10345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 10365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f) 10375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 10385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define x_modified() do { \ 10395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) { \ 10405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; \ 10415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; \ 10425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } \ 10435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} while (/* CONSTCOND */ 0) 10445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define XFUNC_VALUE(f) (f & 0x7F) 10455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 10465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 10485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getmbc(char *sbuf) 10495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 10505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, pos = 0; 10515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf = (unsigned char *)sbuf; 10525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset(buf, 0, 4); 10545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 10555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 10565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 10575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 10585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xC2) && (buf[0] < 0xF0)) { 10595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 10605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 10615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 10625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c & 0xC0) != 0x80) { 10635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 10645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 10655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c; 10675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((buf[0] >= 0xE0) && (buf[0] < 0xF0)) { 10695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 10705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[pos++] = c = x_e_getc(); 10715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 10725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 10735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (pos); 10765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 10775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 10795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_init_prompt(void) 10805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 10815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = promptlen(prompt); 10825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 1; 10835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_redraw = 1; 10845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 10855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col %= xx_cols; 10865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2 - x_col; 10875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_done = 0; 10885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, 0); 10905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_displen < 1) { 10915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 10925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2; 10935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 10945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_redraw = 0; 10955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 10965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 10975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 10985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 10995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_emacs(char *buf, size_t len) 11005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c, i; 11025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 11035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf = buf; xend = buf + len; 11055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xcp = xep = buf; 11065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 11075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 11085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 11095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 11105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr + 1; 11115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = XFUNC_error; 11125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xx_cols = x_cols; 11145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_init_prompt(); 11155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_nextcmd >= 0) { 11175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int off = source->line - x_nextcmd; 11185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (histptr - history >= off) 11195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr - off); 11205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_nextcmd = -1; 11215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 1; 11235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (1) { 11245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 11255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 11265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 11275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_curprefix == -1 ? XFUNC_insert : 11295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[x_curprefix][c]; 11305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 11315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 11325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 11335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = x_e_getc()) != '~') 11345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(i); 11355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* avoid bind key macro recursion */ 11385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr && f == XFUNC_ins_string) 11395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 11405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 11415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX) && 11435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command != XFUNC_set_arg) { 11445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 11455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg_defaulted = 1; 11465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = c | (x_curprefix << 8); 11485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 0; 11495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((*x_ftab[f].xf_func)(i)) { 11505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KSTD: 11515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_ftab[f].xf_flags & XF_PREFIX)) 11525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_last_command = f; 11535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 11545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KEOL: 11555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 11565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 11575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case KINTR: /* special case for interrupt */ 11585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(SIGINT); 11595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 11605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 11615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ad-hoc hack for fixing the cursor position */ 11635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp); 11645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 11665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 11685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_insert(int c) 11695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 11705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static int left = 0, pos, save_arg; 11715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char str[4]; 11725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 11735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 11745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Should allow tab and control chars. 11755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 11765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == 0) { 11775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru invmbs: 11785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 11795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 11805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 11815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) { 11835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (((c & 0xC0) == 0x80) && left) { 11845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos++] = c; 11855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!--left) { 11865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 11875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = save_arg; 11885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 11895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 11905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 11925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 11935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 11945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_curprefix == -1) { 11955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* flush invalid multibyte */ 11965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[pos] = '\0'; 11975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (save_arg--) 11985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 11995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c >= 0xC2) && (c < 0xE0)) 12025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 1; 12035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if ((c >= 0xE0) && (c < 0xF0)) 12045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 2; 12055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (c > 0x7F) 12065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto invmbs; 12075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 12085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 12095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (left) { 12105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_arg = x_arg; 12115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pos = 1; 12125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 12135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru left = 0; 12175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[0] = c; 12185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru str[1] = '\0'; 12195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) 12205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(str); 12215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 12255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins_string(int c) 12275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 12285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = x_atab[c >> 8][c & 255]; 12295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 12305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we no longer need to bother checking if macroptr is 12315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * not NULL but first char is NUL; x_e_getc() does it 12325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 12365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_do_ins(const char *cp, size_t len) 12395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 12405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep + len >= xend) { 12415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 12425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 12435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp + len, xcp, xep - xcp + 1); 12455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp, cp, len); 12465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp += len; 12475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep += len; 12485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 12495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 12505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_ins(const char *s) 12545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 12555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 12565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 12575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_do_ins(s, strlen(s)) < 0) 12595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 12605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 12615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_zots() may result in a call to x_adjust() 12625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we want xcp to reflect the new position. 12635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 12645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 12655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 12665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = (xcp >= xlp); 12675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(cp); 12685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (adj == x_adj_done) { /* has x_adjust() been called? */ 12695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no */ 12705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 12715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 12725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 12735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xlp == xep - 1) 12755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 12765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 1; 12775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 12785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_back(int c MKSH_A_UNUSED) 12825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 12835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i = 0; 12845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 12865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 12875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 12895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 12905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 12915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while ((++i < x_arg) && (xcp != xbuf)); 12925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 12935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 12945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 12955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 12965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 12975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_char(int c MKSH_A_UNUSED) 12985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 12995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp, *cp2; 13005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i = 0; 13015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 13035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i < x_arg) { 13045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 13055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 13065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 13075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 13085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i++; 13095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!i) { 13125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 13135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(i, false); 13165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Delete nc chars to the right of the cursor (including cursor position) */ 13205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 13215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_delete(int nc, int push) 13225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, nb, nw; 13245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 13255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nc == 0) 13275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 13285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = 0; 13305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xcp; 13315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nc; ++i) { 13325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 13335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int j; 13345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(cp, &cp2); 13365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 13375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 13385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 13395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw += j; 13405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb = cp - xcp; 13425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* nc = i; */ 13435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp != NULL && xmp > xcp) { 13455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp + nb > xmp) 13465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 13475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 13485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp -= nb; 13495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This lets us yank a word we have deleted. 13525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (push) 13545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(nb); 13555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep -= nb; 13575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(xcp, xcp + nb, xep - xcp + 1); /* Copies the NUL */ 13585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 0; /* don't redraw */ 13595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 13605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xcp); 13615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 13625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * if we are already filling the line, 13635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * there is no need to ' ','\b'. 13645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * But if we must, make sure we do the minimum. 13655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 13665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i = xx_cols - 2 - x_col) > 0 || xep - xlp == 0) { 13675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nw = i = (nw < i) ? nw : i; 13685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 13695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 13705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col == xx_cols - 2) { 13715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2((xep > xlp) ? '>' : (xbp > xbuf) ? '<' : ' '); 13725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ++nw; 13735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (nw--) 13755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 13765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 13775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*x_goto(xcp);*/ 13785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 1; 13795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 13805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = x_lastcp(); 13815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 13825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 13835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 13855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 13865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_bword(int c MKSH_A_UNUSED) 13905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(x_bword(), true); 13925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 13935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 13945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 13955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 13965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_bword(int c MKSH_A_UNUSED) 13975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 13985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bword(); 13995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_fword(int c MKSH_A_UNUSED) 14045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_fword(1); 14065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_fword(int c MKSH_A_UNUSED) 14115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(x_fword(0), true); 14135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 14145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bword(void) 14185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int nc = 0, nb = 0; 14205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 14215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xbuf) { 14235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 14245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 14255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 14275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && is_mfs(cp[-1])) { 14285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 14295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 14305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xbuf && !is_mfs(cp[-1])) { 14325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 14335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nb++; 14345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 14375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (cp = xcp; cp < (xcp + nb); ++nc) 14385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp += utf_ptradj(cp); 14395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nc); 14405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 14435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fword(int move) 14445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int nc = 0; 14465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *cp2; 14475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 14495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 14505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 14515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 14535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 14545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 14555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) 14565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 14575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (cp2 = xcp; cp2 < cp; ++nc) 14595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp2 += utf_ptradj(cp2); 14605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (move) 14615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 14625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (nc); 14635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 14665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto(char *cp) 14675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) 14695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((cp > xbuf) && ((*cp & 0xC0) == 0x80)) 14705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --cp; 14715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp < xbp || cp >= utf_skipcols(xbp, x_displen)) { 14725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we are heading off screen */ 14735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = cp; 14745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 14755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (cp < xcp) { /* move back */ 14765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp < xcp) 14775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 14785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (cp > xcp) { /* move forward */ 14795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 14805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 14815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 14825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 14855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bs3(char **p) 14865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 14875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 14885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*p)--; 14905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) 14915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (((unsigned char)**p & 0xC0) == 0x80) 14925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*p)--; 14935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_size2(*p, NULL); 14955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (i--) 14965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 14975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 14985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 14995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size_str(char *cp) 15015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int size = 0; 15035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) 15045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size += x_size2(cp, &cp); 15055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (size); 15065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_size2(char *cp, char **dcp) 15105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c = *(unsigned char *)cp; 15125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) 15145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (utf_widthadj(cp, (const char **)dcp)); 15155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (dcp) 15165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *dcp = cp + 1; 15175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') 15185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (4); /* Kludge, tabs are always four spaces. */ 15195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) 15205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); /* control unsigned char */ 15215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 15225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zots(char *str) 15265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 15285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 15305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*str && str < xlp && adj == x_adj_done) 15315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&str); 15325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc2(int c) 15365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 15385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 15395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 15405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 15415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 15425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 15435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 15445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(c); 15455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 15485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_zotc3(char **cp) 15495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char c = **(unsigned char **)cp; 15515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\t') { 15535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Kludge, tabs are always four spaces. */ 15545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(" "); 15555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 15565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c < ' ' || c == 0x7f) { 15575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('^'); 15585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(UNCTRL(c)); 15595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 15605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 15615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3((const char **)cp); 15625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_back(int c MKSH_A_UNUSED) 15665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 15685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - 1); 15735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) 15745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 15755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_forw(int c MKSH_A_UNUSED) 15815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 15825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *cp2; 15835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xep) { 15855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 15865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 15895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_ptradjx(cp, cp2); 15905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp2 > xep) 15915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 15925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = cp2; 15935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 15945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 15955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 15965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 15975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 15985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 15995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_forw(int c MKSH_A_UNUSED) 16005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 16025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char tmp[4]; 16035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 16055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 16065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 16105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cp = (cp == xep) ? NULL : strstr(cp + 1, tmp)) == NULL && 16115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cp = strstr(xbuf, tmp)) == NULL) { 16125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 16175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_char_back(int c MKSH_A_UNUSED) 16225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp, *p, tmp[4]; 16245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool b; 16255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_e_getmbc(tmp) < 0) { 16275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; x_arg--; cp = p) 16315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (p = cp; ; ) { 16325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p-- == xbuf) 16335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = xep; 16345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == cp) { 16355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 16365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((tmp[1] && ((p+1) > xep)) || 16395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (tmp[2] && ((p+2) > xep))) 16405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 16415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = true; 16425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*p != tmp[0]) 16435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 16445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[1] && p[1] != tmp[1]) 16455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 16465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b && tmp[2] && p[2] != tmp[2]) 16475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru b = false; 16485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (b) 16495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 16505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 16515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 16525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_newline(int c MKSH_A_UNUSED) 16575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 16595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 16605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 16615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep++ = '\n'; 16625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 16635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_of_text(int c MKSH_A_UNUSED) 16675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc2(edchars.eof); 16695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 16705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 16715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 16725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KEOL); 16735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_beg_hist(int c MKSH_A_UNUSED) 16775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 16795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_end_hist(int c MKSH_A_UNUSED) 16845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr); 16865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_com(int c MKSH_A_UNUSED) 16915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp - x_arg); 16935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 16945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 16955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 16965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 16975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_next_com(int c MKSH_A_UNUSED) 16985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 16995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(x_histp + x_arg); 17005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Goto a particular history number obtained from argument. 17045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * If no argument is given history 1 is probably not what you 17055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * want so we'll simply go to the oldest one. 17065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 17075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_goto_hist(int c MKSH_A_UNUSED) 17095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) 17115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(history); 17125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 17135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + x_arg - source->line); 17145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 17185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_load_hist(char **hp) 17195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize; 17215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 17225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hp == histptr + 1) { 17245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = holdbuf; 17255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 17265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (hp < history || hp > histptr) { 17275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 17285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 17295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sp == NULL) 17315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = *hp; 17325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = hp; 17335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru oldsize = x_size_str(xbuf); 17345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) 17355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(holdbuf, xbuf, sizeof(holdbuf)); 17365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, sp, xend - xbuf); 17375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf; 17385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xcp = xbuf + strlen(xbuf); 17395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 17405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep <= x_lastcp()) { 17415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 17425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 17445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 17455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_nl_next_com(int c MKSH_A_UNUSED) 17495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_nextcmd = source->line - (histptr - x_histp) + 1; 17515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 17525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_eot_del(int c) 17565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf && x_arg_defaulted) 17585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_end_of_text(c)); 17595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 17605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_del_char(c)); 17615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 17625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* reverse incremental history search */ 17645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 17655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist(int c) 17665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 17675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int offset = -1; /* offset of match in xbuf, else -1 */ 17685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char pat[256 + 1]; /* pattern buffer */ 17695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = pat; 17705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 17715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 17725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = '\0'; 17735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (1) { 17745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) { 17755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nI-search: "); 17765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts(pat); 17775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 17795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 17805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[0][c]; 17825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == CTRL('[')) { 17835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((f & 0x7F) == XFUNC_meta1) { 17845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) < 0) 17855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 17865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = x_tab[1][c] & 0x7F; 17875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1 || f == XFUNC_meta2) 17885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_meta1(CTRL('[')); 17895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 17905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 17925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 17945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f & 0x80) { 17955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f &= 0x7F; 17965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '~') 17975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 17985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 17995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 18005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_search_hist) 18015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 18025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_del_back) { 18035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) { 18045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 18055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p > pat) 18085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *--p = '\0'; 18095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p == pat) 18105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = -1; 18115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 18125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 1, offset); 18135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 18145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_insert) { 18155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* add char to pattern */ 18165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* overflow check... */ 18175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (p >= &pat[sizeof(pat) - 1]) { 18185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 18195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 18205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c, *p = '\0'; 18225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 18235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* already have partial match */ 18245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_match(xbuf, pat); 18255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) { 18265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + offset + (p - pat) - 18275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*pat == '^')); 18285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 18295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru offset = x_search(pat, 0, offset); 18325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (f == XFUNC_abort) { 18335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset >= 0) 18345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(histptr + 1); 18355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { /* other command */ 18375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 18385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 18425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 18435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* search backward from current line */ 18475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search(char *pat, int sameline, int offset) 18495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp; 18515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 18525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (hp = x_histp - (sameline ? 0 : 1); hp >= history; --hp) { 18545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = x_match(*hp, pat); 18555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i >= 0) { 18565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (offset < 0) 18575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 18585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 18595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + i + strlen(pat) - (*pat == '^')); 18605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (i); 18615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 18645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_histp = histptr; 18655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 18665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 18695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search up from current line */ 18705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_up(int c MKSH_A_UNUSED) 18725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(-1)); 18745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search down from current line */ 18775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_hist_dn(int c MKSH_A_UNUSED) 18795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_search_dir(1)); 18815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 18825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* anchored search in the indicated direction */ 18845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 18855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_search_dir(int search_dir /* should've been bool */) 18865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 18875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **hp = x_histp + search_dir; 18885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t curs = xcp - xbuf; 18895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 18905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (histptr >= hp && hp >= history) { 18915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (strncmp(xbuf, *hp, curs) == 0) { 18925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_load_hist(hp); 18935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + curs); 18945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 18955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hp += search_dir; 18975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 18985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 18995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 19015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return position of first match of pattern in string, else -1 */ 19035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_match(char *str, char *pat) 19055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*pat == '^') { 19075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((strncmp(str, pat + 1, strlen(pat + 1)) == 0) ? 0 : -1); 19085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 19095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *q = strstr(str, pat); 19105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((q == NULL) ? -1 : q - str); 19115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_del_line(int c MKSH_A_UNUSED) 19165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j; 19185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = 0; 19205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = xep - xbuf; 19215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size_str(xbuf); 19225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbuf; 19235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_push(i); 19245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp = xep = xbuf; 19255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 19265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 19275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = NULL; 19285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(j); 19295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 19305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_end(int c MKSH_A_UNUSED) 19355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xep); 19375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mv_begin(int c MKSH_A_UNUSED) 19425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf); 19445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_draw_line(int c MKSH_A_UNUSED) 19495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 19515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_rebuildline(const char *clrstr) 19565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(clrstr, shl_out); 19585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 19595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 19605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 19635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_cls(int c MKSH_A_UNUSED) 19645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_e_rebuildline(MKSH_CLS_STRING)); 19665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 19675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Redraw (part of) the line. If limit is < 0, the everything is redrawn 19695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * on a NEW line, otherwise limit is the screen column up to which needs 19705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * redrawing. 19715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 19725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 19735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_redraw(int limit) 19745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 19755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j, x_trunc = 0; 19765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 19775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 19785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 0; 19795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit == -1) 19805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\n'); 19815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 19825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\r'); 19835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 19845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp == xbuf) { 19855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = promptlen(prompt); 19865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 19875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_trunc = (x_col / xx_cols) * xx_cols; 19885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 19895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, x_trunc); 19905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col >= xx_cols) 19925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col %= xx_cols; 19935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2 - x_col; 19945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_displen < 1) { 19955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 19965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_displen = xx_cols - 2; 19975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 19985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 19995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_lastcp(); 20005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zots(xbp); 20015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp != xbuf || xep > xlp) 20025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru limit = xx_cols; 20035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (limit >= 0) { 20045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep > xlp) 20055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = 0; /* we fill the line */ 20065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 20075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cpl = xbp; 20085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = limit; 20105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cpl < xlp) 20115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i -= x_size2(cpl, &cpl); 20125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = 0; 20155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((j < i) || (x_col < (xx_cols - 2))) { 20165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!(x_col < (xx_cols - 2))) 20175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 20185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(' '); 20195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 20205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = ' '; 20225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep > xlp) { /* more off screen */ 20235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xbp > xbuf) 20245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '*'; 20255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 20265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '>'; 20275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xbp > xbuf) 20285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = '<'; 20295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(i); 20305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j++; 20315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (j--) 20325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2('\b'); 20335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = xlp; 20355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp > xcp) 20365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&cp); 20375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_ok = 1; 20385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 20395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 20405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 20425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_transpose(int c MKSH_A_UNUSED) 20435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 20445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned int tmpa, tmpb; 20455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 20465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* What transpose is meant to do seems to be up for debate. This 20475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * is a general summary of the options; the text is abcd with the 20485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * upper case character or underscore indicating the cursor position: 20495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Who Before After Before After 20505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in emacs mode: abCd abdC abcd_ (bell) 20515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * AT&T ksh in gmacs mode: abCd baCd abcd_ abdc_ 20525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * gnu emacs: abCd acbD abcd_ abdc_ 20535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Pdksh currently goes with GNU behavior since I believe this is the 20545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * most common version of emacs, unless in gmacs mode, in which case 20555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * it does the AT&T ksh gmacs mode. 20565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This should really be broken up into 3 functions so users can bind 20575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to the one they want. 20585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 20595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp == xbuf) { 20605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (xcp == xep || Flag(FGMACS)) { 20635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xcp - xbuf == 1) { 20645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Gosling/Unipress emacs style: Swap two characters before the 20685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cursor, do not change cursor position 20695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 20705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 20715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 20725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 20765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 20775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 20815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 20825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 20835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 20845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 20855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* GNU emacs style: Swap the characters before and under the 20865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cursor, move cursor position along one. 20875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 20885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpa, xcp) == (size_t)-1) { 20895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bs3(&xcp); 20935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (utf_mbtowc(&tmpb, xcp) == (size_t)-1) { 20945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 20955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 20965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 20975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpa); 20985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 20995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru utf_wctomb(xcp, tmpb); 21005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_zotc3(&xcp); 21015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 21035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_literal(int c MKSH_A_UNUSED) 21085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = -1; 21105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta1(int c MKSH_A_UNUSED) 21155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 1; 21175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta2(int c MKSH_A_UNUSED) 21225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_curprefix = 2; 21245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill(int c MKSH_A_UNUSED) 21295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int col = xcp - xbuf; 21315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int lastcol = xep - xbuf; 21325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ndel; 21335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) 21355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = lastcol; 21365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (x_arg > lastcol) 21375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = lastcol; 21385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ndel = x_arg - col; 21395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ndel < 0) { 21405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + x_arg); 21415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ndel = -ndel; 21425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(ndel, true); 21445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 21485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_push(int nchars) 21495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp; 21515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strndupx(cp, xcp, nchars, AEDIT); 21535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killsp]) 21545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(killstack[killsp], AEDIT); 21555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killsp] = cp; 21565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killsp = (killsp + 1) % KILLSIZE; 21575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_yank(int c MKSH_A_UNUSED) 21615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killsp == 0) 21635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE; 21645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 21655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 21665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 21675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killstack[killtp] == 0) { 21685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nnothing to yank"); 21695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 21705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 21735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 21745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 21765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 21785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_meta_yank(int c MKSH_A_UNUSED) 21795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 21805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int len; 21815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 21825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((x_last_command != XFUNC_yank && x_last_command != XFUNC_meta_yank) || 21835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killstack[killtp] == 0) { 21845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = killsp; 21855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_puts("\nyank something first"); 21865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(-1); 21875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 21885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 21895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru len = strlen(killstack[killtp]); 21905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xcp - len); 21915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(len, false); 21925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 21935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (killtp == 0) 21945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp = KILLSIZE - 1; 21955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 21965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru killtp--; 21975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (killstack[killtp] == 0); 21985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(killstack[killtp]); 21995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_abort(int c MKSH_A_UNUSED) 22045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* x_zotc(c); */ 22065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xep = xcp = xbp = xbuf; 22075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 22085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xcp = 0; 22095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 22105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KINTR); 22115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_error(int c MKSH_A_UNUSED) 22155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 22175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 22185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 22215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* special VT100 style key sequence hack */ 22225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 22235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vt_hack(int c) 22245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* we only support PF2-'1' for now */ 22265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != (2 << 8 | '1')) 22275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 22285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* what's the next character? */ 22305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 22315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 22325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 22335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg_defaulted = 1; 22345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_begin(0)); 22355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 22365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* "interesting" sequence detected */ 22375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 22385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 22395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 22405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX x_e_ungetc is one-octet only */ 22435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = x_e_getc()) != '5' && c != '3') 22445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru goto unwind_err; 22455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /*- 22475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * At this point, we have read the following octets so far: 22485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - ESC+[ or ESC+O or Ctrl-X (Præfix 2) 22495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 1 (vt_hack) 22505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - ; 22515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * - 5 (Ctrl key combiner) or 3 (Alt key combiner) 22525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * We can now accept one more octet designating the key. 22535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 22545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch ((c = x_e_getc())) { 22565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 22575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_fword(c)); 22585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 22595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_mv_bword(c)); 22605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind_err: 22635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 22645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_error(c)); 22655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 22675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 22695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapin(const char *cp, Area *ap) 22705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 22715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *news, *op; 22725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* for clang's static analyser, the nonnull attribute isn't enough */ 22745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mkssert(cp != NULL); 22755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(news, cp, ap); 22775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru op = news; 22785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp) { 22795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX -- should handle \^ escape? */ 22805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cp == '^') { 22815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 22825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cp >= '?') /* includes '?'; ASCII */ 22835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = CTRL(*cp); 22845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 22855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = '^'; 22865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp--; 22875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 22895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op++ = *cp; 22905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 22915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 22925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *op = '\0'; 22935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 22955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 22965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 22975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 22985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout2(int c, char **buf) 22995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p = *buf; 23015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 23035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = '^'; 23045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = UNCTRL(c); 23055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 23065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p++ = c; 23075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = 0; 23085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *buf = p; 23095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 23125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mapout(int c) 23135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char buf[8]; 23155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *bp = buf; 23165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(c, &bp); 23185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (buf); 23195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 23225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_print(int prefix, int key) 23235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int f = x_tab[prefix][key]; 23255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prefix) 23275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* prefix == 1 || prefix == 2 */ 23285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_puts(x_mapout(prefix == 1 ? 23295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru CTRL('[') : CTRL('X')), shl_stdout); 23305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef MKSH_SMALL 23315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s = ", x_mapout(key)); 23325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#else 23335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s%s = ", x_mapout(key), (f & 0x80) ? "~" : ""); 23345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(f) != XFUNC_ins_string) 23355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[XFUNC_VALUE(f)].xf_name); 23375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 23395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("'%s'\n", x_atab[prefix][key]); 23405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 23425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruint 23445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_bind(const char *a1, const char *a2, 23455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool macro, /* bind -m */ 23475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool list) /* bind -l */ 23495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 23505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char f; 23515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int prefix, key; 23525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *m1, *m2; 23535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *sp = NULL; 23555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool hastilde; 23565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 23585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_tab == NULL) { 23595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bi_errorf("cannot bind, not a tty"); 23605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 23615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* List function names */ 23635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (list) { 23645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 23655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 23665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !(x_ftab[f].xf_flags & XF_NOBIND)) 23675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shprintf("%s\n", x_ftab[f].xf_name); 23685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 23695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a1 == NULL) { 23715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (prefix = 0; prefix < X_NTABS; prefix++) 23725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (key = 0; key < X_TABSZ; key++) { 23735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 23745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert || f == XFUNC_error 23755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru || (macro && f != XFUNC_ins_string) 23775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 23785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) 23795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 23805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 23815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 23835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru m2 = m1 = x_mapin(a1, ATEMP); 23855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 0; 23865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (;; m1++) { 23875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru key = (unsigned char)*m1; 23885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_VALUE(x_tab[prefix][key]); 23895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_meta1) 23905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 1; 23915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (f == XFUNC_meta2) 23925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prefix = 2; 23935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 23945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 23955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 23965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++m1 23975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 23985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru && ((*m1 != '~') || *(m1 + 1)) 23995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ) { 24015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char msg[256] = "key sequence '"; 24025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru const char *c = a1; 24035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru m1 = msg + strlen(msg); 24045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*c && m1 < (msg + sizeof(msg) - 3)) 24055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mapout2(*c++, &m1); 24065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bi_errorf("%s' too long", msg); 24075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 24085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hastilde = *m1; 24115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(m2, ATEMP); 24135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (a2 == NULL) { 24155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print(prefix, key); 24165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*a2 == 0) { 24195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_insert; 24205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (macro) { 24225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru f = XFUNC_ins_string; 24235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = x_mapin(a2, AEDIT); 24245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 24265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (f = 0; f < NELEM(x_ftab); f++) 24275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_ftab[f].xf_name && 24285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(x_ftab[f].xf_name, a2) == 0) 24295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 24305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == NELEM(x_ftab) || x_ftab[f].xf_flags & XF_NOBIND) { 24315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bi_errorf("%s: no such function", a2); 24325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 24335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 24355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (XFUNC_VALUE(x_tab[prefix][key]) == XFUNC_ins_string && 24385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key]) 24395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(x_atab[prefix][key], AEDIT); 24405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[prefix][key] = f 24425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru | (hastilde ? 0x80 : 0) 24445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 24465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[prefix][key] = sp; 24485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Track what the user has bound so x_mode(true) won't toast things */ 24515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (f == XFUNC_insert) 24525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] &= 24535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ~(1 << ((prefix * X_TABSZ + key) % 8)); 24545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 24555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_bound[(prefix * X_TABSZ + key) / 8] |= 24565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (1 << ((prefix * X_TABSZ + key) % 8)); 24575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 24595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 24625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_init_emacs(void) 24635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, j; 24655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ainit(AEDIT); 24675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_nextcmd = -1; 24685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab = alloc(X_NTABS * sizeof(*x_tab), AEDIT); 24705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0; j < X_TABSZ; j++) 24715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[0][j] = XFUNC_insert; 24725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 1; i < X_NTABS; i++) 24735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0; j < X_TABSZ; j++) 24745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[i][j] = XFUNC_error; 24755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < (int)NELEM(x_defbindings); i++) 24765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[x_defbindings[i].xdb_tab][x_defbindings[i].xdb_char] 24775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru = x_defbindings[i].xdb_func; 24785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 24805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab = alloc(X_NTABS * sizeof(*x_atab), AEDIT); 24815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 1; i < X_NTABS; i++) 24825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (j = 0; j < X_TABSZ; j++) 24835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_atab[i][j] = NULL; 24845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 24855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 24885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubind_if_not_bound(int p, int k, int func) 24895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 24905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Has user already bound this key? If so, don't override it */ 24915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_bound[((p) * X_TABSZ + (k)) / 8] & 24925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (1 << (((p) * X_TABSZ + (k)) % 8))) 24935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 24945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_tab[p][k] = func; 24965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 24975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 24985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 24995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_mark(int c MKSH_A_UNUSED) 25005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 25025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_kill_region(int c MKSH_A_UNUSED) 25075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rsize; 25095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xr; 25105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 25125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 25135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp > xcp) { 25165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xmp - xcp; 25175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xcp; 25185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 25195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rsize = xcp - xmp; 25205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xr = xmp; 25215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xr); 25235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(rsize, true); 25245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xr; 25255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_xchg_point_mark(int c MKSH_A_UNUSED) 25305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *tmp; 25325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp == NULL) { 25345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 25355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 25375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tmp = xmp; 25385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xmp = xcp; 25395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(tmp); 25405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_noop(int c MKSH_A_UNUSED) 25455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 25505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * File/command name completion routines 25515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 25525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_comm(int c MKSH_A_UNUSED) 25545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_COMPLETE); 25565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_comm(int c MKSH_A_UNUSED) 25615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND, CT_LIST); 25635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_complete(int c MKSH_A_UNUSED) 25685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLETE); 25705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_enumerate(int c MKSH_A_UNUSED) 25755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_LIST); 25775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_file(int c MKSH_A_UNUSED) 25825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_COMPLETE); 25845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_list_file(int c MKSH_A_UNUSED) 25895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_FILE, CT_LIST); 25915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 25935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 25945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 25955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comp_list(int c MKSH_A_UNUSED) 25965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 25975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do_complete(XCF_COMMAND_FILE, CT_COMPLIST); 25985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 25995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 26025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_expand(int c MKSH_A_UNUSED) 26035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 26055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nwords, i; 26065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command; 26075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = x_cf_glob(XCF_FILE, xbuf, xep - xbuf, xcp - xbuf, 26095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &start, &end, &words, &is_command); 26105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 26125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + start); 26165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(end - start, false); 26175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords;) { 26185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_do_ins) < 0 || 26195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (++i < nwords && x_ins(" ") < 0)) { 26205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 26255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 26275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* type == 0 for list, 1 for complete and 2 for complete-list */ 26305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 26315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudo_complete(int flags, /* XCF_{COMMAND,FILE,COMMAND_FILE} */ 26325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru Comp_type type) 26335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 26355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nlen, olen, nwords; 26365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command, completed = false; 26375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = x_cf_glob(flags, xbuf, xep - xbuf, xcp - xbuf, 26395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &start, &end, &words, &is_command); 26405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* no match */ 26415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 26425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 26435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 26445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (type == CT_LIST) { 26465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print_expansions(nwords, words, is_command); 26475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(0); 26485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 26495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return; 26505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = end - start; 26525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = x_longest_prefix(nwords, words); 26535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* complete */ 26545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1 || nlen > olen) { 26555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(xbuf + start); 26565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_delete(olen, false); 26575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_escape(words[0], nlen, x_do_ins); 26585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 26595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru completed = true; 26605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* add space if single non-dir match */ 26625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 1 && words[0][nlen - 1] != '/') { 26635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(" "); 26645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru completed = true; 26655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (type == CT_COMPLIST && !completed) { 26675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print_expansions(nwords, words, is_command); 26685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru completed = true; 26695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 26705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (completed) 26715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(0); 26725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 26745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 26755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 26765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* NAME: 26775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_adjust - redraw the line adjusting starting point etc. 26785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 26795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 26805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function is called when we have exceeded the bounds 26815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * of the edit window. It increments x_adj_done so that 26825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * functions like x_ins and x_delete know that we have been 26835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * called and can skip the x_bs() stuff which has already 26845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * been done by x_redraw. 26855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 26865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 26875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 26885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 26895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 26905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_adjust(void) 26915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 26925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adj_done++; /* flag the fact that we were called. */ 26935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 26945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we had a problem if the prompt length > xx_cols / 2 26955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 26965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((xbp = xcp - (x_displen / 2)) < xbuf) 26975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = xbuf; 26985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE) 26995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((xbp > xbuf) && ((*xbp & 0xC0) == 0x80)) 27005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --xbp; 27015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = false; 27025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(xx_cols); 27035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 27045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 27075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_ungetc(int c) 27085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = c < 0 ? -1 : (c & 255); 27105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 27135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_getc(void) 27145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 27165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (unget_char >= 0) { 27185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = unget_char; 27195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unget_char = -1; 27205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 27215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 27245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macroptr) { 27255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c = (unsigned char)*macroptr++)) 27265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (c); 27275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macroptr = NULL; 27285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 27305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_getc()); 27325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 27355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc2(int c) 27365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1; 27385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 27405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 27415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 27425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 27435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char utf_tmp[3]; 27445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru size_t x; 27455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0xA0) 27475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = 0xFFFD; 27485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x = utf_wctomb(utf_tmp, c); 27495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[0]); 27505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 1) 27515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[1]); 27525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x > 2) 27535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(utf_tmp[2]); 27545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_wcwidth(c); 27555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 27565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 27575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 27585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 27595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 27615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 27625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 27645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 27655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 27675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 27685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 27725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 27735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 27745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 27765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_putc3(const char **cp) 27775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 27785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int width = 1, c = **(const unsigned char **)cp; 27795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == '\r' || c == '\n') 27815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col = 0; 27825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_col < xx_cols) { 27835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (UTFMODE && (c > 0x7F)) { 27845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp2; 27855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 27865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru width = utf_widthadj(*cp, (const char **)&cp2); 27875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*cp < cp2) 27885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*(*cp)++); 27895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 27905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (*cp)++; 27915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 27925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 27935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (c) { 27945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 7: 27955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 27975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 27985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 27995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\b': 28005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col--; 28015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 28035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_col += width; 28045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 28055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_adj_ok && (x_col < 0 || x_col >= (xx_cols - 2))) 28085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_adjust(); 28095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 28125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_e_puts(const char *s) 28135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int adj = x_adj_done; 28155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*s && adj == x_adj_done) 28175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc3(&s); 28185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* NAME: 28215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_set_arg - set an arg value for next function 28225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 28235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 28245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This is a simple implementation of M-[0-9]. 28255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 28265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 28275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 28285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 28295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 28305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_set_arg(int c) 28315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n = 0, first = 1; 28335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c &= 255; /* strip command prefix */ 28355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (; c >= 0 && ksh_isdigit(c); c = x_e_getc(), first = 0) 28365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = n * 10 + (c - '0'); 28375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0 || first) { 28385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 28395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 1; 28405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg_defaulted = 1; 28415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 28425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 28435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = n; 28445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg_defaulted = 0; 28455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 28475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Comment or uncomment the current line. */ 28505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 28515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_comment(int c MKSH_A_UNUSED) 28525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int oldsize = x_size_str(xbuf); 28545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int len = xep - xbuf; 28555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(xbuf, xend - xbuf, &len); 28565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret < 0) 28585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 28595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 28605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 28615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + len; 28625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 28635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = xbp = xbuf; 28645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(oldsize); 28655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret > 0) 28665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 28675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 28685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 28695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 28705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 28725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_version(int c MKSH_A_UNUSED) 28735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 28745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbuf = xbuf, *o_xend = xend; 28755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *o_xbp = xbp, *o_xep = xep, *o_xcp = xcp; 28765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int vlen, lim = x_lastcp() - xbp; 28775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *v; 28785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strdupx(v, KSH_VERSION, ATEMP); 28805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = xbp = xcp = v; 28825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = xep = v + (vlen = strlen(v)); 28835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(lim); 28845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 28855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_e_getc(); 28875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbuf = o_xbuf; 28885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xend = o_xend; 28895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xbp = o_xbp; 28905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = o_xep; 28915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xcp = o_xcp; 28925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_redraw(vlen); 28935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 28945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < 0) 28955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 28965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* This is what AT&T ksh seems to do... Very bizarre */ 28975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c != ' ') 28985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_ungetc(c); 28995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(v, ATEMP); 29015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 29025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 29055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 29065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_edit_line(int c MKSH_A_UNUSED) 29075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) { 29095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xep == xbuf) { 29105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 29115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 29125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 29145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *xep = '\0'; 29155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, xbuf, true, true); 29165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = 0; 29175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 29185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_arg = source->line - (histptr - x_histp); 29195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg) 29215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(xbuf, xend - xbuf, "%s %d", 29225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", x_arg); 29235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 29245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(xbuf, "fc -e ${VISUAL:-${EDITOR:-vi}} --", xend - xbuf); 29255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xep = xbuf + strlen(xbuf); 29265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_newline('\n')); 29275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 29285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 29295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* NAME: 29315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_prev_histword - recover word from prev command 29325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 29345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function recovers the last word from the previous 29355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * command and inserts it into the current edit line. If a 29365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * numeric arg is supplied then the n'th word from the 29375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * start of the previous command is used. 29385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * As a side effect, trashes the mark in order to achieve 29395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * being called in a repeatable fashion. 29405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Bound to M-. 29425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 29435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 29445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * KSTD 29455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 29465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 29475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_prev_histword(int c MKSH_A_UNUSED) 29485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 29495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *rcp, *cp; 29505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **xhp; 29515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int m; 29525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (xmp && modified > 1) 29545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_kill_region(0); 29555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru m = modified ? modified : 1; 29565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xhp = histptr - (m - 1); 29575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((xhp < history) || !(cp = *xhp)) { 29585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 29595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 29605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 29615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_set_mark(0); 29635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_arg_defaulted) { 29645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = &cp[strlen(cp) - 1]; 29655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 29665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space after the last word 29675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 29685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && is_cfs(*rcp)) 29695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 29705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (rcp > cp && !is_cfs(*rcp)) 29715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp--; 29725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_cfs(*rcp)) 29735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 29745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(rcp); 29755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 29765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char ch; 29775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 29785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp = cp; 29795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 29805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * ignore white-space at start of line 29815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 29825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 29835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 29845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg-- > 1) { 29855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 29865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 29875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && is_cfs(*rcp)) 29885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 29895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp = rcp; 29915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*rcp && !is_cfs(*rcp)) 29925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rcp++; 29935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = *rcp; 29945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = '\0'; 29955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_ins(cp); 29965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *rcp = ch; 29975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 29985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = m + 1; 29995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifndef MKSH_SMALL 30035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Uppercase N(1) words */ 30045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_upper(int c MKSH_A_UNUSED) 30065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('U')); 30085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Lowercase N(1) words */ 30115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_lower(int c MKSH_A_UNUSED) 30135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('L')); 30155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Lowercase N(1) words */ 30185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_capitalise(int c MKSH_A_UNUSED) 30205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_fold_case('C')); 30225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* NAME: 30255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_fold_case - convert word to UPPER/lower/Capital case 30265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 30285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function is used to implement M-U,M-u,M-L,M-l,M-C and M-c 30295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to UPPER case, lower case or Capitalise words. 30305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 30325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * None 30335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 30355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_fold_case(int c) 30365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 30375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cp = xcp; 30385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp == xep) { 30405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_e_putc2(7); 30415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (x_arg--) { 30445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 30455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * first skip over any white-space 30465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && is_mfs(*cp)) 30485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 30495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 30505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * do the first char on its own since it may be 30515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a different action than for the rest. 30525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cp != xep) { 30545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == 'L') /* lowercase */ 30555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 30565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else /* uppercase, capitalise */ 30575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 30585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 30595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 30615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * now for the rest of the word 30625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cp != xep && !is_mfs(*cp)) { 30645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == 'U') /* uppercase */ 30655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_toupper(*cp); 30665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else /* lowercase, capitalise */ 30675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *cp = ksh_tolower(*cp); 30685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cp++; 30695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 30715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_goto(cp); 30725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_modified(); 30735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (KSTD); 30745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 30755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 30765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 30775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* NAME: 30785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp - last visible char 30795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * SYNOPSIS: 30815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_lastcp() 30825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * DESCRIPTION: 30845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * This function returns a pointer to that char in the 30855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * edit buffer that will be the last displayed on the 30865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * screen. The sequence: 30875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp = x_lastcp(); 30895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * while (cp > xcp) 30905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * x_bs3(&cp); 30915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Will position the cursor correctly on the screen. 30935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * 30945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * RETURN VALUE: 30955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * cp or NULL 30965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 30975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char * 30985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_lastcp(void) 30995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!xlp_valid) { 31015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i = 0, j; 31025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *xlp2; 31035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xbp; 31055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (xlp < xep) { 31065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru j = x_size2(xlp, &xlp2); 31075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((i + j) > x_displen) 31085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 31095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i += j; 31105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp = xlp2; 31115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru xlp_valid = true; 31145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (xlp); 31155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic bool 31185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_mode(bool onoff) 31195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 31205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static bool x_cur_mode; 31215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool prev; 31225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_cur_mode == onoff) 31245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (x_cur_mode); 31255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prev = x_cur_mode; 31265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_cur_mode = onoff; 31275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (onoff) { 31295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct termios cb; 31305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb = tty_state; 31325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.erase = cb.c_cc[VERASE]; 31345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.kill = cb.c_cc[VKILL]; 31355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.intr = cb.c_cc[VINTR]; 31365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.quit = cb.c_cc[VQUIT]; 31375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.eof = cb.c_cc[VEOF]; 31385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef VWERASE 31395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.werase = cb.c_cc[VWERASE]; 31405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 31415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_iflag &= ~(INLCR | ICRNL); 31425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_lflag &= ~(ISIG | ICANON | ECHO); 31435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(VLNEXT) && defined(_POSIX_VDISABLE) 31445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* osf/1 processes lnext when ~icanon */ 31455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_cc[VLNEXT] = _POSIX_VDISABLE; 31465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 31475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* sunos 4.1.x & osf/1 processes discard(flush) when ~icanon */ 31485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if defined(VDISCARD) && defined(_POSIX_VDISABLE) 31495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_cc[VDISCARD] = _POSIX_VDISABLE; 31505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 31515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_cc[VTIME] = 0; 31525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cb.c_cc[VMIN] = 1; 31535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcsetattr(tty_fd, TCSADRAIN, &cb); 31555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#ifdef _POSIX_VDISABLE 31575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Convert unset values to internal 'unset' value */ 31585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase == _POSIX_VDISABLE) 31595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.erase = -1; 31605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill == _POSIX_VDISABLE) 31615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.kill = -1; 31625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr == _POSIX_VDISABLE) 31635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.intr = -1; 31645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit == _POSIX_VDISABLE) 31655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.quit = -1; 31665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.eof == _POSIX_VDISABLE) 31675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.eof = -1; 31685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase == _POSIX_VDISABLE) 31695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru edchars.werase = -1; 31705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif 31715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.erase >= 0) { 31735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.erase, XFUNC_del_back); 31745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(1, edchars.erase, XFUNC_del_bword); 31755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 31765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.kill >= 0) 31775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.kill, XFUNC_del_line); 31785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.werase >= 0) 31795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.werase, XFUNC_del_bword); 31805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.intr >= 0) 31815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.intr, XFUNC_abort); 31825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (edchars.quit >= 0) 31835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bind_if_not_bound(0, edchars.quit, XFUNC_noop); 31845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 31855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcsetattr(tty_fd, TCSADRAIN, &tty_state); 31865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (prev); 31885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 31895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#if !MKSH_S_NOVI 31915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* +++ vi editing mode +++ */ 31925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Ctrl(c) (c&0x1f) 31945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 31955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct edstate { 31965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *cbuf; 31975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int winleft; 31985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cbufsize; 31995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int linelen; 32005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cursor; 32015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 32025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_hook(int); 32045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int nextstate(int); 32055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_insert(int); 32065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int vi_cmd(int, const char *); 32075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int domove(int, const char *, int); 32085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int redo_insert(int); 32095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void yank_range(int, int); 32105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int bracktype(int); 32115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void save_cbuf(void); 32125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_cbuf(void); 32135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int putbuf(const char *, int, int); 32145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void del_range(int, int); 32155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int findch(int, int, int, int); 32165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int forwword(int); 32175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int backword(int); 32185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int endword(int); 32195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Forwword(int); 32205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Backword(int); 32215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int Endword(int); 32225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int grabhist(int, int); 32235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int grabsearch(int, int, int, char *); 32245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void redraw_line(int); 32255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void refresh(int); 32265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int outofwin(void); 32275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void rewindow(void); 32285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int newcol(int, int); 32295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void display(char *, char *, int); 32305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void ed_mov_opt(int, char *); 32315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int expand_word(int); 32325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int complete_word(int, int); 32335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int print_expansions(struct edstate *, int); 32345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define char_len(c) ((c) < ' ' || (c) == 0x7F ? 2 : 1) 32355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void x_vi_zotc(int); 32365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_error(void); 32375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void vi_macro_reset(void); 32385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int x_vi_putbuf(const char *, size_t); 32395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define C_ 0x1 /* a valid command that isn't a M_, E_, U_ */ 32415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define M_ 0x2 /* movement command (h, l, etc.) */ 32425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define E_ 0x4 /* extended command (c, d, y) */ 32435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define X_ 0x8 /* long command (@, f, F, t, T, etc.) */ 32445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define U_ 0x10 /* an UN-undoable command (that isn't a M_) */ 32455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define B_ 0x20 /* bad command (^@) */ 32465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define Z_ 0x40 /* repeat count defaults to 0 (not 1) */ 32475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define S_ 0x80 /* search (/, ?) */ 32485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_bad(c) (classify[(c)&0x7f]&B_) 32505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_cmd(c) (classify[(c)&0x7f]&(M_|E_|C_|U_)) 32515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_move(c) (classify[(c)&0x7f]&M_) 32525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_extend(c) (classify[(c)&0x7f]&E_) 32535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_long(c) (classify[(c)&0x7f]&X_) 32545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_undoable(c) (!(classify[(c)&0x7f]&U_)) 32555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_srch(c) (classify[(c)&0x7f]&S_) 32565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define is_zerocount(c) (classify[(c)&0x7f]&Z_) 32575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic const unsigned char classify[128] = { 32595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 1 2 3 4 5 6 7 */ 32605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 0 ^@ ^A ^B ^C ^D ^E ^F ^G */ 32615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru B_, 0, 0, 0, 0, C_|U_, C_|Z_, 0, 32625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 1 ^H ^I ^J ^K ^L ^M ^N ^O */ 32635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru M_, C_|Z_, 0, 0, C_|U_, 0, C_, 0, 32645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 2 ^P ^Q ^R ^S ^T ^U ^V ^W */ 32655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, 0, C_|U_, 0, 0, 0, C_, 0, 32665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 3 ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */ 32675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, 0, 0, C_|Z_, 0, 0, 0, 0, 32685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 4 <space> ! " # $ % & ' */ 32695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru M_, 0, 0, C_, M_, M_, 0, 0, 32705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 5 ( ) * + , - . / */ 32715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 0, 0, C_, C_, M_, C_, 0, C_|S_, 32725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 6 0 1 2 3 4 5 6 7 */ 32735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru M_, 0, 0, 0, 0, 0, 0, 0, 32745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 7 8 9 : ; < = > ? */ 32755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 0, 0, 0, M_, 0, C_, 0, C_|S_, 32765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 8 @ A B C D E F G */ 32775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_|X_, C_, M_, C_, C_, M_, M_|X_, C_|U_|Z_, 32785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 9 H I J K L M N O */ 32795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 0, C_, 0, 0, 0, 0, C_|U_, 0, 32805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* A P Q R S T U V W */ 32815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, 0, C_, C_, M_|X_, C_, 0, M_, 32825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* B X Y Z [ \ ] ^ _ */ 32835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, C_|U_, 0, 0, C_|Z_, 0, M_, C_|Z_, 32845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* C ` a b c d e f g */ 32855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 0, C_, M_, E_, E_, M_, M_|X_, C_|Z_, 32865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* D h i j k l m n o */ 32875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru M_, C_, C_|U_, C_|U_, M_, 0, C_|U_, 0, 32885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* E p q r s t u v w */ 32895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, 0, X_, C_, M_|X_, C_|U_, C_|U_|Z_, M_, 32905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* F x y z { | } ~ ^? */ 32915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru C_, E_|U_, 0, 0, M_|Z_, 0, C_, 0 32925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 32935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define MAXVICMD 3 32955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define SRCHLEN 40 32965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 32975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define INSERT 1 32985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define REPLACE 2 32995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VNORMAL 0 /* command, insert or replace mode */ 33015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG1 1 /* digit prefix (first, eg, 5l) */ 33025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VEXTCMD 2 /* cmd + movement (eg, cl) */ 33035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VARG2 3 /* digit prefix (second, eg, 2c3l) */ 33045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VXCH 4 /* f, F, t, T, @ */ 33055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VFAIL 5 /* bad command */ 33065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VCMD 6 /* single char command (eg, X) */ 33075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VREDO 7 /* . */ 33085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VLIT 8 /* ^V */ 33095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VSEARCH 9 /* /, ? */ 33105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define VVERSION 10 /* <ESC> ^V */ 33115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char undocbuf[LINE]; 33135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *save_edstate(struct edstate *old); 33155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void restore_edstate(struct edstate *old, struct edstate *news); 33165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void free_edstate(struct edstate *old); 33175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate ebuf; 33195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate undobuf = { undocbuf, 0, LINE, 0, 0 }; 33205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *es; /* current editor state */ 33225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate *undo; 33235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char ibuf[LINE]; /* input buffer */ 33255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int first_insert; /* set when starting in insert mode */ 33265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int saved_inslen; /* saved inslen for first insert */ 33275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int inslen; /* length of input buffer */ 33285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int srchlen; /* length of current search pattern */ 33295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char ybuf[LINE]; /* yank buffer */ 33305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int yanklen; /* length of yank buffer */ 33315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavecmd = ' '; /* last find command */ 33325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int fsavech; /* character to find */ 33335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char lastcmd[MAXVICMD]; /* last non-move command */ 33345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastac; /* argcnt for lastcmd */ 33355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int lastsearch = ' '; /* last search command */ 33365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic char srchpat[SRCHLEN]; /* last search pattern */ 33375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int insert; /* non-zero in insert mode */ 33385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hnum; /* position in history */ 33395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int ohnum; /* history line copied (after mod) */ 33405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int hlast; /* 1 past last position in history */ 33415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int state; 33425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Information for keeping track of macros that are being expanded. 33445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * The format of buf is the alias contents followed by a NUL byte followed 33455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * by the name (letter) of the alias. The end of the buffer is marked by 33465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * a double NUL. The name of the alias is stored so recursive macros can 33475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * be detected. 33485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 33495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustruct macro_state { 33505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *p; /* current position in buf */ 33515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char *buf; /* pointer to macro(s) being expanded */ 33525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int len; /* how much data in buffer */ 33535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 33545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct macro_state macro; 33555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruenum expand_mode { 33575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru NONE, EXPAND, COMPLETE, PRINT 33585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru}; 33595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic enum expand_mode expanded = NONE; /* last input was expanded */ 33605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 33625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi(char *buf, size_t len) 33635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 33645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int c; 33655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 33675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum = hlast = histnum(-1) + 1; 33685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 33695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = inslen; 33705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru first_insert = 1; 33715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 33725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 33735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &ebuf; 33755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf = buf; 33765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = &undobuf; 33775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->cbufsize = es->cbufsize = len > LINE ? LINE : len; 33785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = undo->linelen = 0; 33805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = undo->cursor = 0; 33815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->winleft = undo->winleft = 0; 33825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = promptlen(prompt); 33845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_trunc = (cur_col / x_cols) * x_cols; 33855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col -= prompt_trunc; 33865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, 0); 33885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur_col > x_cols - 3 - MIN_EDIT_SPACE) { 33895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_redraw = cur_col = 0; 33905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 33915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 33925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru prompt_redraw = 1; 33935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pwidth = cur_col; 33945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 33955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!wbuf_len || wbuf_len != x_cols - 3) { 33965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf_len = x_cols - 3; 33975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf[0] = aresize(wbuf[0], wbuf_len, APERM); 33985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wbuf[1] = aresize(wbuf[1], wbuf_len, APERM); 33995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)memset(wbuf[0], ' ', wbuf_len); 34015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)memset(wbuf[1], ' ', wbuf_len); 34025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru winwidth = x_cols - pwidth - 3; 34035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 0; 34045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 34055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = 1; 34065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = 0; 34075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru editmode = 2; 34095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 34105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (1) { 34115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 34125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = *macro.p++; 34135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* end of current macro? */ 34145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!c) { 34155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* more macros left to finish? */ 34165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*macro.p++) 34175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 34185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* must be the end of all the macros */ 34195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 34205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 34215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 34235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = x_getc(); 34245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1) 34265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 34275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state != VLIT) { 34285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == edchars.intr || c == edchars.quit) { 34295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* pretend we got an interrupt */ 34305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(c); 34315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 34325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru trapsig(c == edchars.intr ? SIGINT : SIGQUIT); 34335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_mode(false); 34345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unwind(LSHELL); 34355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (c == edchars.eof && state != VVERSION) { 34365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) { 34375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_vi_zotc(edchars.eof); 34385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c = -1; 34395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 34405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru continue; 34425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (vi_hook(c)) 34455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 34465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 34475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 34505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 34515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 34525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c == -1 || (ssize_t)len <= es->linelen) 34545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 34555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cbuf != buf) 34575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(buf, es->cbuf, es->linelen); 34585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf[es->linelen++] = '\n'; 34605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (es->linelen); 34625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 34635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 34655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_hook(int ch) 34665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 34675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char curcmd[MAXVICMD], locpat[SRCHLEN]; 34685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static int cmdlen, argc1, argc2; 34695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 34715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 34725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VNORMAL: 34735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 34745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('v')) { 34755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VLIT; 34765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ch = '^'; 34775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_insert(ch)) { 34795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 34805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 34815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 34825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 34835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 34845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VLIT) { 34855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 34865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 34875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 34885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 0); 34895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 34905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 34915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 34925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 34935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 34945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n') 34955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 34965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmdlen = 0; 34975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = 0; 34985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 34995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = ch - '0'; 35005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG1; 35015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 35025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 35035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 35045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VSEARCH) { 35055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 35065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 35075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 35085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '/') { 35095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf("/", 1, 0) != 0) 35105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 35115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (putbuf("?", 1, 0) != 0) 35125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 35135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 35145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (state == VVERSION) { 35165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 35175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 35185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 0; 35195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru putbuf(KSH_VERSION, 35205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlen(KSH_VERSION), 0); 35215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 35225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VLIT: 35285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_bad(ch)) { 35295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + 1); 35305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 35315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 35325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 35335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(1); 35345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 35355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VVERSION: 35385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 35395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 35405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 35415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG1: 35445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 35455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc1 * 10 + ch - '0'; 35465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 35475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 35485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 35495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VEXTCMD: 35535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = 0; 35545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch >= '1' && ch <= '9') { 35555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = ch - '0'; 35565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VARG2; 35575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 35585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 35595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 35605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 35615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 35625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 35635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 35645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 35655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 35665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VARG2: 35705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isdigit(ch)) 35715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc2 = argc2 * 10 + ch - '0'; 35725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 35735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 == 0) 35745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 = argc2; 35755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 35765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argc1 *= argc2; 35775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 35785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == curcmd[0]) 35795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 35805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_move(ch)) 35815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = nextstate(ch); 35825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 35835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VFAIL; 35845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VXCH: 35885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == Ctrl('[')) 35895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 35905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 35915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru curcmd[cmdlen++] = ch; 35925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 35935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 35945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 35955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 35965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VSEARCH: 35975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\r' || ch == '\n' /*|| ch == Ctrl('[')*/ ) { 35985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 35995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Repeat last search? */ 36005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == 0) { 36015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!srchpat[0]) { 36025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen] = '\0'; 36095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(srchpat, locpat, srchlen + 1); 36105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VCMD; 36125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.erase || ch == Ctrl('h')) { 36135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen != 0) { 36145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen--; 36155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[srchlen]); 36165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 36175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 36215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.kill) { 36245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 36255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = 1; 36265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 1; 36275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ch == edchars.werase) { 36305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i, n = srchlen; 36315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate new_es, *save_es; 36325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cursor = n; 36345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru new_es.cbuf = locpat; 36355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_es = es; 36375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = &new_es; 36385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru n = backword(1); 36395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = save_es; 36405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = srchlen; --i >= n; ) 36425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= char_len((unsigned char)locpat[i]); 36435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = n; 36445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 36455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (srchlen == SRCHLEN - 1) 36495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 36515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru locpat[srchlen++] = ch; 36525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 36535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen + 2 > es->cbufsize) 36545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = '^'; 36565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch ^ '@'; 36575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 36585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize) 36595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen++] = ch; 36615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 36635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 36665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (state) { 36715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VCMD: 36725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(argc1, curcmd)) { 36745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 36755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 36795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) 36805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 36815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(insert != 0); 36825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 36845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 36855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 2: 36875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* back from a 'v' command - don't redraw the screen */ 36885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 36895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 36905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 36915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 36925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VREDO: 36935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 36945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argc1 != 0) 36955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argc1; 36965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (vi_cmd(lastac, lastcmd)) { 36975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case -1: 36985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 36995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 0: 37025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert != 0) { 37035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 37045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') { 37055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(1) != 0) 37065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (redo_insert(lastac) != 0) 37095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 1: 37155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 37165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 37175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 2: 37185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* back from a 'v' command - can't happen */ 37195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case VFAIL: 37245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru state = VNORMAL; 37255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 37275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 37305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 37325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunextstate(int ch) 37335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 37345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_extend(ch)) 37355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VEXTCMD); 37365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_srch(ch)) 37375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VSEARCH); 37385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_long(ch)) 37395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VXCH); 37405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == '.') 37415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VREDO); 37425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (ch == Ctrl('v')) 37435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VVERSION); 37445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (is_cmd(ch)) 37455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VCMD); 37465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (VFAIL); 37485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 37495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 37515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_insert(int ch) 37525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 37535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcursor; 37545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 37555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.erase || ch == Ctrl('h')) { 37565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE) { 37575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == undo->cursor) { 37585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 37595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 37625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 37635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 37645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor >= undo->linelen) 37655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 37665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 37675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor] = undo->cbuf[es->cursor]; 37685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 37695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor == 0) 37705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen > 0) 37725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen--; 37735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 37745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen--; 37755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], &es->cbuf[es->cursor + 1], 37765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor + 1); 37775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 37795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.kill) { 37825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 37835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 37845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, &es->cbuf[es->cursor], 37855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 37865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor; 37875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 37885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 37905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 37915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 37925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == edchars.werase) { 37935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) { 37945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcursor = backword(1); 37955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[tcursor], &es->cbuf[es->cursor], 37965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 37975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= es->cursor - tcursor; 37985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen < es->cursor - tcursor) 37995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = 0; 38005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 38015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen -= es->cursor - tcursor; 38025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = tcursor; 38035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 38055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 38065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If any chars are entered before escape, trash the saved insert 38085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * buffer (if user inserts & deletes char, ibuf gets trashed and 38095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * we don't want to use it) 38105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 38115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert && ch != Ctrl('[')) 38125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru saved_inslen = 0; 38135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 38145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\0': 38155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 38165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\r': 38185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\n': 38195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 38205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('['): 38225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 38235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (first_insert) { 38245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru first_insert = 0; 38255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (inslen == 0) { 38265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inslen = saved_inslen; 38275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 38285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] = 'a'; 38305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 1; 38315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastcmd[0] == 's' || lastcmd[0] == 'c' || 38335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastcmd[0] == 'C') 38345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(0)); 38355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 38365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (redo_insert(lastac - 1)); 38375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* { Begin nonstandard vi commands */ 38395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('x'): 38405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(0); 38415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('f'): 38445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 38455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('e'): 38485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 0); 38495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('i'): 38525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (Flag(FVITABCOMPLETE)) { 38535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(0, 0); 38545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 38555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 38575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* End nonstandard vi commands } */ 38585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 38605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen >= es->cbufsize - 1) 38615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 38625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ibuf[inslen++] = ch; 38635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == INSERT) { 38645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + 1], &es->cbuf[es->cursor], 38655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 38665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 38675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor++] = ch; 38695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == REPLACE && es->cursor > es->linelen) 38705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen++; 38715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 38725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 38735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 38745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 38755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 38775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_cmd(int argcnt, const char *cmd) 38785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 38795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 38805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, c1, c2, c3 = 0; 38815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int any; 38825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *t; 38835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt == 0 && !is_zerocount(*cmd)) 38855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 38865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 38875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_move(*cmd)) { 38885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((cur = domove(argcnt, cmd, 0)) >= 0) { 38895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->linelen && cur != 0) 38905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur--; 38915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = cur; 38925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 38935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 38945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 38955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Don't save state in middle of macro.. */ 38965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_undoable(*cmd) && !macro.p) { 38975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->winleft = es->winleft; 38985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(undo->cbuf, es->cbuf, es->linelen); 38995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->linelen = es->linelen; 39005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo->cursor = es->cursor; 39015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = argcnt; 39025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(lastcmd, cmd, MAXVICMD); 39035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 39055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('l'): 39075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('r'): 39085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru redraw_line(1); 39095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '@': 39125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 39135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static char alias[] = "_\0"; 39145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct tbl *ap; 39155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int olen, nlen; 39165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *nbuf; 39175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* lookup letter in alias list... */ 39195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru alias[1] = cmd[1]; 39205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ap = ktsearch(&aliases, alias, hash(alias)); 39215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!cmd[1] || !ap || !(ap->flag & ISSET)) 39225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* check if this is a recursive call... */ 39245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((p = (char *)macro.p)) 39255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while ((p = strnul(p)) && p[1]) 39265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*++p == cmd[1]) 39275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* insert alias into macro buffer */ 39295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen = strlen(ap->val.s) + 1; 39305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru olen = !macro.p ? 2 : 39315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len - (macro.p - macro.buf); 39325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf = alloc(nlen + 1 + olen, APERM); 39335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf, ap->val.s, nlen); 39345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = cmd[1]; 39355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 39365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(nbuf + nlen, macro.p, olen); 39375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(macro.buf, APERM); 39385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nlen += olen; 39395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 39405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 39415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nbuf[nlen++] = '\0'; 39425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.p = macro.buf = (unsigned char *)nbuf; 39445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru macro.len = nlen; 39455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'a': 39495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 39505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 39515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 39525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 39535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 39545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'A': 39575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 39585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 39595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(0, 0); 39605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = es->linelen; 39615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 39625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'S': 39655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 39665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 39675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 39685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 39695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 39705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 39715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 39725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'Y': 39735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cmd = "y$"; 39745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhhhhh... */ 39755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'c': 39765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'd': 39775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'y': 39785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == cmd[1]) { 39795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = *cmd == 'c' ? domove(1, "^", 1) : 0; 39805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->linelen; 39815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (!is_move(cmd[1])) 39825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 39845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ncursor = domove(argcnt, &cmd[1], 1)) < 0) 39855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 39865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c' && 39875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (cmd[1] == 'w' || cmd[1] == 'W') && 39885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[es->cursor])) { 39895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 39905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru --ncursor; 39915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (ksh_isspace(es->cbuf[ncursor])); 39925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 39935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 39945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->cursor) { 39955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = es->cursor; 39965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = ncursor; 39975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 39985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = ncursor; 39995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2 = es->cursor; 40005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == '%') 40015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c2++; 40025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'c' && c1 != c2) 40055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(c1, c2); 40065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd != 'y') { 40075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(c1, c2); 40085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = c1; 40095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'c') { 40115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 40145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'p': 40185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 40215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 40225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (putbuf(ybuf, yanklen, 0) == 0 && --argcnt > 0) 40235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 40245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 40255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 40265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 40275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'P': 40315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 0; 40345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (putbuf(ybuf, yanklen, 0) == 0 && --argcnt > 0) 40355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru any = 1; 40365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (any && es->cursor != 0) 40375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 40385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt != 0) 40395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'C': 40435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 40465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 40475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'D': 40505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->linelen); 40515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->linelen); 40525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 40535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 40545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'g': 40575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 40585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast; 40595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 40605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'G': 40615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) 40625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = 1; 40635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 40645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = hlast - (source->line - argcnt); 40655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, argcnt - 1) < 0) 40665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 40685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 40695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = argcnt - 1; 40705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'i': 40745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 40775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'I': 40805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 40815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 40825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = domove(1, "^", 1); 40835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 40845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'j': 40875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '+': 40885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('n'): 40895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum + argcnt) < 0) 40905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 40915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 40925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 40935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum += argcnt; 40945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 40955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 40965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 40975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'k': 40985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '-': 40995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('p'): 41005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, hnum - argcnt) < 0) 41015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 41035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 41045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum -= argcnt; 41055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'r': 41095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 41105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd[1] == 0) 41145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 41155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else { 41165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int n; 41175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 41195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (n = 0; n < argcnt; ++n) 41215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->cursor + n] = cmd[1]; 41225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += n - 1; 41235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'R': 41275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = REPLACE; 41305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 's': 41335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 41345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 41385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 41395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 41405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 41415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'v': 41445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!argcnt) { 41455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 41465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (modified) { 41485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf[es->linelen] = '\0'; 41495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histsave(&source->line, es->cbuf, true, 41505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru true); 41515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 41525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = source->line + 1 - 41535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (hlast - hnum); 41545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 41555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) 41565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru shf_snprintf(es->cbuf, es->cbufsize, "%s %d", 41575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 41585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt); 41595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 41605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strlcpy(es->cbuf, 41615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru "fc -e ${VISUAL:-${EDITOR:-vi}} --", 41625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbufsize); 41635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = strlen(es->cbuf); 41645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 41655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'x': 41675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 41685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + argcnt > es->linelen) 41725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->linelen - es->cursor; 41735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor, es->cursor + argcnt); 41745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor, es->cursor + argcnt); 41755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'X': 41785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) { 41795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 41805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 41815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < argcnt) 41825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = es->cursor; 41835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yank_range(es->cursor - argcnt, es->cursor); 41845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(es->cursor - argcnt, es->cursor); 41855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor -= argcnt; 41865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 41875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'u': 41915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = es; 41925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es = undo; 41935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru undo = t; 41945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 41955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 41965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'U': 41975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!modified) 41985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 41995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (grabhist(modified, ohnum) < 0) 42005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = ohnum; 42035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '?': 42065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (hnum == hlast) 42075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = -1; 42085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* ahhh */ 42095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '/': 42105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c3 = 1; 42115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru srchlen = 0; 42125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastsearch = *cmd; 42135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* FALLTHROUGH */ 42145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'n': 42155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'N': 42165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == ' ') 42175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (lastsearch == '?') 42195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 1; 42205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 42215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = 0; 42225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == 'N') 42235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1 = !c1; 42245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((c2 = grabsearch(modified, hnum, 42255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c1, srchpat)) < 0) { 42265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c3) { 42275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 42285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 42295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 42325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 0; 42335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = c2; 42345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = hnum; 42355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '_': 42385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 42395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int inspace; 42405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p, *sp; 42415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (histnum(-1) < 0) 42435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = *histpos(); 42455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#define issp(c) (ksh_isspace(c) || (c) == '\n') 42465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt) { 42475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 42485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 42495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && --argcnt) { 42505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) 42515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 42525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && issp(*p)) 42535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 42545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!*p) 42565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 42585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 42595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 42605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inspace = 0; 42615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p) { 42625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (issp(*p)) 42635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inspace = 1; 42645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (inspace) { 42655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru inspace = 0; 42665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru sp = p; 42675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 42695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = sp; 42715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 42735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 42745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != es->linelen) 42755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 42765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (*p && !issp(*p)) { 42775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt++; 42785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p++; 42795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf(" ", 1, 0) != 0) 42815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = -1; 42825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (putbuf(sp, argcnt, 0) != 0) 42835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru argcnt = -1; 42845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (argcnt < 0) { 42855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor != 0) 42865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 42875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 42885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 42905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 42915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 42925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '~': 42945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 42955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *p; 42965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 42975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 42985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 42995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < argcnt; i++) { 43015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru p = &es->cbuf[es->cursor]; 43025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_islower(*p)) { 43035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_toupper(*p); 43065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else if (ksh_isupper(*p)) { 43075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 43085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 43095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *p = ksh_tolower(*p); 43105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->linelen - 1) 43125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor++; 43135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '#': 43185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru { 43195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ret = x_do_comment(es->cbuf, es->cbufsize, 43205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &es->linelen); 43215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ret >= 0) 43225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 43235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ret); 43245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '=': /* AT&T ksh */ 43275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('e'): /* Nonstandard vi/ksh */ 43285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(es, 1); 43295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('i'): /* Nonstandard vi/ksh */ 43335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVITABCOMPLETE)) 43345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 43365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('['): /* some annoying AT&T kshs */ 43395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!Flag(FVIESCCOMPLETE)) 43405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '\\': /* AT&T ksh */ 43425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('f'): /* Nonstandard vi/ksh */ 43435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru complete_word(1, argcnt); 43445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '*': /* AT&T ksh */ 43485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('x'): /* Nonstandard vi/ksh */ 43495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expand_word(1); 43505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (insert == 0 && es->cursor != 0 && es->cursor >= es->linelen) 43535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 43545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 43555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 43565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 43575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 43595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudomove(int argcnt, const char *cmd, int sub) 43605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 43615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int bcount, i = 0, t; 43625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor = 0; 43635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (*cmd) { 43655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'b': 43665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 43675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = backword(argcnt); 43695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'B': 43725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 43735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Backword(argcnt); 43755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'e': 43785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 43795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = endword(argcnt); 43815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 43825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 43835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'E': 43865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 43875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 43885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Endword(argcnt); 43895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && ncursor < es->linelen) 43905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 43915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 43925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 43935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'f': 43945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'F': 43955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 't': 43965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'T': 43975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavecmd = *cmd; 43985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru fsavech = cmd[1]; 43995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* drop through */ 44005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ',': 44025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ';': 44035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fsavecmd == ' ') 44045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = fsavecmd == 'f' || fsavecmd == 'F'; 44065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = fsavecmd > 'a'; 44075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*cmd == ',') 44085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = !t; 44095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ncursor = findch(fsavech, argcnt, t, i)) < 0) 44105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && t) 44125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 44135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'h': 44165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case Ctrl('h'): 44175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor == 0) 44185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor - argcnt; 44205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < 0) 44215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 44225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ' ': 44255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'l': 44265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 44275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) { 44295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor + argcnt; 44305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 44315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 44325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'w': 44365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 44375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = forwword(argcnt); 44395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case 'W': 44425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!sub && es->cursor + 1 >= es->linelen) 44435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = Forwword(argcnt); 44455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '0': 44485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 44495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '^': 44525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 44535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && 44545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 44555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 44565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '|': 44595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = argcnt; 44605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > es->linelen) 44615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 44625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor) 44635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 44645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '$': 44675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != 0) 44685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->linelen; 44695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 44705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = 0; 44715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '%': 44745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 44755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && 44765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (i = bracktype(es->cbuf[ncursor])) == 0) 44775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 44785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor == es->linelen) 44795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount = 1; 44815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 44825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i > 0) { 44835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor >= es->linelen) 44845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 44865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 44875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 44885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 44895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru t = bracktype(es->cbuf[ncursor]); 44905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (t == i) 44915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount++; 44925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (t == -i) 44935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bcount--; 44945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (bcount != 0); 44955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (sub && i > 0) 44965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 44975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 44985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 44995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 45005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 45035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 45065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruredo_insert(int count) 45075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (count-- > 0) 45095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (putbuf(ibuf, inslen, insert == REPLACE) != 0) 45105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor > 0) 45125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor--; 45135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = 0; 45145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 45155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 45185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruyank_range(int a, int b) 45195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru yanklen = b - a; 45215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (yanklen != 0) 45225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(ybuf, &es->cbuf[a], yanklen); 45235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 45265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubracktype(int ch) 45275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru switch (ch) { 45295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '(': 45315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 45325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '[': 45345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (2); 45355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '{': 45375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (3); 45385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ')': 45405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 45415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case ']': 45435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-2); 45445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru case '}': 45465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-3); 45475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru default: 45495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 45505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 45515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 45545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Non user interface editor routines below here 45555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 45565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 45585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_cbuf(void) 45595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(holdbuf, es->cbuf, es->linelen); 45615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdlen = es->linelen; 45625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdbuf[holdlen] = '\0'; 45635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 45665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_cbuf(void) 45675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 45695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = holdlen; 45705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, holdbuf, holdlen); 45715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* return a new edstate */ 45745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic struct edstate * 45755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querusave_edstate(struct edstate *old) 45765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru struct edstate *news; 45785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news = alloc(sizeof(struct edstate), APERM); 45805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cbuf = alloc(old->cbufsize, APERM); 45815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 45825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cbufsize = old->cbufsize; 45835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 45845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 45855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 45865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (news); 45875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 45905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurestore_edstate(struct edstate *news, struct edstate *old) 45915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 45925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memcpy(news->cbuf, old->cbuf, old->linelen); 45935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->linelen = old->linelen; 45945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->cursor = old->cursor; 45955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru news->winleft = old->winleft; 45965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(old); 45975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 45985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 45995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 46005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querufree_edstate(struct edstate *old) 46015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(old->cbuf, APERM); 46035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(old, APERM); 46045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* 46075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * this is used for calling x_escape() in complete_word() 46085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 46095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_putbuf(const char *s, size_t len) 46115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (putbuf(s, len, 0)); 46135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruputbuf(const char *buf, int len, int repl) 46175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (len == 0) 46195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 46205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (repl) { 46215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len >= es->cbufsize) 46225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor + len > es->linelen) 46245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cursor + len; 46255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 46265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen + len >= es->cbufsize) 46275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor + len], &es->cbuf[es->cursor], 46295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen - es->cursor); 46305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen += len; 46315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[es->cursor], buf, len); 46335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += len; 46345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 46355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 46385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudel_range(int a, int b) 46395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen != b) 46415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(&es->cbuf[a], &es->cbuf[b], es->linelen - b); 46425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen -= b - a; 46435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querufindch(int ch, int cnt, int forw, int incl) 46475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 46495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->linelen == 0) 46515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 46535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 46545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 46555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) { 46565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++ncursor == es->linelen) 46575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 46595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (--ncursor < 0) 46605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 46615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (es->cbuf[ncursor] != ch); 46635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (!incl) { 46655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (forw) 46665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 46675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 46685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 46715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruforwword(int argcnt) 46755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 46775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 46795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 46805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 46815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isalnux(es->cbuf[ncursor]) && 46825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 46835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (!ksh_isspace(es->cbuf[ncursor])) 46855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isalnux(es->cbuf[ncursor]) && 46865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor]) && 46875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 46885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 46905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 46915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 46925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 46935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 46945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 46955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 46965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 46975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querubackword(int argcnt) 46985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 46995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 47025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 47035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor > 0 && ksh_isspace(es->cbuf[ncursor])) 47045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor > 0) { 47065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 47075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 47085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 47095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 47115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && 47125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 47135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 47145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 47165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruendword(int argcnt) 47235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 47275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 47285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 47295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 47305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 47325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ksh_isalnux(es->cbuf[ncursor])) 47335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 47345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isalnux(es->cbuf[ncursor])) 47355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 47375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 47385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isalnux(es->cbuf[ncursor]) && 47395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 47405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 47425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruForwword(int argcnt) 47495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 47535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen && argcnt--) { 47545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (!ksh_isspace(es->cbuf[ncursor]) && 47555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 47565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 47575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ksh_isspace(es->cbuf[ncursor]) && 47585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor < es->linelen) 47595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 47605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruBackword(int argcnt) 47665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 47705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor > 0 && argcnt--) { 47715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (--ncursor >= 0 && ksh_isspace(es->cbuf[ncursor])) 47725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor >= 0 && !ksh_isspace(es->cbuf[ncursor])) 47745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 47755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor++; 47765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 47815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste QueruEndword(int argcnt) 47825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 47835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncursor; 47845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 47855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor = es->cursor; 47865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (ncursor < es->linelen - 1 && argcnt--) { 47875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen - 1 && 47885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ksh_isspace(es->cbuf[ncursor])) 47895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ncursor < es->linelen - 1) { 47915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (++ncursor < es->linelen && 47925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru !ksh_isspace(es->cbuf[ncursor])) 47935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ; 47945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncursor--; 47955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 47975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (ncursor); 47985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 47995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querugrabhist(int save, int n) 48025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 48045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n < 0 || n > hlast) 48065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (n == hlast) { 48085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 48095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 48105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 48115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)histnum(n); 48135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hptr = *histpos()) == NULL) { 48145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru internal_warningf("grabhist: bad history array"); 48155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 48185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 48195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 48205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 48215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 48225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 48235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ohnum = n; 48245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 48255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querugrabsearch(int save, int start, int fwd, char *pat) 48295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *hptr; 48315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int hist; 48325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int anchored; 48335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((start == 0 && fwd == 0) || (start >= hlast - 1 && fwd == 1)) 48355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (fwd) 48375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start++; 48385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru start--; 48405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru anchored = *pat == '^' ? (++pat, 1) : 0; 48415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((hist = findhist(start, fwd, pat, anchored)) < 0) { 48425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* if (start != 0 && fwd && match(holdbuf, pat) >= 0) { */ 48435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XXX should strcmp be strncmp? */ 48445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (start != 0 && fwd && strcmp(holdbuf, pat) >= 0) { 48455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_cbuf(); 48465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 48475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 48485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 48495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (save) 48515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru save_cbuf(); 48525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru histnum(hist); 48535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hptr = *histpos(); 48545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((es->linelen = strlen(hptr)) >= es->cbufsize) 48555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->linelen = es->cbufsize - 1; 48565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memmove(es->cbuf, hptr, es->linelen); 48575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = 0; 48585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (hist); 48595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 48625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruredraw_line(int newl) 48635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru (void)memset(wbuf[win], ' ', wbuf_len); 48655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (newl) { 48665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 48675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\n'); 48685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 48695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 48705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 48715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = pwidth; 48725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = ' '; 48735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 48765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurefresh(int leftside) 48775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (leftside < 0) 48795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru leftside = lastref; 48805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 48815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastref = leftside; 48825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (outofwin()) 48835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rewindow(); 48845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru display(wbuf[1 - win], wbuf[win], leftside); 48855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru win = 1 - win; 48865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 48875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 48895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruoutofwin(void) 48905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 48915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col; 48925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 48935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->cursor < es->winleft) 48945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 48955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 48965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 48975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur < es->cursor) 48985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = newcol((unsigned char)es->cbuf[cur++], col); 48995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col >= winwidth) 49005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (1); 49015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 49025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 49055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querurewindow(void) 49065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int tcur, tcol; 49085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur1, holdcol1; 49095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int holdcur2, holdcol2; 49105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2 = tcur = 0; 49125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2 = tcol = 0; 49135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcur < es->cursor) { 49145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (tcol - holdcol2 > winwidth / 2) { 49155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur1 = holdcur2; 49165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = holdcol2; 49175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcur2 = tcur; 49185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol2 = tcol; 49195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru tcol = newcol((unsigned char)es->cbuf[tcur++], tcol); 49215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (tcol - holdcol1 > winwidth / 2) 49235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1 = newcol((unsigned char)es->cbuf[holdcur1++], 49245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru holdcol1); 49255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->winleft = holdcur1; 49265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 49295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querunewcol(int ch, int col) 49305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch == '\t') 49325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return ((col | 7) + 1); 49335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (col + char_len(ch)); 49345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 49355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 49375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querudisplay(char *wb1, char *wb2, int leftside) 49385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 49395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru unsigned char ch; 49405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *twb1, *twb2, mc; 49415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int cur, col, cnt; 49425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int ncol = 0; 49435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int moreright; 49445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = 0; 49465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur = es->winleft; 49475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright = 0; 49485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 49495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth && cur < es->linelen) { 49505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && leftside) 49515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 49525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if ((ch = es->cbuf[cur]) == '\t') 49535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru do { 49545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 49555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } while (++col < winwidth && (col & 7) != 0); 49565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (col < winwidth) { 49575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (ch < ' ' || ch == 0x7f) { 49585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = '^'; 49595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++col < winwidth) { 49605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch ^ '@'; 49615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 49625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 49645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ch; 49655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 49665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor && !leftside) 49695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth - 1; 49705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur++; 49715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur == es->cursor) 49735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ncol = col + pwidth; 49745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col < winwidth) { 49755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (col < winwidth) { 49765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1++ = ' '; 49775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 49785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 49805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru moreright++; 49815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru *twb1 = ' '; 49825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 49835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col = pwidth; 49845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cnt = winwidth; 49855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1 = wb1; 49865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2 = wb2; 49875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cnt--) { 49885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (*twb1 != *twb2) { 49895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur_col != col) 49905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(col, wb1); 49915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(*twb1); 49925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col++; 49935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb1++; 49955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru twb2++; 49965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru col++; 49975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 49985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (es->winleft > 0 && moreright) 49995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* POSIX says to use * for this but that is a globbing 50005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * character and may confuse people; + is more innocuous 50015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 50025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '+'; 50035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (es->winleft > 0) 50045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '<'; 50055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else if (moreright) 50065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = '>'; 50075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru else 50085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru mc = ' '; 50095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (mc != morec) { 50105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(pwidth + winwidth + 1, wb1); 50115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(mc); 50125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col++; 50135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru morec = mc; 50145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cur_col != ncol) 50165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru ed_mov_opt(ncol, wb1); 50175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 50205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querued_mov_opt(int col, char *wb) 50215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col < cur_col) { 50235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (col + 1 < cur_col - col) { 50245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\r'); 50255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (prompt_redraw) 50265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru pprompt(prompt, prompt_trunc); 50275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = pwidth; 50285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col++ < col) 50295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 50305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 50315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col-- > col) 50325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('\b'); 50335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 50355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru wb = &wb[cur_col - pwidth]; 50365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru while (cur_col++ < col) 50375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putcf(*wb++); 50385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru cur_col = col; 50405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* replace word with all expansions (ie, expand word*) */ 50445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 50455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruexpand_word(int cmd) 50465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 50475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 50485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rval = 0; 50495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int nwords; 50505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end; 50515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 50525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 50535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous expansion */ 50555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == EXPAND && buf) { 50565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 50575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 50585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 50595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 50605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 50625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 50635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 50645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = x_cf_glob(XCF_COMMAND_FILE|XCF_FULLPATH, 50675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf, es->linelen, es->cursor, 50685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &start, &end, &words, NULL); 50695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 50705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 50715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 50725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 50755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = EXPAND; 50765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 50775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 50785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; ) { 50795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (x_escape(words[i], strlen(words[i]), x_vi_putbuf) != 0) { 50805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 50815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 50825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (++i < nwords && putbuf(" ", 1, 0) != 0) { 50845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = -1; 50855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 50865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 50885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru i = buf->cursor - end; 50895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && i > 0) 50905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor += i; 50915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 50925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 50935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 50945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 0; 50955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 50965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 50975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 50985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 50995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 51005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querucomplete_word(int cmd, int count) 51015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 51025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru static struct edstate *buf; 51035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int rval, nwords, start, end, match_len; 51045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 51055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char *match; 51065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command, is_unique; 51075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Undo previous completion */ 51095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == COMPLETE && buf) { 51105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru print_expansions(buf, 0); 51115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = PRINT; 51125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 51135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (cmd == 0 && expanded == PRINT && buf) { 51155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru restore_edstate(es, buf); 51165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 51175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 51185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 51195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (buf) { 51215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru free_edstate(buf); 51225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = 0; 51235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* XCF_FULLPATH for count 'cause the menu printed by print_expansions() 51265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * was done this way. 51275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 51285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = x_cf_glob(XCF_COMMAND_FILE | (count ? XCF_FULLPATH : 0), 51295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cbuf, es->linelen, es->cursor, 51305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &start, &end, &words, &is_command); 51315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 51325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 51335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 51345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count) { 51365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int i; 51375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru count--; 51395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (count >= nwords) { 51405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 51415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print_expansions(nwords, words, is_command); 51425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 51435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru redraw_line(0); 51445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 51455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* 51475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * Expand the count'th word to its basename 51485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 51495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (is_command) { 51505155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count] + 51515155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_basename(words[count], NULL); 51525155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If more than one possible match, use full path */ 51535155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru for (i = 0; i < nwords; i++) 51545155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (i != count && 51555155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru strcmp(words[i] + x_basename(words[i], 51565155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru NULL), match) == 0) { 51575155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 51585155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru break; 51595155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51605155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else 51615155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[count]; 51625155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = strlen(match); 51635155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = true; 51645155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* expanded = PRINT; next call undo */ 51655155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } else { 51665155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match = words[0]; 51675155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru match_len = x_longest_prefix(nwords, words); 51685155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = COMPLETE; /* next call will list completions */ 51695155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru is_unique = nwords == 1; 51705155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51715155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51725155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru buf = save_edstate(es); 51735155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru del_range(start, end); 51745155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru es->cursor = start; 51755155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51765155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* escape all shell-sensitive characters and put the result into 51775155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * command buffer */ 51785155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = x_escape(match, match_len, x_vi_putbuf); 51795155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51805155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (rval == 0 && is_unique) { 51815155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If exact match, don't undo. Allows directory completions 51825155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru * to be used (ie, complete the next portion of the path). 51835155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru */ 51845155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru expanded = NONE; 51855155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51865155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* If not a directory, add a space to the end... */ 51875155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (match_len > 0 && match[match_len - 1] != '/') 51885155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru rval = putbuf(" ", 1, 0); 51895155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 51905155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 51915155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51925155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru modified = 1; 51935155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru hnum = hlast; 51945155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru insert = INSERT; 51955155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru lastac = 0; /* prevent this from being redone... */ 51965155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru refresh(0); 51975155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 51985155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (rval); 51995155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52005155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52015155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic int 52025155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruprint_expansions(struct edstate *est, int cmd MKSH_A_UNUSED) 52035155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52045155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru int start, end, nwords; 52055155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru char **words; 52065155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru bool is_command; 52075155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52085155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru nwords = x_cf_glob(XCF_COMMAND_FILE | XCF_FULLPATH, 52095155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru est->cbuf, est->linelen, est->cursor, 52105155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru &start, &end, &words, &is_command); 52115155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (nwords == 0) { 52125155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_error(); 52135155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (-1); 52145155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52155155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_print_expansions(nwords, words, is_command); 52165155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_free_words(nwords, words); 52175155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru redraw_line(0); 52185155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru return (0); 52195155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52205155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52215155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru/* Similar to x_zotc(emacs.c), but no tab weirdness */ 52225155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 52235155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querux_vi_zotc(int c) 52245155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52255155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (c < ' ' || c == 0x7f) { 52265155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc('^'); 52275155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru c ^= '@'; 52285155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52295155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(c); 52305155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52315155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52325155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 52335155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_error(void) 52345155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52355155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru /* Beem out of any macros as soon as an error occurs */ 52365155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru vi_macro_reset(); 52375155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_putc(7); 52385155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru x_flush(); 52395155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52405155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru 52415155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Querustatic void 52425155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queruvi_macro_reset(void) 52435155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru{ 52445155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru if (macro.p) { 52455155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru afree(macro.buf, APERM); 52465155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru memset((char *)¯o, 0, sizeof(macro)); 52475155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru } 52485155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru} 52495155f1c7438ef540d7b25eb70aa1639579795b07Jean-Baptiste Queru#endif /* !MKSH_S_NOVI */ 5250