129301572SMark Peek /* $Header: /src/pub/tcsh/ed.chared.c,v 3.71 2002/03/08 17:36:45 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * ed.chared.c: Character editing functions. 4c80476e4SDavid E. O'Brien */ 5c80476e4SDavid E. O'Brien /*- 6c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 7c80476e4SDavid E. O'Brien * All rights reserved. 8c80476e4SDavid E. O'Brien * 9c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 10c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 11c80476e4SDavid E. O'Brien * are met: 12c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 13c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 14c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 16c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 1729301572SMark Peek * 3. Neither the name of the University nor the names of its contributors 18c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 19c80476e4SDavid E. O'Brien * without specific prior written permission. 20c80476e4SDavid E. O'Brien * 21c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31c80476e4SDavid E. O'Brien * SUCH DAMAGE. 32c80476e4SDavid E. O'Brien */ 33c80476e4SDavid E. O'Brien /* 34c80476e4SDavid E. O'Brien Bjorn Knutsson @ Thu Jun 24 19:02:17 1999 35c80476e4SDavid E. O'Brien 36c80476e4SDavid E. O'Brien e_dabbrev_expand() did not do proper completion if quoted spaces were present 37c80476e4SDavid E. O'Brien in the string being completed. Exemple: 38c80476e4SDavid E. O'Brien 39c80476e4SDavid E. O'Brien # echo hello\ world 40c80476e4SDavid E. O'Brien hello world 41c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande> 42c80476e4SDavid E. O'Brien # echo hello\<cursor> 43c80476e4SDavid E. O'Brien 44c80476e4SDavid E. O'Brien Correct behavior is: 45c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande> 46c80476e4SDavid E. O'Brien # echo hello\ world<cursor> 47c80476e4SDavid E. O'Brien 48c80476e4SDavid E. O'Brien The same problem occured if spaces were present in a string withing quotation 49c80476e4SDavid E. O'Brien marks. Example: 50c80476e4SDavid E. O'Brien 51c80476e4SDavid E. O'Brien # echo "hello world" 52c80476e4SDavid E. O'Brien hello world 53c80476e4SDavid E. O'Brien # echo "h<press key bound to dabbrev-expande> 54c80476e4SDavid E. O'Brien # echo "hello<cursor> 55c80476e4SDavid E. O'Brien 56c80476e4SDavid E. O'Brien The former problem could be solved with minor modifications of c_preword() 57c80476e4SDavid E. O'Brien and c_endword(). The latter, however, required a significant rewrite of 58c80476e4SDavid E. O'Brien c_preword(), since quoted strings must be parsed from start to end to 59c80476e4SDavid E. O'Brien determine if a given character is inside or outside the quotation marks. 60c80476e4SDavid E. O'Brien 61c80476e4SDavid E. O'Brien Compare the following two strings: 62c80476e4SDavid E. O'Brien 63c80476e4SDavid E. O'Brien # echo \"" 'foo \' bar\" 64c80476e4SDavid E. O'Brien " 'foo \' bar\ 65c80476e4SDavid E. O'Brien # echo '\"" 'foo \' bar\" 66c80476e4SDavid E. O'Brien \"" foo ' bar" 67c80476e4SDavid E. O'Brien 68c80476e4SDavid E. O'Brien The only difference between the two echo lines is in the first character 69c80476e4SDavid E. O'Brien after the echo command. The result is either one or three arguments. 70c80476e4SDavid E. O'Brien 71c80476e4SDavid E. O'Brien */ 72c80476e4SDavid E. O'Brien 73c80476e4SDavid E. O'Brien #include "sh.h" 74c80476e4SDavid E. O'Brien 7529301572SMark Peek RCSID("$Id: ed.chared.c,v 3.71 2002/03/08 17:36:45 christos Exp $") 76c80476e4SDavid E. O'Brien 77c80476e4SDavid E. O'Brien #include "ed.h" 78c80476e4SDavid E. O'Brien #include "tw.h" 79c80476e4SDavid E. O'Brien #include "ed.defns.h" 80c80476e4SDavid E. O'Brien 81c80476e4SDavid E. O'Brien /* #define SDEBUG */ 82c80476e4SDavid E. O'Brien 83c80476e4SDavid E. O'Brien #define TCSHOP_NOP 0x00 84c80476e4SDavid E. O'Brien #define TCSHOP_DELETE 0x01 85c80476e4SDavid E. O'Brien #define TCSHOP_INSERT 0x02 86c80476e4SDavid E. O'Brien #define TCSHOP_CHANGE 0x04 87c80476e4SDavid E. O'Brien 88c80476e4SDavid E. O'Brien #define CHAR_FWD 0 89c80476e4SDavid E. O'Brien #define CHAR_BACK 1 90c80476e4SDavid E. O'Brien 91c80476e4SDavid E. O'Brien /* 92c80476e4SDavid E. O'Brien * vi word treatment 93c80476e4SDavid E. O'Brien * from: Gert-Jan Vons <vons@cesar.crbca1.sinet.slb.com> 94c80476e4SDavid E. O'Brien */ 95c80476e4SDavid E. O'Brien #define C_CLASS_WHITE 1 96c80476e4SDavid E. O'Brien #define C_CLASS_ALNUM 2 97c80476e4SDavid E. O'Brien #define C_CLASS_OTHER 3 98c80476e4SDavid E. O'Brien 99c80476e4SDavid E. O'Brien static Char *InsertPos = InputBuf; /* Where insertion starts */ 100c80476e4SDavid E. O'Brien static Char *ActionPos = 0; /* Where action begins */ 101c80476e4SDavid E. O'Brien static int ActionFlag = TCSHOP_NOP; /* What delayed action to take */ 102c80476e4SDavid E. O'Brien /* 103c80476e4SDavid E. O'Brien * Word search state 104c80476e4SDavid E. O'Brien */ 105c80476e4SDavid E. O'Brien static int searchdir = F_UP_SEARCH_HIST; /* Direction of last search */ 106c80476e4SDavid E. O'Brien static Char patbuf[INBUFSIZE]; /* Search target */ 107c80476e4SDavid E. O'Brien static int patlen = 0; 108c80476e4SDavid E. O'Brien /* 109c80476e4SDavid E. O'Brien * Char search state 110c80476e4SDavid E. O'Brien */ 111c80476e4SDavid E. O'Brien static int srch_dir = CHAR_FWD; /* Direction of last search */ 112c80476e4SDavid E. O'Brien static Char srch_char = 0; /* Search target */ 113c80476e4SDavid E. O'Brien 114c80476e4SDavid E. O'Brien /* all routines that start with c_ are private to this set of routines */ 115c80476e4SDavid E. O'Brien static void c_alternativ_key_map __P((int)); 1166767bd61SMark Peek void c_insert __P((int)); 1173b6eaa7bSAndrey A. Chernov void c_delafter __P((int)); 1183b6eaa7bSAndrey A. Chernov void c_delbefore __P((int)); 119c80476e4SDavid E. O'Brien static int c_to_class __P((int)); 120c80476e4SDavid E. O'Brien static Char *c_prev_word __P((Char *, Char *, int)); 121c80476e4SDavid E. O'Brien static Char *c_next_word __P((Char *, Char *, int)); 122c80476e4SDavid E. O'Brien static Char *c_number __P((Char *, int *, int)); 123c80476e4SDavid E. O'Brien static Char *c_expand __P((Char *)); 124c80476e4SDavid E. O'Brien static void c_excl __P((Char *)); 125c80476e4SDavid E. O'Brien static void c_substitute __P((void)); 126c80476e4SDavid E. O'Brien static void c_delfini __P((void)); 127c80476e4SDavid E. O'Brien static int c_hmatch __P((Char *)); 128c80476e4SDavid E. O'Brien static void c_hsetpat __P((void)); 129c80476e4SDavid E. O'Brien #ifdef COMMENT 130c80476e4SDavid E. O'Brien static void c_get_word __P((Char **, Char **)); 131c80476e4SDavid E. O'Brien #endif 1326767bd61SMark Peek static Char *c_preword __P((Char *, Char *, int, Char *)); 133c80476e4SDavid E. O'Brien static Char *c_nexword __P((Char *, Char *, int)); 1346767bd61SMark Peek static Char *c_endword __P((Char *, Char *, int, Char *)); 135c80476e4SDavid E. O'Brien static Char *c_eword __P((Char *, Char *, int)); 1366767bd61SMark Peek static void c_push_kill __P((Char *, Char *)); 137c80476e4SDavid E. O'Brien static CCRETVAL c_get_histline __P((void)); 138c80476e4SDavid E. O'Brien static CCRETVAL c_search_line __P((Char *, int)); 139c80476e4SDavid E. O'Brien static CCRETVAL v_repeat_srch __P((int)); 140c80476e4SDavid E. O'Brien static CCRETVAL e_inc_search __P((int)); 141c80476e4SDavid E. O'Brien static CCRETVAL v_search __P((int)); 142c80476e4SDavid E. O'Brien static CCRETVAL v_csearch_fwd __P((int, int, int)); 143c80476e4SDavid E. O'Brien static CCRETVAL v_action __P((int)); 144c80476e4SDavid E. O'Brien static CCRETVAL v_csearch_back __P((int, int, int)); 145c80476e4SDavid E. O'Brien 146c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 147c80476e4SDavid E. O'Brien static void e_charfwd_mbyte __P((int)); 148c80476e4SDavid E. O'Brien static void e_charback_mbyte __P((int)); 149c80476e4SDavid E. O'Brien static int extdel; 150c80476e4SDavid E. O'Brien static int extins = 0; 151c80476e4SDavid E. O'Brien #endif 152c80476e4SDavid E. O'Brien 153c80476e4SDavid E. O'Brien static void 154c80476e4SDavid E. O'Brien c_alternativ_key_map(state) 155c80476e4SDavid E. O'Brien int state; 156c80476e4SDavid E. O'Brien { 157c80476e4SDavid E. O'Brien switch (state) { 158c80476e4SDavid E. O'Brien case 0: 159c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap; 160c80476e4SDavid E. O'Brien break; 161c80476e4SDavid E. O'Brien case 1: 162c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap; 163c80476e4SDavid E. O'Brien break; 164c80476e4SDavid E. O'Brien default: 165c80476e4SDavid E. O'Brien return; 166c80476e4SDavid E. O'Brien } 167c80476e4SDavid E. O'Brien 168c80476e4SDavid E. O'Brien AltKeyMap = (Char) state; 169c80476e4SDavid E. O'Brien } 170c80476e4SDavid E. O'Brien 1716767bd61SMark Peek void 172c80476e4SDavid E. O'Brien c_insert(num) 1736767bd61SMark Peek int num; 174c80476e4SDavid E. O'Brien { 1756767bd61SMark Peek Char *cp; 176c80476e4SDavid E. O'Brien 177c80476e4SDavid E. O'Brien if (LastChar + num >= InputLim) 178c80476e4SDavid E. O'Brien return; /* can't go past end of buffer */ 179c80476e4SDavid E. O'Brien 180c80476e4SDavid E. O'Brien if (Cursor < LastChar) { /* if I must move chars */ 181c80476e4SDavid E. O'Brien for (cp = LastChar; cp >= Cursor; cp--) 182c80476e4SDavid E. O'Brien cp[num] = *cp; 183c80476e4SDavid E. O'Brien } 184c80476e4SDavid E. O'Brien LastChar += num; 185c80476e4SDavid E. O'Brien } 186c80476e4SDavid E. O'Brien 1873b6eaa7bSAndrey A. Chernov void 188c80476e4SDavid E. O'Brien c_delafter(num) 1896767bd61SMark Peek int num; 190c80476e4SDavid E. O'Brien { 1916767bd61SMark Peek Char *cp, *kp = NULL; 192c80476e4SDavid E. O'Brien 193c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 194c80476e4SDavid E. O'Brien Char *wkcp; 195c80476e4SDavid E. O'Brien 196c80476e4SDavid E. O'Brien extdel = 0; 197c80476e4SDavid E. O'Brien #endif 198c80476e4SDavid E. O'Brien 199c80476e4SDavid E. O'Brien if (num > LastChar - Cursor) 200c80476e4SDavid E. O'Brien num = (int) (LastChar - Cursor); /* bounds check */ 201c80476e4SDavid E. O'Brien 202c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */ 203c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 204c80476e4SDavid E. O'Brien /* check for code of deleted character */ 205c80476e4SDavid E. O'Brien if (_enable_mbdisp) { 206c80476e4SDavid E. O'Brien for (wkcp = Cursor ; wkcp < Cursor + num; wkcp++) { 207c80476e4SDavid E. O'Brien if (extdel == 0) 208c80476e4SDavid E. O'Brien extdel = Ismbyte1(*wkcp); /* check to 1st. byte */ 209c80476e4SDavid E. O'Brien else 210c80476e4SDavid E. O'Brien extdel = 0; /* if 2nd. byte, force set to 0 */ 211c80476e4SDavid E. O'Brien } 212c80476e4SDavid E. O'Brien } 213c80476e4SDavid E. O'Brien #endif 214c80476e4SDavid E. O'Brien if (VImode) { 215c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */ 216c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 217c80476e4SDavid E. O'Brien UndoSize = num; 218c80476e4SDavid E. O'Brien UndoPtr = Cursor; 219c80476e4SDavid E. O'Brien for (cp = Cursor; cp <= LastChar; cp++) { 220c80476e4SDavid E. O'Brien *kp++ = *cp; /* Save deleted chars into undobuf */ 221c80476e4SDavid E. O'Brien *cp = cp[num]; 222c80476e4SDavid E. O'Brien } 223c80476e4SDavid E. O'Brien } 224c80476e4SDavid E. O'Brien else 225c80476e4SDavid E. O'Brien for (cp = Cursor; cp <= LastChar; cp++) 226c80476e4SDavid E. O'Brien *cp = cp[num]; 227c80476e4SDavid E. O'Brien LastChar -= num; 228c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 229c80476e4SDavid E. O'Brien if (_enable_mbdisp && extdel && Ismbyte2(*Cursor)) { 230c80476e4SDavid E. O'Brien if( VImode ) { 231c80476e4SDavid E. O'Brien UndoSize++; 232c80476e4SDavid E. O'Brien *kp++ = *Cursor; /* Save deleted chars into undobuf */ 233c80476e4SDavid E. O'Brien } 234c80476e4SDavid E. O'Brien for (cp = Cursor; cp <= LastChar; cp++) 235c80476e4SDavid E. O'Brien *cp = cp[1]; 236c80476e4SDavid E. O'Brien LastChar--; 237c80476e4SDavid E. O'Brien e_redisp( 1 ); 238c80476e4SDavid E. O'Brien } 239c80476e4SDavid E. O'Brien else 240c80476e4SDavid E. O'Brien extdel = 0; 241c80476e4SDavid E. O'Brien #endif 242c80476e4SDavid E. O'Brien } 243c80476e4SDavid E. O'Brien #ifdef notdef 244c80476e4SDavid E. O'Brien else { 245c80476e4SDavid E. O'Brien /* 246c80476e4SDavid E. O'Brien * XXX: We don't want to do that. In emacs mode overwrite should be 247c80476e4SDavid E. O'Brien * sticky. I am not sure how that affects vi mode 248c80476e4SDavid E. O'Brien */ 249c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 250c80476e4SDavid E. O'Brien } 251c80476e4SDavid E. O'Brien #endif /* notdef */ 252c80476e4SDavid E. O'Brien } 253c80476e4SDavid E. O'Brien 2543b6eaa7bSAndrey A. Chernov void 255c80476e4SDavid E. O'Brien c_delbefore(num) /* delete before dot, with bounds checking */ 2566767bd61SMark Peek int num; 257c80476e4SDavid E. O'Brien { 2586767bd61SMark Peek Char *cp, *kp = NULL; 259c80476e4SDavid E. O'Brien 260c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 261c80476e4SDavid E. O'Brien Char *nowcur, *wkcp; 262c80476e4SDavid E. O'Brien Char delc; 263c80476e4SDavid E. O'Brien 264c80476e4SDavid E. O'Brien extdel = 0; 265c80476e4SDavid E. O'Brien #endif 266c80476e4SDavid E. O'Brien 267c80476e4SDavid E. O'Brien if (num > Cursor - InputBuf) 268c80476e4SDavid E. O'Brien num = (int) (Cursor - InputBuf); /* bounds check */ 269c80476e4SDavid E. O'Brien 270c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */ 271c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 272c80476e4SDavid E. O'Brien nowcur = Cursor - num; 273c80476e4SDavid E. O'Brien delc = *nowcur; 274c80476e4SDavid E. O'Brien #endif 275c80476e4SDavid E. O'Brien if (VImode) { 276c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */ 277c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 278c80476e4SDavid E. O'Brien UndoSize = num; 279c80476e4SDavid E. O'Brien UndoPtr = Cursor - num; 280c80476e4SDavid E. O'Brien for (cp = Cursor - num; cp <= LastChar; cp++) { 281c80476e4SDavid E. O'Brien *kp++ = *cp; 282c80476e4SDavid E. O'Brien *cp = cp[num]; 283c80476e4SDavid E. O'Brien } 284c80476e4SDavid E. O'Brien } 285c80476e4SDavid E. O'Brien else 286c80476e4SDavid E. O'Brien for (cp = Cursor - num; cp <= LastChar; cp++) 287c80476e4SDavid E. O'Brien *cp = cp[num]; 288c80476e4SDavid E. O'Brien LastChar -= num; 289c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 290c80476e4SDavid E. O'Brien if (_enable_mbdisp) { 291c80476e4SDavid E. O'Brien for (wkcp = InputBuf; wkcp < nowcur; wkcp++) { 292c80476e4SDavid E. O'Brien if(extdel == 0) 293c80476e4SDavid E. O'Brien extdel = Ismbyte1(*wkcp); /* check to 1st. byte */ 294c80476e4SDavid E. O'Brien else 295c80476e4SDavid E. O'Brien extdel = 0; /* if 2nd. byte, force set to 0 */ 296c80476e4SDavid E. O'Brien } 297c80476e4SDavid E. O'Brien if (extdel && Ismbyte2(delc)) { 298c80476e4SDavid E. O'Brien if( VImode ) { 299c80476e4SDavid E. O'Brien UndoSize++; 300c80476e4SDavid E. O'Brien UndoPtr--; 301c80476e4SDavid E. O'Brien *kp++ = *(nowcur-1); 302c80476e4SDavid E. O'Brien /* Save deleted chars into undobuf */ 303c80476e4SDavid E. O'Brien } 304c80476e4SDavid E. O'Brien for (cp = nowcur - 1; cp <= LastChar; cp++) 305c80476e4SDavid E. O'Brien *cp = cp[1]; 306c80476e4SDavid E. O'Brien LastChar--; 307c80476e4SDavid E. O'Brien } 308c80476e4SDavid E. O'Brien } 309c80476e4SDavid E. O'Brien else 310c80476e4SDavid E. O'Brien extdel = 0; 311c80476e4SDavid E. O'Brien #endif 312c80476e4SDavid E. O'Brien } 313c80476e4SDavid E. O'Brien } 314c80476e4SDavid E. O'Brien 315c80476e4SDavid E. O'Brien static Char * 3166767bd61SMark Peek c_preword(p, low, n, delim) 3176767bd61SMark Peek Char *p, *low, *delim; 3186767bd61SMark Peek int n; 319c80476e4SDavid E. O'Brien { 320c80476e4SDavid E. O'Brien while (n--) { 3216767bd61SMark Peek Char *prev = low; 3226767bd61SMark Peek Char *new; 323c80476e4SDavid E. O'Brien 3246767bd61SMark Peek while (prev < p) { /* Skip initial non-word chars */ 3256767bd61SMark Peek if (!Strchr(delim, *prev) || *(prev-1) == (Char)'\\') 326c80476e4SDavid E. O'Brien break; 327c80476e4SDavid E. O'Brien prev++; 328c80476e4SDavid E. O'Brien } 329c80476e4SDavid E. O'Brien 330c80476e4SDavid E. O'Brien new = prev; 331c80476e4SDavid E. O'Brien 332c80476e4SDavid E. O'Brien while (new < p) { 333c80476e4SDavid E. O'Brien prev = new; 3346767bd61SMark Peek new = c_endword(prev-1, p, 1, delim); /* Skip to next non-word char */ 335c80476e4SDavid E. O'Brien new++; /* Step away from end of word */ 3366767bd61SMark Peek while (new <= p) { /* Skip trailing non-word chars */ 3376767bd61SMark Peek if (!Strchr(delim, *new) || *(new-1) == (Char)'\\') 338c80476e4SDavid E. O'Brien break; 339c80476e4SDavid E. O'Brien new++; 340c80476e4SDavid E. O'Brien } 341c80476e4SDavid E. O'Brien } 342c80476e4SDavid E. O'Brien 343c80476e4SDavid E. O'Brien p = prev; /* Set to previous word start */ 344c80476e4SDavid E. O'Brien 345c80476e4SDavid E. O'Brien } 346c80476e4SDavid E. O'Brien if (p < low) 347c80476e4SDavid E. O'Brien p = low; 348c80476e4SDavid E. O'Brien return (p); 349c80476e4SDavid E. O'Brien } 350c80476e4SDavid E. O'Brien 351c80476e4SDavid E. O'Brien /* 352c80476e4SDavid E. O'Brien * c_to_class() returns the class of the given character. 353c80476e4SDavid E. O'Brien * 354c80476e4SDavid E. O'Brien * This is used to make the c_prev_word() and c_next_word() functions 355c80476e4SDavid E. O'Brien * work like vi's, which classify characters. A word is a sequence of 356c80476e4SDavid E. O'Brien * characters belonging to the same class, classes being defined as 357c80476e4SDavid E. O'Brien * follows: 358c80476e4SDavid E. O'Brien * 359c80476e4SDavid E. O'Brien * 1/ whitespace 360c80476e4SDavid E. O'Brien * 2/ alphanumeric chars, + underscore 361c80476e4SDavid E. O'Brien * 3/ others 362c80476e4SDavid E. O'Brien */ 363c80476e4SDavid E. O'Brien static int 364c80476e4SDavid E. O'Brien c_to_class(ch) 3656767bd61SMark Peek int ch; 366c80476e4SDavid E. O'Brien { 367c80476e4SDavid E. O'Brien if (Isspace(ch)) 368c80476e4SDavid E. O'Brien return C_CLASS_WHITE; 369c80476e4SDavid E. O'Brien 370c80476e4SDavid E. O'Brien if (Isdigit(ch) || Isalpha(ch) || ch == '_') 371c80476e4SDavid E. O'Brien return C_CLASS_ALNUM; 372c80476e4SDavid E. O'Brien 373c80476e4SDavid E. O'Brien return C_CLASS_OTHER; 374c80476e4SDavid E. O'Brien } 375c80476e4SDavid E. O'Brien 376c80476e4SDavid E. O'Brien static Char * 377c80476e4SDavid E. O'Brien c_prev_word(p, low, n) 3786767bd61SMark Peek Char *p, *low; 3796767bd61SMark Peek int n; 380c80476e4SDavid E. O'Brien { 381c80476e4SDavid E. O'Brien p--; 382c80476e4SDavid E. O'Brien 383c80476e4SDavid E. O'Brien if (!VImode) { 384c80476e4SDavid E. O'Brien while (n--) { 385c80476e4SDavid E. O'Brien while ((p >= low) && !isword(*p)) 386c80476e4SDavid E. O'Brien p--; 387c80476e4SDavid E. O'Brien while ((p >= low) && isword(*p)) 388c80476e4SDavid E. O'Brien p--; 389c80476e4SDavid E. O'Brien } 390c80476e4SDavid E. O'Brien 391c80476e4SDavid E. O'Brien /* cp now points to one character before the word */ 392c80476e4SDavid E. O'Brien p++; 393c80476e4SDavid E. O'Brien if (p < low) 394c80476e4SDavid E. O'Brien p = low; 395c80476e4SDavid E. O'Brien /* cp now points where we want it */ 396c80476e4SDavid E. O'Brien return(p); 397c80476e4SDavid E. O'Brien } 398c80476e4SDavid E. O'Brien 399c80476e4SDavid E. O'Brien while (n--) { 4006767bd61SMark Peek int c_class; 401c80476e4SDavid E. O'Brien 402c80476e4SDavid E. O'Brien if (p < low) 403c80476e4SDavid E. O'Brien break; 404c80476e4SDavid E. O'Brien 405c80476e4SDavid E. O'Brien /* scan until beginning of current word (may be all whitespace!) */ 406c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 407c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p)) 408c80476e4SDavid E. O'Brien p--; 409c80476e4SDavid E. O'Brien 410c80476e4SDavid E. O'Brien /* if this was a non_whitespace word, we're ready */ 411c80476e4SDavid E. O'Brien if (c_class != C_CLASS_WHITE) 412c80476e4SDavid E. O'Brien continue; 413c80476e4SDavid E. O'Brien 414c80476e4SDavid E. O'Brien /* otherwise, move back to beginning of the word just found */ 415c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 416c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p)) 417c80476e4SDavid E. O'Brien p--; 418c80476e4SDavid E. O'Brien } 419c80476e4SDavid E. O'Brien 420c80476e4SDavid E. O'Brien p++; /* correct overshoot */ 421c80476e4SDavid E. O'Brien 422c80476e4SDavid E. O'Brien return (p); 423c80476e4SDavid E. O'Brien } 424c80476e4SDavid E. O'Brien 425c80476e4SDavid E. O'Brien static Char * 426c80476e4SDavid E. O'Brien c_next_word(p, high, n) 4276767bd61SMark Peek Char *p, *high; 4286767bd61SMark Peek int n; 429c80476e4SDavid E. O'Brien { 430c80476e4SDavid E. O'Brien if (!VImode) { 431c80476e4SDavid E. O'Brien while (n--) { 432c80476e4SDavid E. O'Brien while ((p < high) && !isword(*p)) 433c80476e4SDavid E. O'Brien p++; 434c80476e4SDavid E. O'Brien while ((p < high) && isword(*p)) 435c80476e4SDavid E. O'Brien p++; 436c80476e4SDavid E. O'Brien } 437c80476e4SDavid E. O'Brien if (p > high) 438c80476e4SDavid E. O'Brien p = high; 439c80476e4SDavid E. O'Brien /* p now points where we want it */ 440c80476e4SDavid E. O'Brien return(p); 441c80476e4SDavid E. O'Brien } 442c80476e4SDavid E. O'Brien 443c80476e4SDavid E. O'Brien while (n--) { 4446767bd61SMark Peek int c_class; 445c80476e4SDavid E. O'Brien 446c80476e4SDavid E. O'Brien if (p >= high) 447c80476e4SDavid E. O'Brien break; 448c80476e4SDavid E. O'Brien 449c80476e4SDavid E. O'Brien /* scan until end of current word (may be all whitespace!) */ 450c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 451c80476e4SDavid E. O'Brien while ((p < high) && c_class == c_to_class(*p)) 452c80476e4SDavid E. O'Brien p++; 453c80476e4SDavid E. O'Brien 454c80476e4SDavid E. O'Brien /* if this was all whitespace, we're ready */ 455c80476e4SDavid E. O'Brien if (c_class == C_CLASS_WHITE) 456c80476e4SDavid E. O'Brien continue; 457c80476e4SDavid E. O'Brien 458c80476e4SDavid E. O'Brien /* if we've found white-space at the end of the word, skip it */ 459c80476e4SDavid E. O'Brien while ((p < high) && c_to_class(*p) == C_CLASS_WHITE) 460c80476e4SDavid E. O'Brien p++; 461c80476e4SDavid E. O'Brien } 462c80476e4SDavid E. O'Brien 463c80476e4SDavid E. O'Brien p--; /* correct overshoot */ 464c80476e4SDavid E. O'Brien 465c80476e4SDavid E. O'Brien return (p); 466c80476e4SDavid E. O'Brien } 467c80476e4SDavid E. O'Brien 468c80476e4SDavid E. O'Brien static Char * 469c80476e4SDavid E. O'Brien c_nexword(p, high, n) 4706767bd61SMark Peek Char *p, *high; 4716767bd61SMark Peek int n; 472c80476e4SDavid E. O'Brien { 473c80476e4SDavid E. O'Brien while (n--) { 474c80476e4SDavid E. O'Brien while ((p < high) && !Isspace(*p)) 475c80476e4SDavid E. O'Brien p++; 476c80476e4SDavid E. O'Brien while ((p < high) && Isspace(*p)) 477c80476e4SDavid E. O'Brien p++; 478c80476e4SDavid E. O'Brien } 479c80476e4SDavid E. O'Brien 480c80476e4SDavid E. O'Brien if (p > high) 481c80476e4SDavid E. O'Brien p = high; 482c80476e4SDavid E. O'Brien /* p now points where we want it */ 483c80476e4SDavid E. O'Brien return(p); 484c80476e4SDavid E. O'Brien } 485c80476e4SDavid E. O'Brien 486c80476e4SDavid E. O'Brien /* 487c80476e4SDavid E. O'Brien * Expand-History (originally "Magic-Space") code added by 488c80476e4SDavid E. O'Brien * Ray Moody <ray@gibbs.physics.purdue.edu> 489c80476e4SDavid E. O'Brien * this is a neat, but odd, addition. 490c80476e4SDavid E. O'Brien */ 491c80476e4SDavid E. O'Brien 492c80476e4SDavid E. O'Brien /* 493c80476e4SDavid E. O'Brien * c_number: Ignore character p points to, return number appearing after that. 494c80476e4SDavid E. O'Brien * A '$' by itself means a big number; "$-" is for negative; '^' means 1. 495c80476e4SDavid E. O'Brien * Return p pointing to last char used. 496c80476e4SDavid E. O'Brien */ 497c80476e4SDavid E. O'Brien 498c80476e4SDavid E. O'Brien /* 499c80476e4SDavid E. O'Brien * dval is the number to subtract from for things like $-3 500c80476e4SDavid E. O'Brien */ 501c80476e4SDavid E. O'Brien 502c80476e4SDavid E. O'Brien static Char * 503c80476e4SDavid E. O'Brien c_number(p, num, dval) 5046767bd61SMark Peek Char *p; 5056767bd61SMark Peek int *num; 5066767bd61SMark Peek int dval; 507c80476e4SDavid E. O'Brien { 5086767bd61SMark Peek int i; 5096767bd61SMark Peek int sign = 1; 510c80476e4SDavid E. O'Brien 511c80476e4SDavid E. O'Brien if (*++p == '^') { 512c80476e4SDavid E. O'Brien *num = 1; 513c80476e4SDavid E. O'Brien return(p); 514c80476e4SDavid E. O'Brien } 515c80476e4SDavid E. O'Brien if (*p == '$') { 516c80476e4SDavid E. O'Brien if (*++p != '-') { 517c80476e4SDavid E. O'Brien *num = NCARGS; /* Handle $ */ 518c80476e4SDavid E. O'Brien return(--p); 519c80476e4SDavid E. O'Brien } 520c80476e4SDavid E. O'Brien sign = -1; /* Handle $- */ 521c80476e4SDavid E. O'Brien ++p; 522c80476e4SDavid E. O'Brien } 523c80476e4SDavid E. O'Brien for (i = 0; *p >= '0' && *p <= '9'; i = 10 * i + *p++ - '0') 524c80476e4SDavid E. O'Brien continue; 525c80476e4SDavid E. O'Brien *num = (sign < 0 ? dval - i : i); 526c80476e4SDavid E. O'Brien return(--p); 527c80476e4SDavid E. O'Brien } 528c80476e4SDavid E. O'Brien 529c80476e4SDavid E. O'Brien /* 530c80476e4SDavid E. O'Brien * excl_expand: There is an excl to be expanded to p -- do the right thing 531c80476e4SDavid E. O'Brien * with it and return a version of p advanced over the expanded stuff. Also, 532c80476e4SDavid E. O'Brien * update tsh_cur and related things as appropriate... 533c80476e4SDavid E. O'Brien */ 534c80476e4SDavid E. O'Brien 535c80476e4SDavid E. O'Brien static Char * 536c80476e4SDavid E. O'Brien c_expand(p) 5376767bd61SMark Peek Char *p; 538c80476e4SDavid E. O'Brien { 5396767bd61SMark Peek Char *q; 5406767bd61SMark Peek struct Hist *h = Histlist.Hnext; 5416767bd61SMark Peek struct wordent *l; 542c80476e4SDavid E. O'Brien int i, from, to, dval; 543c80476e4SDavid E. O'Brien bool all_dig; 544c80476e4SDavid E. O'Brien bool been_once = 0; 545c80476e4SDavid E. O'Brien Char *op = p; 546c80476e4SDavid E. O'Brien Char buf[INBUFSIZE]; 547c80476e4SDavid E. O'Brien Char *bend = buf; 548c80476e4SDavid E. O'Brien Char *modbuf, *omodbuf; 549c80476e4SDavid E. O'Brien 550c80476e4SDavid E. O'Brien if (!h) 551c80476e4SDavid E. O'Brien goto excl_err; 552c80476e4SDavid E. O'Brien excl_sw: 553c80476e4SDavid E. O'Brien switch (*(q = p + 1)) { 554c80476e4SDavid E. O'Brien 555c80476e4SDavid E. O'Brien case '^': 556c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 1, 1); 557c80476e4SDavid E. O'Brien break; 558c80476e4SDavid E. O'Brien 559c80476e4SDavid E. O'Brien case '$': 560c80476e4SDavid E. O'Brien if ((l = (h->Hlex).prev) != 0) 561c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, l->prev->prev, 0, 0); 562c80476e4SDavid E. O'Brien break; 563c80476e4SDavid E. O'Brien 564c80476e4SDavid E. O'Brien case '*': 565c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 1, NCARGS); 566c80476e4SDavid E. O'Brien break; 567c80476e4SDavid E. O'Brien 568c80476e4SDavid E. O'Brien default: 569c80476e4SDavid E. O'Brien if (been_once) { /* unknown argument */ 570c80476e4SDavid E. O'Brien /* assume it's a modifier, e.g. !foo:h, and get whole cmd */ 571c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 0, NCARGS); 572c80476e4SDavid E. O'Brien q -= 2; 573c80476e4SDavid E. O'Brien break; 574c80476e4SDavid E. O'Brien } 575c80476e4SDavid E. O'Brien been_once = 1; 576c80476e4SDavid E. O'Brien 577c80476e4SDavid E. O'Brien if (*q == ':') /* short form: !:arg */ 578c80476e4SDavid E. O'Brien --q; 579c80476e4SDavid E. O'Brien 580c80476e4SDavid E. O'Brien if (*q != HIST) { 581c80476e4SDavid E. O'Brien /* 582c80476e4SDavid E. O'Brien * Search for a space, tab, or colon. See if we have a number (as 583c80476e4SDavid E. O'Brien * in !1234:xyz). Remember the number. 584c80476e4SDavid E. O'Brien */ 585c80476e4SDavid E. O'Brien for (i = 0, all_dig = 1; 586c80476e4SDavid E. O'Brien *q != ' ' && *q != '\t' && *q != ':' && q < Cursor; q++) { 587c80476e4SDavid E. O'Brien /* 588c80476e4SDavid E. O'Brien * PWP: !-4 is a valid history argument too, therefore the test 589c80476e4SDavid E. O'Brien * is if not a digit, or not a - as the first character. 590c80476e4SDavid E. O'Brien */ 591c80476e4SDavid E. O'Brien if ((*q < '0' || *q > '9') && (*q != '-' || q != p + 1)) 592c80476e4SDavid E. O'Brien all_dig = 0; 593c80476e4SDavid E. O'Brien else if (*q == '-') 594c80476e4SDavid E. O'Brien all_dig = 2;/* we are sneeky about this */ 595c80476e4SDavid E. O'Brien else 596c80476e4SDavid E. O'Brien i = 10 * i + *q - '0'; 597c80476e4SDavid E. O'Brien } 598c80476e4SDavid E. O'Brien --q; 599c80476e4SDavid E. O'Brien 600c80476e4SDavid E. O'Brien /* 601c80476e4SDavid E. O'Brien * If we have a number, search for event i. Otherwise, search for 602c80476e4SDavid E. O'Brien * a named event (as in !foo). (In this case, I is the length of 603c80476e4SDavid E. O'Brien * the named event). 604c80476e4SDavid E. O'Brien */ 605c80476e4SDavid E. O'Brien if (all_dig) { 606c80476e4SDavid E. O'Brien if (all_dig == 2) 607c80476e4SDavid E. O'Brien i = -i; /* make it negitive */ 608c80476e4SDavid E. O'Brien if (i < 0) /* if !-4 (for example) */ 609c80476e4SDavid E. O'Brien i = eventno + 1 + i; /* remember: i is < 0 */ 610c80476e4SDavid E. O'Brien for (; h; h = h->Hnext) { 611c80476e4SDavid E. O'Brien if (h->Hnum == i) 612c80476e4SDavid E. O'Brien break; 613c80476e4SDavid E. O'Brien } 614c80476e4SDavid E. O'Brien } 615c80476e4SDavid E. O'Brien else { 616c80476e4SDavid E. O'Brien for (i = (int) (q - p); h; h = h->Hnext) { 617c80476e4SDavid E. O'Brien if ((l = &h->Hlex) != 0) { 618c80476e4SDavid E. O'Brien if (!Strncmp(p + 1, l->next->word, (size_t) i)) 619c80476e4SDavid E. O'Brien break; 620c80476e4SDavid E. O'Brien } 621c80476e4SDavid E. O'Brien } 622c80476e4SDavid E. O'Brien } 623c80476e4SDavid E. O'Brien } 624c80476e4SDavid E. O'Brien if (!h) 625c80476e4SDavid E. O'Brien goto excl_err; 626c80476e4SDavid E. O'Brien if (q[1] == ':' || q[1] == '-' || q[1] == '*' || 627c80476e4SDavid E. O'Brien q[1] == '$' || q[1] == '^') { /* get some args */ 628c80476e4SDavid E. O'Brien p = q[1] == ':' ? ++q : q; 629c80476e4SDavid E. O'Brien /* 630c80476e4SDavid E. O'Brien * Go handle !foo:* 631c80476e4SDavid E. O'Brien */ 632c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') && 633c80476e4SDavid E. O'Brien q[1] != '-' && q[1] != '$' && q[1] != '^') 634c80476e4SDavid E. O'Brien goto excl_sw; 635c80476e4SDavid E. O'Brien /* 636c80476e4SDavid E. O'Brien * Go handle !foo:$ 637c80476e4SDavid E. O'Brien */ 638c80476e4SDavid E. O'Brien if (q[1] == '$' && (q[2] != '-' || q[3] < '0' || q[3] > '9')) 639c80476e4SDavid E. O'Brien goto excl_sw; 640c80476e4SDavid E. O'Brien /* 641c80476e4SDavid E. O'Brien * Count up the number of words in this event. Store it in dval. 642c80476e4SDavid E. O'Brien * Dval will be fed to number. 643c80476e4SDavid E. O'Brien */ 644c80476e4SDavid E. O'Brien dval = 0; 645c80476e4SDavid E. O'Brien if ((l = h->Hlex.prev) != 0) { 646c80476e4SDavid E. O'Brien for (l = l->prev; l != h->Hlex.next; l = l->prev, dval++) 647c80476e4SDavid E. O'Brien continue; 648c80476e4SDavid E. O'Brien } 649c80476e4SDavid E. O'Brien if (!dval) 650c80476e4SDavid E. O'Brien goto excl_err; 651c80476e4SDavid E. O'Brien if (q[1] == '-') 652c80476e4SDavid E. O'Brien from = 0; 653c80476e4SDavid E. O'Brien else 654c80476e4SDavid E. O'Brien q = c_number(q, &from, dval); 655c80476e4SDavid E. O'Brien if (q[1] == '-') { 656c80476e4SDavid E. O'Brien ++q; 657c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') && q[1] != '$') 658c80476e4SDavid E. O'Brien to = dval - 1; 659c80476e4SDavid E. O'Brien else 660c80476e4SDavid E. O'Brien q = c_number(q, &to, dval); 661c80476e4SDavid E. O'Brien } 662c80476e4SDavid E. O'Brien else if (q[1] == '*') { 663c80476e4SDavid E. O'Brien ++q; 664c80476e4SDavid E. O'Brien to = NCARGS; 665c80476e4SDavid E. O'Brien } 666c80476e4SDavid E. O'Brien else { 667c80476e4SDavid E. O'Brien to = from; 668c80476e4SDavid E. O'Brien } 669c80476e4SDavid E. O'Brien if (from < 0 || to < from) 670c80476e4SDavid E. O'Brien goto excl_err; 671c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, &h->Hlex, from, to); 672c80476e4SDavid E. O'Brien } 673c80476e4SDavid E. O'Brien else { /* get whole cmd */ 674c80476e4SDavid E. O'Brien bend = expand_lex(buf, INBUFSIZE, &h->Hlex, 0, NCARGS); 675c80476e4SDavid E. O'Brien } 676c80476e4SDavid E. O'Brien break; 677c80476e4SDavid E. O'Brien } 678c80476e4SDavid E. O'Brien 679c80476e4SDavid E. O'Brien /* 680c80476e4SDavid E. O'Brien * Apply modifiers, if any. 681c80476e4SDavid E. O'Brien */ 682c80476e4SDavid E. O'Brien if (q[1] == ':') { 683c80476e4SDavid E. O'Brien *bend = '\0'; 684c80476e4SDavid E. O'Brien modbuf = omodbuf = buf; 685c80476e4SDavid E. O'Brien while (q[1] == ':' && modbuf != NULL) { 686c80476e4SDavid E. O'Brien switch (q[2]) { 687c80476e4SDavid E. O'Brien case 'r': 688c80476e4SDavid E. O'Brien case 'e': 689c80476e4SDavid E. O'Brien case 'h': 690c80476e4SDavid E. O'Brien case 't': 691c80476e4SDavid E. O'Brien case 'q': 692c80476e4SDavid E. O'Brien case 'x': 693c80476e4SDavid E. O'Brien case 'u': 694c80476e4SDavid E. O'Brien case 'l': 695c80476e4SDavid E. O'Brien if ((modbuf = domod(omodbuf, (int) q[2])) != NULL) { 696c80476e4SDavid E. O'Brien if (omodbuf != buf) 697c80476e4SDavid E. O'Brien xfree((ptr_t) omodbuf); 698c80476e4SDavid E. O'Brien omodbuf = modbuf; 699c80476e4SDavid E. O'Brien } 700c80476e4SDavid E. O'Brien ++q; 701c80476e4SDavid E. O'Brien break; 702c80476e4SDavid E. O'Brien 703c80476e4SDavid E. O'Brien case 'a': 704c80476e4SDavid E. O'Brien case 'g': 705c80476e4SDavid E. O'Brien /* Not implemented; this needs to be done before expanding 706c80476e4SDavid E. O'Brien * lex. We don't have the words available to us anymore. 707c80476e4SDavid E. O'Brien */ 708c80476e4SDavid E. O'Brien ++q; 709c80476e4SDavid E. O'Brien break; 710c80476e4SDavid E. O'Brien 711c80476e4SDavid E. O'Brien case 'p': 712c80476e4SDavid E. O'Brien /* Ok */ 713c80476e4SDavid E. O'Brien ++q; 714c80476e4SDavid E. O'Brien break; 715c80476e4SDavid E. O'Brien 716c80476e4SDavid E. O'Brien case '\0': 717c80476e4SDavid E. O'Brien break; 718c80476e4SDavid E. O'Brien 719c80476e4SDavid E. O'Brien default: 720c80476e4SDavid E. O'Brien ++q; 721c80476e4SDavid E. O'Brien break; 722c80476e4SDavid E. O'Brien } 723c80476e4SDavid E. O'Brien if (q[1]) 724c80476e4SDavid E. O'Brien ++q; 725c80476e4SDavid E. O'Brien } 726c80476e4SDavid E. O'Brien if (omodbuf != buf) { 727c80476e4SDavid E. O'Brien (void) Strcpy(buf, omodbuf); 728c80476e4SDavid E. O'Brien xfree((ptr_t) omodbuf); 729c80476e4SDavid E. O'Brien bend = Strend(buf); 730c80476e4SDavid E. O'Brien } 731c80476e4SDavid E. O'Brien } 732c80476e4SDavid E. O'Brien 733c80476e4SDavid E. O'Brien /* 734c80476e4SDavid E. O'Brien * Now replace the text from op to q inclusive with the text from buf to 735c80476e4SDavid E. O'Brien * bend. 736c80476e4SDavid E. O'Brien */ 737c80476e4SDavid E. O'Brien q++; 738c80476e4SDavid E. O'Brien 739c80476e4SDavid E. O'Brien /* 740c80476e4SDavid E. O'Brien * Now replace text non-inclusively like a real CS major! 741c80476e4SDavid E. O'Brien */ 742c80476e4SDavid E. O'Brien if (LastChar + (bend - buf) - (q - op) >= InputLim) 743c80476e4SDavid E. O'Brien goto excl_err; 744c80476e4SDavid E. O'Brien (void) memmove((ptr_t) (q + (bend - buf) - (q - op)), (ptr_t) q, 745c80476e4SDavid E. O'Brien (size_t) ((LastChar - q) * sizeof(Char))); 746c80476e4SDavid E. O'Brien LastChar += (bend - buf) - (q - op); 747c80476e4SDavid E. O'Brien Cursor += (bend - buf) - (q - op); 748c80476e4SDavid E. O'Brien (void) memmove((ptr_t) op, (ptr_t) buf, 749c80476e4SDavid E. O'Brien (size_t) ((bend - buf) * sizeof(Char))); 750c80476e4SDavid E. O'Brien *LastChar = '\0'; 751c80476e4SDavid E. O'Brien return(op + (bend - buf)); 752c80476e4SDavid E. O'Brien excl_err: 753c80476e4SDavid E. O'Brien SoundBeep(); 754c80476e4SDavid E. O'Brien return(op + 1); 755c80476e4SDavid E. O'Brien } 756c80476e4SDavid E. O'Brien 757c80476e4SDavid E. O'Brien /* 758c80476e4SDavid E. O'Brien * c_excl: An excl has been found at point p -- back up and find some white 759c80476e4SDavid E. O'Brien * space (or the beginning of the buffer) and properly expand all the excl's 760c80476e4SDavid E. O'Brien * from there up to the current cursor position. We also avoid (trying to) 761c80476e4SDavid E. O'Brien * expanding '>!' 762c80476e4SDavid E. O'Brien */ 763c80476e4SDavid E. O'Brien 764c80476e4SDavid E. O'Brien static void 765c80476e4SDavid E. O'Brien c_excl(p) 7666767bd61SMark Peek Char *p; 767c80476e4SDavid E. O'Brien { 7686767bd61SMark Peek int i; 7696767bd61SMark Peek Char *q; 770c80476e4SDavid E. O'Brien 771c80476e4SDavid E. O'Brien /* 772c80476e4SDavid E. O'Brien * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise, 773c80476e4SDavid E. O'Brien * back p up to just before the current word. 774c80476e4SDavid E. O'Brien */ 775c80476e4SDavid E. O'Brien if ((p[1] == ' ' || p[1] == '\t') && 776c80476e4SDavid E. O'Brien (p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) { 777c80476e4SDavid E. O'Brien for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q) 778c80476e4SDavid E. O'Brien continue; 779c80476e4SDavid E. O'Brien if (*q == '>') 780c80476e4SDavid E. O'Brien ++p; 781c80476e4SDavid E. O'Brien } 782c80476e4SDavid E. O'Brien else { 783c80476e4SDavid E. O'Brien while (*p != ' ' && *p != '\t' && p > InputBuf) 784c80476e4SDavid E. O'Brien --p; 785c80476e4SDavid E. O'Brien } 786c80476e4SDavid E. O'Brien 787c80476e4SDavid E. O'Brien /* 788c80476e4SDavid E. O'Brien * Forever: Look for history char. (Stop looking when we find the cursor.) 789c80476e4SDavid E. O'Brien * Count backslashes. Of odd, skip history char. Return if all done. 790c80476e4SDavid E. O'Brien * Expand if even number of backslashes. 791c80476e4SDavid E. O'Brien */ 792c80476e4SDavid E. O'Brien for (;;) { 793c80476e4SDavid E. O'Brien while (*p != HIST && p < Cursor) 794c80476e4SDavid E. O'Brien ++p; 795c80476e4SDavid E. O'Brien for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++) 796c80476e4SDavid E. O'Brien continue; 797c80476e4SDavid E. O'Brien if (i % 2 == 0) 798c80476e4SDavid E. O'Brien ++p; 799c80476e4SDavid E. O'Brien if (p >= Cursor) 800c80476e4SDavid E. O'Brien return; 801c80476e4SDavid E. O'Brien if (i % 2 == 1) 802c80476e4SDavid E. O'Brien p = c_expand(p); 803c80476e4SDavid E. O'Brien } 804c80476e4SDavid E. O'Brien } 805c80476e4SDavid E. O'Brien 806c80476e4SDavid E. O'Brien 807c80476e4SDavid E. O'Brien static void 808c80476e4SDavid E. O'Brien c_substitute() 809c80476e4SDavid E. O'Brien { 8106767bd61SMark Peek Char *p; 811c80476e4SDavid E. O'Brien 812c80476e4SDavid E. O'Brien /* 813c80476e4SDavid E. O'Brien * Start p out one character before the cursor. Move it backwards looking 814c80476e4SDavid E. O'Brien * for white space, the beginning of the line, or a history character. 815c80476e4SDavid E. O'Brien */ 816c80476e4SDavid E. O'Brien for (p = Cursor - 1; 817c80476e4SDavid E. O'Brien p > InputBuf && *p != ' ' && *p != '\t' && *p != HIST; --p) 818c80476e4SDavid E. O'Brien continue; 819c80476e4SDavid E. O'Brien 820c80476e4SDavid E. O'Brien /* 821c80476e4SDavid E. O'Brien * If we found a history character, go expand it. 822c80476e4SDavid E. O'Brien */ 823c80476e4SDavid E. O'Brien if (*p == HIST) 824c80476e4SDavid E. O'Brien c_excl(p); 825c80476e4SDavid E. O'Brien Refresh(); 826c80476e4SDavid E. O'Brien } 827c80476e4SDavid E. O'Brien 828c80476e4SDavid E. O'Brien static void 829c80476e4SDavid E. O'Brien c_delfini() /* Finish up delete action */ 830c80476e4SDavid E. O'Brien { 8316767bd61SMark Peek int Size; 832c80476e4SDavid E. O'Brien 833c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_INSERT) 834c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 835c80476e4SDavid E. O'Brien 836c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 837c80476e4SDavid E. O'Brien 838c80476e4SDavid E. O'Brien if (ActionPos == 0) 839c80476e4SDavid E. O'Brien return; 840c80476e4SDavid E. O'Brien 841c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 842c80476e4SDavid E. O'Brien 843c80476e4SDavid E. O'Brien if (Cursor > ActionPos) { 844c80476e4SDavid E. O'Brien Size = (int) (Cursor-ActionPos); 845c80476e4SDavid E. O'Brien c_delbefore(Size); 846c80476e4SDavid E. O'Brien Cursor = ActionPos; 847c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 848c80476e4SDavid E. O'Brien if (_enable_mbdisp && extdel) { 849c80476e4SDavid E. O'Brien Cursor--; 850c80476e4SDavid E. O'Brien e_redisp(1); 851c80476e4SDavid E. O'Brien } 852c80476e4SDavid E. O'Brien #endif 853c80476e4SDavid E. O'Brien RefCursor(); 854c80476e4SDavid E. O'Brien } 855c80476e4SDavid E. O'Brien else if (Cursor < ActionPos) { 856c80476e4SDavid E. O'Brien Size = (int)(ActionPos-Cursor); 857c80476e4SDavid E. O'Brien c_delafter(Size); 858c80476e4SDavid E. O'Brien } 859c80476e4SDavid E. O'Brien else { 860c80476e4SDavid E. O'Brien Size = 1; 861c80476e4SDavid E. O'Brien c_delafter(Size); 862c80476e4SDavid E. O'Brien } 863c80476e4SDavid E. O'Brien UndoPtr = Cursor; 864c80476e4SDavid E. O'Brien UndoSize = Size; 865c80476e4SDavid E. O'Brien } 866c80476e4SDavid E. O'Brien 867c80476e4SDavid E. O'Brien static Char * 8686767bd61SMark Peek c_endword(p, high, n, delim) 8696767bd61SMark Peek Char *p, *high, *delim; 8706767bd61SMark Peek int n; 871c80476e4SDavid E. O'Brien { 8726767bd61SMark Peek int inquote = 0; 873c80476e4SDavid E. O'Brien p++; 874c80476e4SDavid E. O'Brien 875c80476e4SDavid E. O'Brien while (n--) { 8766767bd61SMark Peek while (p < high) { /* Skip non-word chars */ 8776767bd61SMark Peek if (!Strchr(delim, *p) || *(p-1) == (Char)'\\') 878c80476e4SDavid E. O'Brien break; 879c80476e4SDavid E. O'Brien p++; 880c80476e4SDavid E. O'Brien } 881c80476e4SDavid E. O'Brien while (p < high) { /* Skip string */ 882c80476e4SDavid E. O'Brien if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */ 8836767bd61SMark Peek if (inquote || *(p-1) != (Char)'\\') { /* Should it be honored? */ 884c80476e4SDavid E. O'Brien if (inquote == 0) inquote = *p; 885c80476e4SDavid E. O'Brien else if (inquote == *p) inquote = 0; 886c80476e4SDavid E. O'Brien } 887c80476e4SDavid E. O'Brien } 8886767bd61SMark Peek /* Break if unquoted non-word char */ 8896767bd61SMark Peek if (!inquote && Strchr(delim, *p) && *(p-1) != (Char)'\\') 890c80476e4SDavid E. O'Brien break; 891c80476e4SDavid E. O'Brien p++; 892c80476e4SDavid E. O'Brien } 893c80476e4SDavid E. O'Brien } 894c80476e4SDavid E. O'Brien 895c80476e4SDavid E. O'Brien p--; 896c80476e4SDavid E. O'Brien return(p); 897c80476e4SDavid E. O'Brien } 898c80476e4SDavid E. O'Brien 899c80476e4SDavid E. O'Brien 900c80476e4SDavid E. O'Brien static Char * 901c80476e4SDavid E. O'Brien c_eword(p, high, n) 9026767bd61SMark Peek Char *p, *high; 9036767bd61SMark Peek int n; 904c80476e4SDavid E. O'Brien { 905c80476e4SDavid E. O'Brien p++; 906c80476e4SDavid E. O'Brien 907c80476e4SDavid E. O'Brien while (n--) { 908c80476e4SDavid E. O'Brien while ((p < high) && Isspace(*p)) 909c80476e4SDavid E. O'Brien p++; 910c80476e4SDavid E. O'Brien 911c80476e4SDavid E. O'Brien if (Isalnum(*p)) 912c80476e4SDavid E. O'Brien while ((p < high) && Isalnum(*p)) 913c80476e4SDavid E. O'Brien p++; 914c80476e4SDavid E. O'Brien else 915c80476e4SDavid E. O'Brien while ((p < high) && !(Isspace(*p) || Isalnum(*p))) 916c80476e4SDavid E. O'Brien p++; 917c80476e4SDavid E. O'Brien } 918c80476e4SDavid E. O'Brien 919c80476e4SDavid E. O'Brien p--; 920c80476e4SDavid E. O'Brien return(p); 921c80476e4SDavid E. O'Brien } 922c80476e4SDavid E. O'Brien 9236767bd61SMark Peek /* Set the max length of the kill ring */ 9246767bd61SMark Peek void 9256767bd61SMark Peek SetKillRing(max) 9266767bd61SMark Peek int max; 9276767bd61SMark Peek { 9286767bd61SMark Peek CStr *new; 9296767bd61SMark Peek int count, i, j; 9306767bd61SMark Peek 9316767bd61SMark Peek if (max < 1) 9326767bd61SMark Peek max = 1; /* no ring, but always one buffer */ 9336767bd61SMark Peek if (max == KillRingMax) 9346767bd61SMark Peek return; 9356767bd61SMark Peek new = (CStr *)xcalloc((size_t) max, sizeof(CStr)); 9366767bd61SMark Peek if (KillRing != NULL) { 9376767bd61SMark Peek if (KillRingLen != 0) { 9386767bd61SMark Peek if (max >= KillRingLen) { 9396767bd61SMark Peek count = KillRingLen; 9406767bd61SMark Peek j = KillPos; 9416767bd61SMark Peek } else { 9426767bd61SMark Peek count = max; 9436767bd61SMark Peek j = (KillPos - count + KillRingLen) % KillRingLen; 9446767bd61SMark Peek } 9456767bd61SMark Peek for (i = 0; i < KillRingLen; i++) { 9466767bd61SMark Peek if (i < count) /* copy latest */ 9476767bd61SMark Peek new[i] = KillRing[j]; 9486767bd61SMark Peek else /* free the others */ 9496767bd61SMark Peek xfree(KillRing[j].buf); 9506767bd61SMark Peek j = (j + 1) % KillRingLen; 9516767bd61SMark Peek } 9526767bd61SMark Peek KillRingLen = count; 9536767bd61SMark Peek KillPos = count % max; 9546767bd61SMark Peek YankPos = count - 1; 9556767bd61SMark Peek } 9566767bd61SMark Peek xfree(KillRing); 9576767bd61SMark Peek } 9586767bd61SMark Peek KillRing = new; 9596767bd61SMark Peek KillRingMax = max; 9606767bd61SMark Peek } 9616767bd61SMark Peek 9626767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */ 9636767bd61SMark Peek static void 9646767bd61SMark Peek c_push_kill(start, end) 9656767bd61SMark Peek Char *start, *end; 9666767bd61SMark Peek { 9676767bd61SMark Peek CStr save, *pos; 9686767bd61SMark Peek Char *dp, *cp, *kp; 9696767bd61SMark Peek int len = end - start, i, j, k; 9706767bd61SMark Peek 9716767bd61SMark Peek /* Check for duplicates? */ 9726767bd61SMark Peek if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) { 9736767bd61SMark Peek YankPos = (KillPos - 1 + KillRingLen) % KillRingLen; 9746767bd61SMark Peek if (eq(dp, STRerase)) { /* erase earlier one (actually move up) */ 9756767bd61SMark Peek j = YankPos; 9766767bd61SMark Peek for (i = 0; i < KillRingLen; i++) { 9776767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 && 9786767bd61SMark Peek KillRing[j].buf[len] == '\0') { 9796767bd61SMark Peek save = KillRing[j]; 9806767bd61SMark Peek for ( ; i > 0; i--) { 9816767bd61SMark Peek k = j; 9826767bd61SMark Peek j = (j + 1) % KillRingLen; 9836767bd61SMark Peek KillRing[k] = KillRing[j]; 9846767bd61SMark Peek } 9856767bd61SMark Peek KillRing[j] = save; 9866767bd61SMark Peek return; 9876767bd61SMark Peek } 9886767bd61SMark Peek j = (j - 1 + KillRingLen) % KillRingLen; 9896767bd61SMark Peek } 9906767bd61SMark Peek } else if (eq(dp, STRall)) { /* skip if any earlier */ 9916767bd61SMark Peek for (i = 0; i < KillRingLen; i++) 9926767bd61SMark Peek if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 && 9936767bd61SMark Peek KillRing[i].buf[len] == '\0') 9946767bd61SMark Peek return; 9956767bd61SMark Peek } else if (eq(dp, STRprev)) { /* skip if immediately previous */ 9966767bd61SMark Peek j = YankPos; 9976767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 && 9986767bd61SMark Peek KillRing[j].buf[len] == '\0') 9996767bd61SMark Peek return; 10006767bd61SMark Peek } 10016767bd61SMark Peek } 10026767bd61SMark Peek 10036767bd61SMark Peek /* No duplicate, go ahead and push */ 10046767bd61SMark Peek len++; /* need space for '\0' */ 10056767bd61SMark Peek YankPos = KillPos; 10066767bd61SMark Peek if (KillRingLen < KillRingMax) 10076767bd61SMark Peek KillRingLen++; 10086767bd61SMark Peek pos = &KillRing[KillPos]; 10096767bd61SMark Peek KillPos = (KillPos + 1) % KillRingMax; 10106767bd61SMark Peek if (pos->len < len) { 10116767bd61SMark Peek if (pos->buf == NULL) 10126767bd61SMark Peek pos->buf = (Char *) xmalloc(len * sizeof(Char)); 10136767bd61SMark Peek else 10146767bd61SMark Peek pos->buf = (Char *) xrealloc((ptr_t) pos->buf, len * sizeof(Char)); 10156767bd61SMark Peek pos->len = len; 10166767bd61SMark Peek } 10176767bd61SMark Peek cp = start; 10186767bd61SMark Peek kp = pos->buf; 10196767bd61SMark Peek while (cp < end) 10206767bd61SMark Peek *kp++ = *cp++; 10216767bd61SMark Peek *kp = '\0'; 10226767bd61SMark Peek } 10236767bd61SMark Peek 1024c80476e4SDavid E. O'Brien static CCRETVAL 1025c80476e4SDavid E. O'Brien c_get_histline() 1026c80476e4SDavid E. O'Brien { 1027c80476e4SDavid E. O'Brien struct Hist *hp; 1028c80476e4SDavid E. O'Brien int h; 1029c80476e4SDavid E. O'Brien 1030c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* if really the current line */ 1031c80476e4SDavid E. O'Brien copyn(InputBuf, HistBuf, INBUFSIZE); 1032c80476e4SDavid E. O'Brien LastChar = InputBuf + (LastHist - HistBuf); 1033c80476e4SDavid E. O'Brien 1034c80476e4SDavid E. O'Brien #ifdef KSHVI 1035c80476e4SDavid E. O'Brien if (VImode) 1036c80476e4SDavid E. O'Brien Cursor = InputBuf; 1037c80476e4SDavid E. O'Brien else 1038c80476e4SDavid E. O'Brien #endif /* KSHVI */ 1039c80476e4SDavid E. O'Brien Cursor = LastChar; 1040c80476e4SDavid E. O'Brien 1041c80476e4SDavid E. O'Brien return(CC_REFRESH); 1042c80476e4SDavid E. O'Brien } 1043c80476e4SDavid E. O'Brien 1044c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1045c80476e4SDavid E. O'Brien if (hp == NULL) 1046c80476e4SDavid E. O'Brien return(CC_ERROR); 1047c80476e4SDavid E. O'Brien 1048c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++) { 1049c80476e4SDavid E. O'Brien if ((hp->Hnext) == NULL) { 1050c80476e4SDavid E. O'Brien Hist_num = h; 1051c80476e4SDavid E. O'Brien return(CC_ERROR); 1052c80476e4SDavid E. O'Brien } 1053c80476e4SDavid E. O'Brien hp = hp->Hnext; 1054c80476e4SDavid E. O'Brien } 1055c80476e4SDavid E. O'Brien 1056c80476e4SDavid E. O'Brien if (HistLit && hp->histline) { 1057c80476e4SDavid E. O'Brien copyn(InputBuf, hp->histline, INBUFSIZE); 1058c80476e4SDavid E. O'Brien CurrentHistLit = 1; 1059c80476e4SDavid E. O'Brien } 1060c80476e4SDavid E. O'Brien else { 1061b2be84b1SDavid E. O'Brien (void) sprlex(InputBuf, sizeof(InputBuf) / sizeof(Char), &hp->Hlex); 1062c80476e4SDavid E. O'Brien CurrentHistLit = 0; 1063c80476e4SDavid E. O'Brien } 1064c80476e4SDavid E. O'Brien LastChar = InputBuf + Strlen(InputBuf); 1065c80476e4SDavid E. O'Brien 1066c80476e4SDavid E. O'Brien if (LastChar > InputBuf) { 1067c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n') 1068c80476e4SDavid E. O'Brien LastChar--; 1069c80476e4SDavid E. O'Brien #if 0 1070c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ') 1071c80476e4SDavid E. O'Brien LastChar--; 1072c80476e4SDavid E. O'Brien #endif 1073c80476e4SDavid E. O'Brien if (LastChar < InputBuf) 1074c80476e4SDavid E. O'Brien LastChar = InputBuf; 1075c80476e4SDavid E. O'Brien } 1076c80476e4SDavid E. O'Brien 1077c80476e4SDavid E. O'Brien #ifdef KSHVI 1078c80476e4SDavid E. O'Brien if (VImode) 1079c80476e4SDavid E. O'Brien Cursor = InputBuf; 1080c80476e4SDavid E. O'Brien else 1081c80476e4SDavid E. O'Brien #endif /* KSHVI */ 1082c80476e4SDavid E. O'Brien Cursor = LastChar; 1083c80476e4SDavid E. O'Brien 1084c80476e4SDavid E. O'Brien return(CC_REFRESH); 1085c80476e4SDavid E. O'Brien } 1086c80476e4SDavid E. O'Brien 1087c80476e4SDavid E. O'Brien static CCRETVAL 1088c80476e4SDavid E. O'Brien c_search_line(pattern, dir) 1089c80476e4SDavid E. O'Brien Char *pattern; 1090c80476e4SDavid E. O'Brien int dir; 1091c80476e4SDavid E. O'Brien { 1092c80476e4SDavid E. O'Brien Char *cp; 1093c80476e4SDavid E. O'Brien int len; 1094c80476e4SDavid E. O'Brien 1095c80476e4SDavid E. O'Brien len = (int) Strlen(pattern); 1096c80476e4SDavid E. O'Brien 1097c80476e4SDavid E. O'Brien if (dir == F_UP_SEARCH_HIST) { 1098c80476e4SDavid E. O'Brien for (cp = Cursor; cp >= InputBuf; cp--) 1099c80476e4SDavid E. O'Brien if (Strncmp(cp, pattern, (size_t) len) == 0 || 1100c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) { 1101c80476e4SDavid E. O'Brien Cursor = cp; 1102c80476e4SDavid E. O'Brien return(CC_NORM); 1103c80476e4SDavid E. O'Brien } 1104c80476e4SDavid E. O'Brien return(CC_ERROR); 1105c80476e4SDavid E. O'Brien } else { 1106c80476e4SDavid E. O'Brien for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++) 1107c80476e4SDavid E. O'Brien if (Strncmp(cp, pattern, (size_t) len) == 0 || 1108c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) { 1109c80476e4SDavid E. O'Brien Cursor = cp; 1110c80476e4SDavid E. O'Brien return(CC_NORM); 1111c80476e4SDavid E. O'Brien } 1112c80476e4SDavid E. O'Brien return(CC_ERROR); 1113c80476e4SDavid E. O'Brien } 1114c80476e4SDavid E. O'Brien } 1115c80476e4SDavid E. O'Brien 1116c80476e4SDavid E. O'Brien static CCRETVAL 1117c80476e4SDavid E. O'Brien e_inc_search(dir) 1118c80476e4SDavid E. O'Brien int dir; 1119c80476e4SDavid E. O'Brien { 1120c80476e4SDavid E. O'Brien static Char STRfwd[] = { 'f', 'w', 'd', '\0' }, 1121c80476e4SDavid E. O'Brien STRbck[] = { 'b', 'c', 'k', '\0' }; 1122c80476e4SDavid E. O'Brien static Char pchar = ':'; /* ':' = normal, '?' = failed */ 1123c80476e4SDavid E. O'Brien static Char endcmd[2]; 1124c80476e4SDavid E. O'Brien Char ch, *cp, 1125c80476e4SDavid E. O'Brien *oldCursor = Cursor, 1126c80476e4SDavid E. O'Brien oldpchar = pchar; 1127c80476e4SDavid E. O'Brien CCRETVAL ret = CC_NORM; 1128c80476e4SDavid E. O'Brien int oldHist_num = Hist_num, 1129c80476e4SDavid E. O'Brien oldpatlen = patlen, 1130c80476e4SDavid E. O'Brien newdir = dir, 1131c80476e4SDavid E. O'Brien done, redo; 1132c80476e4SDavid E. O'Brien 1133c80476e4SDavid E. O'Brien if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patlen >= InputLim) 1134c80476e4SDavid E. O'Brien return(CC_ERROR); 1135c80476e4SDavid E. O'Brien 1136c80476e4SDavid E. O'Brien for (;;) { 1137c80476e4SDavid E. O'Brien 1138c80476e4SDavid E. O'Brien if (patlen == 0) { /* first round */ 1139c80476e4SDavid E. O'Brien pchar = ':'; 1140c80476e4SDavid E. O'Brien patbuf[patlen++] = '*'; 1141c80476e4SDavid E. O'Brien } 1142c80476e4SDavid E. O'Brien done = redo = 0; 1143c80476e4SDavid E. O'Brien *LastChar++ = '\n'; 1144c80476e4SDavid E. O'Brien for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd; 1145c80476e4SDavid E. O'Brien *cp; *LastChar++ = *cp++) 1146c80476e4SDavid E. O'Brien continue; 1147c80476e4SDavid E. O'Brien *LastChar++ = pchar; 1148c80476e4SDavid E. O'Brien for (cp = &patbuf[1]; cp < &patbuf[patlen]; *LastChar++ = *cp++) 1149c80476e4SDavid E. O'Brien continue; 1150c80476e4SDavid E. O'Brien *LastChar = '\0'; 1151c80476e4SDavid E. O'Brien Refresh(); 1152c80476e4SDavid E. O'Brien 1153c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 1154c80476e4SDavid E. O'Brien return(e_send_eof(0)); 1155c80476e4SDavid E. O'Brien 1156c80476e4SDavid E. O'Brien switch (CurrentKeyMap[(unsigned char) ch]) { 1157c80476e4SDavid E. O'Brien case F_INSERT: 1158c80476e4SDavid E. O'Brien case F_DIGIT: 1159c80476e4SDavid E. O'Brien case F_MAGIC_SPACE: 1160c80476e4SDavid E. O'Brien if (patlen > INBUFSIZE - 3) 1161c80476e4SDavid E. O'Brien SoundBeep(); 1162c80476e4SDavid E. O'Brien else { 1163c80476e4SDavid E. O'Brien patbuf[patlen++] = ch; 1164c80476e4SDavid E. O'Brien *LastChar++ = ch; 1165c80476e4SDavid E. O'Brien *LastChar = '\0'; 1166c80476e4SDavid E. O'Brien Refresh(); 1167c80476e4SDavid E. O'Brien } 1168c80476e4SDavid E. O'Brien break; 1169c80476e4SDavid E. O'Brien 1170c80476e4SDavid E. O'Brien case F_INC_FWD: 1171c80476e4SDavid E. O'Brien newdir = F_DOWN_SEARCH_HIST; 1172c80476e4SDavid E. O'Brien redo++; 1173c80476e4SDavid E. O'Brien break; 1174c80476e4SDavid E. O'Brien 1175c80476e4SDavid E. O'Brien case F_INC_BACK: 1176c80476e4SDavid E. O'Brien newdir = F_UP_SEARCH_HIST; 1177c80476e4SDavid E. O'Brien redo++; 1178c80476e4SDavid E. O'Brien break; 1179c80476e4SDavid E. O'Brien 1180c80476e4SDavid E. O'Brien case F_DELPREV: 1181c80476e4SDavid E. O'Brien if (patlen > 1) 1182c80476e4SDavid E. O'Brien done++; 1183c80476e4SDavid E. O'Brien else 1184c80476e4SDavid E. O'Brien SoundBeep(); 1185c80476e4SDavid E. O'Brien break; 1186c80476e4SDavid E. O'Brien 1187c80476e4SDavid E. O'Brien default: 1188c80476e4SDavid E. O'Brien switch (ch) { 1189c80476e4SDavid E. O'Brien case 0007: /* ^G: Abort */ 1190c80476e4SDavid E. O'Brien ret = CC_ERROR; 1191c80476e4SDavid E. O'Brien done++; 1192c80476e4SDavid E. O'Brien break; 1193c80476e4SDavid E. O'Brien 1194c80476e4SDavid E. O'Brien case 0027: /* ^W: Append word */ 1195c80476e4SDavid E. O'Brien /* No can do if globbing characters in pattern */ 1196c80476e4SDavid E. O'Brien for (cp = &patbuf[1]; ; cp++) 1197c80476e4SDavid E. O'Brien if (cp >= &patbuf[patlen]) { 1198c80476e4SDavid E. O'Brien Cursor += patlen - 1; 1199c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, 1); 1200c80476e4SDavid E. O'Brien while (Cursor < cp && *Cursor != '\n') { 1201c80476e4SDavid E. O'Brien if (patlen > INBUFSIZE - 3) { 1202c80476e4SDavid E. O'Brien SoundBeep(); 1203c80476e4SDavid E. O'Brien break; 1204c80476e4SDavid E. O'Brien } 1205c80476e4SDavid E. O'Brien patbuf[patlen++] = *Cursor; 1206c80476e4SDavid E. O'Brien *LastChar++ = *Cursor++; 1207c80476e4SDavid E. O'Brien } 1208c80476e4SDavid E. O'Brien Cursor = oldCursor; 1209c80476e4SDavid E. O'Brien *LastChar = '\0'; 1210c80476e4SDavid E. O'Brien Refresh(); 1211c80476e4SDavid E. O'Brien break; 1212c80476e4SDavid E. O'Brien } else if (isglob(*cp)) { 1213c80476e4SDavid E. O'Brien SoundBeep(); 1214c80476e4SDavid E. O'Brien break; 1215c80476e4SDavid E. O'Brien } 1216c80476e4SDavid E. O'Brien break; 1217c80476e4SDavid E. O'Brien 1218c80476e4SDavid E. O'Brien default: /* Terminate and execute cmd */ 1219c80476e4SDavid E. O'Brien endcmd[0] = ch; 1220c80476e4SDavid E. O'Brien PushMacro(endcmd); 1221c80476e4SDavid E. O'Brien /*FALLTHROUGH*/ 1222c80476e4SDavid E. O'Brien 1223c80476e4SDavid E. O'Brien case 0033: /* ESC: Terminate */ 1224c80476e4SDavid E. O'Brien ret = CC_REFRESH; 1225c80476e4SDavid E. O'Brien done++; 1226c80476e4SDavid E. O'Brien break; 1227c80476e4SDavid E. O'Brien } 1228c80476e4SDavid E. O'Brien break; 1229c80476e4SDavid E. O'Brien } 1230c80476e4SDavid E. O'Brien 1231c80476e4SDavid E. O'Brien while (LastChar > InputBuf && *LastChar != '\n') 1232c80476e4SDavid E. O'Brien *LastChar-- = '\0'; 1233c80476e4SDavid E. O'Brien *LastChar = '\0'; 1234c80476e4SDavid E. O'Brien 1235c80476e4SDavid E. O'Brien if (!done) { 1236c80476e4SDavid E. O'Brien 1237c80476e4SDavid E. O'Brien /* Can't search if unmatched '[' */ 1238c80476e4SDavid E. O'Brien for (cp = &patbuf[patlen - 1], ch = ']'; cp > patbuf; cp--) 1239c80476e4SDavid E. O'Brien if (*cp == '[' || *cp == ']') { 1240c80476e4SDavid E. O'Brien ch = *cp; 1241c80476e4SDavid E. O'Brien break; 1242c80476e4SDavid E. O'Brien } 1243c80476e4SDavid E. O'Brien 1244c80476e4SDavid E. O'Brien if (patlen > 1 && ch != '[') { 1245c80476e4SDavid E. O'Brien if (redo && newdir == dir) { 1246c80476e4SDavid E. O'Brien if (pchar == '?') { /* wrap around */ 1247c80476e4SDavid E. O'Brien Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : 0x7fffffff; 1248c80476e4SDavid E. O'Brien if (c_get_histline() == CC_ERROR) 1249c80476e4SDavid E. O'Brien /* Hist_num was fixed by first call */ 1250c80476e4SDavid E. O'Brien (void) c_get_histline(); 1251c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ? 1252c80476e4SDavid E. O'Brien LastChar : InputBuf; 1253c80476e4SDavid E. O'Brien } else 1254c80476e4SDavid E. O'Brien Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1; 1255c80476e4SDavid E. O'Brien } 1256c80476e4SDavid E. O'Brien patbuf[patlen++] = '*'; 1257c80476e4SDavid E. O'Brien patbuf[patlen] = '\0'; 1258c80476e4SDavid E. O'Brien if (Cursor < InputBuf || Cursor > LastChar || 1259c80476e4SDavid E. O'Brien (ret = c_search_line(&patbuf[1], newdir)) == CC_ERROR) { 1260c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */ 1261c80476e4SDavid E. O'Brien ret = newdir == F_UP_SEARCH_HIST ? 1262c80476e4SDavid E. O'Brien e_up_search_hist(0) : e_down_search_hist(0); 1263c80476e4SDavid E. O'Brien if (ret != CC_ERROR) { 1264c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ? 1265c80476e4SDavid E. O'Brien LastChar : InputBuf; 1266c80476e4SDavid E. O'Brien (void) c_search_line(&patbuf[1], newdir); 1267c80476e4SDavid E. O'Brien } 1268c80476e4SDavid E. O'Brien } 1269c80476e4SDavid E. O'Brien patbuf[--patlen] = '\0'; 1270c80476e4SDavid E. O'Brien if (ret == CC_ERROR) { 1271c80476e4SDavid E. O'Brien SoundBeep(); 1272c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) { 1273c80476e4SDavid E. O'Brien Hist_num = oldHist_num; 1274c80476e4SDavid E. O'Brien if (c_get_histline() == CC_ERROR) 1275c80476e4SDavid E. O'Brien return(CC_ERROR); 1276c80476e4SDavid E. O'Brien } 1277c80476e4SDavid E. O'Brien Cursor = oldCursor; 1278c80476e4SDavid E. O'Brien pchar = '?'; 1279c80476e4SDavid E. O'Brien } else { 1280c80476e4SDavid E. O'Brien pchar = ':'; 1281c80476e4SDavid E. O'Brien } 1282c80476e4SDavid E. O'Brien } 1283c80476e4SDavid E. O'Brien 1284c80476e4SDavid E. O'Brien ret = e_inc_search(newdir); 1285c80476e4SDavid E. O'Brien 1286c80476e4SDavid E. O'Brien if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') { 1287c80476e4SDavid E. O'Brien /* break abort of failed search at last non-failed */ 1288c80476e4SDavid E. O'Brien ret = CC_NORM; 1289c80476e4SDavid E. O'Brien } 1290c80476e4SDavid E. O'Brien 1291c80476e4SDavid E. O'Brien } 1292c80476e4SDavid E. O'Brien 1293c80476e4SDavid E. O'Brien if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { 1294c80476e4SDavid E. O'Brien /* restore on normal return or error exit */ 1295c80476e4SDavid E. O'Brien pchar = oldpchar; 1296c80476e4SDavid E. O'Brien patlen = oldpatlen; 1297c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) { 1298c80476e4SDavid E. O'Brien Hist_num = oldHist_num; 1299c80476e4SDavid E. O'Brien if (c_get_histline() == CC_ERROR) 1300c80476e4SDavid E. O'Brien return(CC_ERROR); 1301c80476e4SDavid E. O'Brien } 1302c80476e4SDavid E. O'Brien Cursor = oldCursor; 1303c80476e4SDavid E. O'Brien if (ret == CC_ERROR) 1304c80476e4SDavid E. O'Brien Refresh(); 1305c80476e4SDavid E. O'Brien } 1306c80476e4SDavid E. O'Brien if (done || ret != CC_NORM) 1307c80476e4SDavid E. O'Brien return(ret); 1308c80476e4SDavid E. O'Brien 1309c80476e4SDavid E. O'Brien } 1310c80476e4SDavid E. O'Brien 1311c80476e4SDavid E. O'Brien } 1312c80476e4SDavid E. O'Brien 1313c80476e4SDavid E. O'Brien static CCRETVAL 1314c80476e4SDavid E. O'Brien v_search(dir) 1315c80476e4SDavid E. O'Brien int dir; 1316c80476e4SDavid E. O'Brien { 1317c80476e4SDavid E. O'Brien Char ch; 1318c80476e4SDavid E. O'Brien Char tmpbuf[INBUFSIZE]; 1319c80476e4SDavid E. O'Brien Char oldbuf[INBUFSIZE]; 1320c80476e4SDavid E. O'Brien Char *oldlc, *oldc; 1321c80476e4SDavid E. O'Brien int tmplen; 1322c80476e4SDavid E. O'Brien 1323c80476e4SDavid E. O'Brien copyn(oldbuf, InputBuf, INBUFSIZE); 1324c80476e4SDavid E. O'Brien oldlc = LastChar; 1325c80476e4SDavid E. O'Brien oldc = Cursor; 1326c80476e4SDavid E. O'Brien tmplen = 0; 1327c80476e4SDavid E. O'Brien tmpbuf[tmplen++] = '*'; 1328c80476e4SDavid E. O'Brien 1329c80476e4SDavid E. O'Brien InputBuf[0] = '\0'; 1330c80476e4SDavid E. O'Brien LastChar = InputBuf; 1331c80476e4SDavid E. O'Brien Cursor = InputBuf; 1332c80476e4SDavid E. O'Brien searchdir = dir; 1333c80476e4SDavid E. O'Brien 1334c80476e4SDavid E. O'Brien c_insert(2); /* prompt + '\n' */ 1335c80476e4SDavid E. O'Brien *Cursor++ = '\n'; 1336c80476e4SDavid E. O'Brien *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/'; 1337c80476e4SDavid E. O'Brien Refresh(); 1338c80476e4SDavid E. O'Brien for (ch = 0;ch == 0;) { 1339c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 1340c80476e4SDavid E. O'Brien return(e_send_eof(0)); 1341c80476e4SDavid E. O'Brien switch (ASC(ch)) { 1342c80476e4SDavid E. O'Brien case 0010: /* Delete and backspace */ 1343c80476e4SDavid E. O'Brien case 0177: 1344c80476e4SDavid E. O'Brien if (tmplen > 1) { 1345c80476e4SDavid E. O'Brien *Cursor-- = '\0'; 1346c80476e4SDavid E. O'Brien LastChar = Cursor; 1347c80476e4SDavid E. O'Brien tmpbuf[tmplen--] = '\0'; 1348c80476e4SDavid E. O'Brien } 1349c80476e4SDavid E. O'Brien else { 1350c80476e4SDavid E. O'Brien copyn(InputBuf, oldbuf, INBUFSIZE); 1351c80476e4SDavid E. O'Brien LastChar = oldlc; 1352c80476e4SDavid E. O'Brien Cursor = oldc; 1353c80476e4SDavid E. O'Brien return(CC_REFRESH); 1354c80476e4SDavid E. O'Brien } 1355c80476e4SDavid E. O'Brien Refresh(); 1356c80476e4SDavid E. O'Brien ch = 0; 1357c80476e4SDavid E. O'Brien break; 1358c80476e4SDavid E. O'Brien 1359c80476e4SDavid E. O'Brien case 0033: /* ESC */ 13603b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII 1361c80476e4SDavid E. O'Brien case '\r': /* Newline */ 1362c80476e4SDavid E. O'Brien case '\n': 1363c80476e4SDavid E. O'Brien #else 13643b6eaa7bSAndrey A. Chernov case '\012': /* ASCII Line feed */ 13653b6eaa7bSAndrey A. Chernov case '\015': /* ASCII (or EBCDIC) Return */ 1366c80476e4SDavid E. O'Brien #endif 1367c80476e4SDavid E. O'Brien break; 1368c80476e4SDavid E. O'Brien 1369c80476e4SDavid E. O'Brien default: 1370c80476e4SDavid E. O'Brien if (tmplen >= INBUFSIZE) 1371c80476e4SDavid E. O'Brien SoundBeep(); 1372c80476e4SDavid E. O'Brien else { 1373c80476e4SDavid E. O'Brien tmpbuf[tmplen++] = ch; 1374c80476e4SDavid E. O'Brien *Cursor++ = ch; 1375c80476e4SDavid E. O'Brien LastChar = Cursor; 1376c80476e4SDavid E. O'Brien } 1377c80476e4SDavid E. O'Brien Refresh(); 1378c80476e4SDavid E. O'Brien ch = 0; 1379c80476e4SDavid E. O'Brien break; 1380c80476e4SDavid E. O'Brien } 1381c80476e4SDavid E. O'Brien } 1382c80476e4SDavid E. O'Brien 1383c80476e4SDavid E. O'Brien if (tmplen == 1) { 1384c80476e4SDavid E. O'Brien /* 1385c80476e4SDavid E. O'Brien * Use the old pattern, but wild-card it. 1386c80476e4SDavid E. O'Brien */ 1387c80476e4SDavid E. O'Brien if (patlen == 0) { 1388c80476e4SDavid E. O'Brien InputBuf[0] = '\0'; 1389c80476e4SDavid E. O'Brien LastChar = InputBuf; 1390c80476e4SDavid E. O'Brien Cursor = InputBuf; 1391c80476e4SDavid E. O'Brien Refresh(); 1392c80476e4SDavid E. O'Brien return(CC_ERROR); 1393c80476e4SDavid E. O'Brien } 1394c80476e4SDavid E. O'Brien if (patbuf[0] != '*') { 1395c80476e4SDavid E. O'Brien (void) Strcpy(tmpbuf, patbuf); 1396c80476e4SDavid E. O'Brien patbuf[0] = '*'; 1397c80476e4SDavid E. O'Brien (void) Strcpy(&patbuf[1], tmpbuf); 1398c80476e4SDavid E. O'Brien patlen++; 1399c80476e4SDavid E. O'Brien patbuf[patlen++] = '*'; 1400c80476e4SDavid E. O'Brien patbuf[patlen] = '\0'; 1401c80476e4SDavid E. O'Brien } 1402c80476e4SDavid E. O'Brien } 1403c80476e4SDavid E. O'Brien else { 1404c80476e4SDavid E. O'Brien tmpbuf[tmplen++] = '*'; 1405c80476e4SDavid E. O'Brien tmpbuf[tmplen] = '\0'; 1406c80476e4SDavid E. O'Brien (void) Strcpy(patbuf, tmpbuf); 1407c80476e4SDavid E. O'Brien patlen = tmplen; 1408c80476e4SDavid E. O'Brien } 1409c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */ 1410c80476e4SDavid E. O'Brien Cursor = LastChar = InputBuf; 1411c80476e4SDavid E. O'Brien if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) : 1412c80476e4SDavid E. O'Brien e_down_search_hist(0)) == CC_ERROR) { 1413c80476e4SDavid E. O'Brien Refresh(); 1414c80476e4SDavid E. O'Brien return(CC_ERROR); 1415c80476e4SDavid E. O'Brien } 1416c80476e4SDavid E. O'Brien else { 1417c80476e4SDavid E. O'Brien if (ch == 0033) { 1418c80476e4SDavid E. O'Brien Refresh(); 1419c80476e4SDavid E. O'Brien *LastChar++ = '\n'; 1420c80476e4SDavid E. O'Brien *LastChar = '\0'; 1421c80476e4SDavid E. O'Brien PastBottom(); 1422c80476e4SDavid E. O'Brien return(CC_NEWLINE); 1423c80476e4SDavid E. O'Brien } 1424c80476e4SDavid E. O'Brien else 1425c80476e4SDavid E. O'Brien return(CC_REFRESH); 1426c80476e4SDavid E. O'Brien } 1427c80476e4SDavid E. O'Brien } 1428c80476e4SDavid E. O'Brien 1429c80476e4SDavid E. O'Brien /* 1430c80476e4SDavid E. O'Brien * semi-PUBLIC routines. Any routine that is of type CCRETVAL is an 1431c80476e4SDavid E. O'Brien * entry point, called from the CcKeyMap indirected into the 1432c80476e4SDavid E. O'Brien * CcFuncTbl array. 1433c80476e4SDavid E. O'Brien */ 1434c80476e4SDavid E. O'Brien 1435c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1436c80476e4SDavid E. O'Brien CCRETVAL 1437c80476e4SDavid E. O'Brien v_cmd_mode(c) 1438c80476e4SDavid E. O'Brien int c; 1439c80476e4SDavid E. O'Brien { 1440c80476e4SDavid E. O'Brien USE(c); 1441c80476e4SDavid E. O'Brien InsertPos = 0; 1442c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; /* [Esc] cancels pending action */ 1443c80476e4SDavid E. O'Brien ActionPos = 0; 1444c80476e4SDavid E. O'Brien DoingArg = 0; 1445c80476e4SDavid E. O'Brien if (UndoPtr > Cursor) 1446c80476e4SDavid E. O'Brien UndoSize = (int)(UndoPtr - Cursor); 1447c80476e4SDavid E. O'Brien else 1448c80476e4SDavid E. O'Brien UndoSize = (int)(Cursor - UndoPtr); 1449c80476e4SDavid E. O'Brien 1450c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 1451c80476e4SDavid E. O'Brien c_alternativ_key_map(1); 1452c80476e4SDavid E. O'Brien #ifdef notdef 1453c80476e4SDavid E. O'Brien /* 1454c80476e4SDavid E. O'Brien * We don't want to move the cursor, because all the editing 1455c80476e4SDavid E. O'Brien * commands don't include the character under the cursor. 1456c80476e4SDavid E. O'Brien */ 1457c80476e4SDavid E. O'Brien if (Cursor > InputBuf) 1458c80476e4SDavid E. O'Brien Cursor--; 1459c80476e4SDavid E. O'Brien #endif 1460c80476e4SDavid E. O'Brien RefCursor(); 1461c80476e4SDavid E. O'Brien return(CC_NORM); 1462c80476e4SDavid E. O'Brien } 1463c80476e4SDavid E. O'Brien 1464c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1465c80476e4SDavid E. O'Brien CCRETVAL 1466c80476e4SDavid E. O'Brien e_unassigned(c) 1467c80476e4SDavid E. O'Brien int c; 1468c80476e4SDavid E. O'Brien { /* bound to keys that arn't really assigned */ 1469c80476e4SDavid E. O'Brien USE(c); 1470c80476e4SDavid E. O'Brien SoundBeep(); 1471c80476e4SDavid E. O'Brien flush(); 1472c80476e4SDavid E. O'Brien return(CC_NORM); 1473c80476e4SDavid E. O'Brien } 1474c80476e4SDavid E. O'Brien 1475c80476e4SDavid E. O'Brien CCRETVAL 1476c80476e4SDavid E. O'Brien e_insert(c) 14776767bd61SMark Peek int c; 1478c80476e4SDavid E. O'Brien { 14796767bd61SMark Peek int i; 1480c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1481c80476e4SDavid E. O'Brien CCRETVAL ret; 1482c80476e4SDavid E. O'Brien static Char savec; 1483c80476e4SDavid E. O'Brien static int exterr = 0; 1484c80476e4SDavid E. O'Brien #endif 1485c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS 1486c80476e4SDavid E. O'Brien c &= ASCII; /* no meta chars ever */ 1487c80476e4SDavid E. O'Brien #endif 1488c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1489c80476e4SDavid E. O'Brien ret = (CCRETVAL) CC_NORM; 1490c80476e4SDavid E. O'Brien #endif 1491c80476e4SDavid E. O'Brien 1492c80476e4SDavid E. O'Brien if (!c) 1493c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1494c80476e4SDavid E. O'Brien 1495c80476e4SDavid E. O'Brien if (LastChar + Argument >= InputLim) 1496c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */ 1497c80476e4SDavid E. O'Brien 1498c80476e4SDavid E. O'Brien if (Argument == 1) { /* How was this optimized ???? */ 1499c80476e4SDavid E. O'Brien 1500c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1501c80476e4SDavid E. O'Brien if(_enable_mbdisp && extins && exterr && Ismbyte2(c)) { 1502c80476e4SDavid E. O'Brien extins = 0; 1503c80476e4SDavid E. O'Brien exterr = 0; 1504c80476e4SDavid E. O'Brien return(CC_ERROR); 1505c80476e4SDavid E. O'Brien } 1506c80476e4SDavid E. O'Brien #endif 1507c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 1508c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor; 1509c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1510c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */ 1511c80476e4SDavid E. O'Brien } 1512c80476e4SDavid E. O'Brien 1513c80476e4SDavid E. O'Brien c_insert(1); 1514c80476e4SDavid E. O'Brien 1515c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1516c80476e4SDavid E. O'Brien /* 1st. byte is store to special buffer, and replace space */ 1517c80476e4SDavid E. O'Brien if(_enable_mbdisp && extins == 0 && Ismbyte1(c)) { 1518c80476e4SDavid E. O'Brien extins++; 1519c80476e4SDavid E. O'Brien savec = (Char) c; 1520c80476e4SDavid E. O'Brien *Cursor++ = (Char) ' '; 1521c80476e4SDavid E. O'Brien } 1522c80476e4SDavid E. O'Brien else if (_enable_mbdisp && extins && Ismbyte2(c)) { 1523c80476e4SDavid E. O'Brien *(Cursor-1) = savec; 1524c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1525c80476e4SDavid E. O'Brien extins = 0; 1526c80476e4SDavid E. O'Brien e_redisp(1); 1527c80476e4SDavid E. O'Brien Refresh(); 1528c80476e4SDavid E. O'Brien ret = CC_REFRESH; 1529c80476e4SDavid E. O'Brien } 1530c80476e4SDavid E. O'Brien else 1531c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1532c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */ 1533c80476e4SDavid E. O'Brien if (ret != CC_REFRESH) 1534c80476e4SDavid E. O'Brien RefPlusOne(); /* fast refresh for one char. */ 1535c80476e4SDavid E. O'Brien #else 1536c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1537c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */ 1538c80476e4SDavid E. O'Brien RefPlusOne(); /* fast refresh for one char. */ 1539c80476e4SDavid E. O'Brien #endif 1540c80476e4SDavid E. O'Brien } 1541c80476e4SDavid E. O'Brien else { 1542c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1543c80476e4SDavid E. O'Brien /* Cannot use ESC-(number) for multi-byte */ 1544c80476e4SDavid E. O'Brien if (_enable_mbdisp && extins == 0 && Ismbyte1(c)) { 1545c80476e4SDavid E. O'Brien extins++; 1546c80476e4SDavid E. O'Brien exterr++; 1547c80476e4SDavid E. O'Brien return(CC_ERROR); 1548c80476e4SDavid E. O'Brien } 1549c80476e4SDavid E. O'Brien else if (_enable_mbdisp && extins && exterr && Ismbyte2(c)) 1550c80476e4SDavid E. O'Brien { 1551c80476e4SDavid E. O'Brien extins = 0; 1552c80476e4SDavid E. O'Brien exterr = 0; 1553c80476e4SDavid E. O'Brien return(CC_ERROR); 1554c80476e4SDavid E. O'Brien } 1555c80476e4SDavid E. O'Brien #endif 1556c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 1557c80476e4SDavid E. O'Brien 1558c80476e4SDavid E. O'Brien for(i=0;i<Argument;i++) 1559c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *(Cursor+i); 1560c80476e4SDavid E. O'Brien 1561c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1562c80476e4SDavid E. O'Brien c_delafter(Argument); /* Do NOT use the saving ONE */ 1563c80476e4SDavid E. O'Brien } 1564c80476e4SDavid E. O'Brien 1565c80476e4SDavid E. O'Brien c_insert(Argument); 1566c80476e4SDavid E. O'Brien 1567c80476e4SDavid E. O'Brien while (Argument--) 1568c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1569c80476e4SDavid E. O'Brien Refresh(); 1570c80476e4SDavid E. O'Brien } 1571c80476e4SDavid E. O'Brien 1572c80476e4SDavid E. O'Brien if (inputmode == MODE_REPLACE_1) 1573c80476e4SDavid E. O'Brien (void) v_cmd_mode(0); 1574c80476e4SDavid E. O'Brien 1575c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1576c80476e4SDavid E. O'Brien return(ret); 1577c80476e4SDavid E. O'Brien #else 1578c80476e4SDavid E. O'Brien return(CC_NORM); 1579c80476e4SDavid E. O'Brien #endif 1580c80476e4SDavid E. O'Brien } 1581c80476e4SDavid E. O'Brien 1582c80476e4SDavid E. O'Brien int 1583c80476e4SDavid E. O'Brien InsertStr(s) /* insert ASCIZ s at cursor (for complete) */ 1584c80476e4SDavid E. O'Brien Char *s; 1585c80476e4SDavid E. O'Brien { 15866767bd61SMark Peek int len; 1587c80476e4SDavid E. O'Brien 1588c80476e4SDavid E. O'Brien if ((len = (int) Strlen(s)) <= 0) 1589c80476e4SDavid E. O'Brien return -1; 1590c80476e4SDavid E. O'Brien if (LastChar + len >= InputLim) 1591c80476e4SDavid E. O'Brien return -1; /* end of buffer space */ 1592c80476e4SDavid E. O'Brien 1593c80476e4SDavid E. O'Brien c_insert(len); 1594c80476e4SDavid E. O'Brien while (len--) 1595c80476e4SDavid E. O'Brien *Cursor++ = *s++; 1596c80476e4SDavid E. O'Brien return 0; 1597c80476e4SDavid E. O'Brien } 1598c80476e4SDavid E. O'Brien 1599c80476e4SDavid E. O'Brien void 1600c80476e4SDavid E. O'Brien DeleteBack(n) /* delete the n characters before . */ 1601c80476e4SDavid E. O'Brien int n; 1602c80476e4SDavid E. O'Brien { 1603c80476e4SDavid E. O'Brien if (n <= 0) 1604c80476e4SDavid E. O'Brien return; 1605c80476e4SDavid E. O'Brien if (Cursor >= &InputBuf[n]) { 1606c80476e4SDavid E. O'Brien c_delbefore(n); /* delete before dot */ 1607c80476e4SDavid E. O'Brien if (n > Cursor - InputBuf) 1608c80476e4SDavid E. O'Brien Cursor = InputBuf; /* bounds check */ 1609c80476e4SDavid E. O'Brien else 1610c80476e4SDavid E. O'Brien Cursor -= n; 1611c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 1612c80476e4SDavid E. O'Brien if(_enable_mbdisp && extdel && Cursor > InputBuf) { 1613c80476e4SDavid E. O'Brien Cursor--; 1614c80476e4SDavid E. O'Brien e_redisp(1); 1615c80476e4SDavid E. O'Brien } 1616c80476e4SDavid E. O'Brien #endif 1617c80476e4SDavid E. O'Brien } 1618c80476e4SDavid E. O'Brien } 1619c80476e4SDavid E. O'Brien 1620c80476e4SDavid E. O'Brien CCRETVAL 1621c80476e4SDavid E. O'Brien e_digit(c) /* gray magic here */ 16226767bd61SMark Peek int c; 1623c80476e4SDavid E. O'Brien { 1624c80476e4SDavid E. O'Brien if (!Isdigit(c)) 1625c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1626c80476e4SDavid E. O'Brien 1627c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1628c80476e4SDavid E. O'Brien if (LastCmd == F_ARGFOUR) /* if last command was ^U */ 1629c80476e4SDavid E. O'Brien Argument = c - '0'; 1630c80476e4SDavid E. O'Brien else { 1631c80476e4SDavid E. O'Brien if (Argument > 1000000) 1632c80476e4SDavid E. O'Brien return CC_ERROR; 1633c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1634c80476e4SDavid E. O'Brien } 1635c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1636c80476e4SDavid E. O'Brien } 1637c80476e4SDavid E. O'Brien else { 1638c80476e4SDavid E. O'Brien if (LastChar + 1 >= InputLim) 1639c80476e4SDavid E. O'Brien return CC_ERROR; /* end of buffer space */ 1640c80476e4SDavid E. O'Brien 1641c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 1642c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor; 1643c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1644c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */ 1645c80476e4SDavid E. O'Brien } 1646c80476e4SDavid E. O'Brien c_insert(1); 1647c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1648c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */ 1649c80476e4SDavid E. O'Brien RefPlusOne(); /* fast refresh for one char. */ 1650c80476e4SDavid E. O'Brien } 1651c80476e4SDavid E. O'Brien return(CC_NORM); 1652c80476e4SDavid E. O'Brien } 1653c80476e4SDavid E. O'Brien 1654c80476e4SDavid E. O'Brien CCRETVAL 1655c80476e4SDavid E. O'Brien e_argdigit(c) /* for ESC-n */ 16566767bd61SMark Peek int c; 1657c80476e4SDavid E. O'Brien { 1658c80476e4SDavid E. O'Brien c &= ASCII; 1659c80476e4SDavid E. O'Brien 1660c80476e4SDavid E. O'Brien if (!Isdigit(c)) 1661c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1662c80476e4SDavid E. O'Brien 1663c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1664c80476e4SDavid E. O'Brien if (Argument > 1000000) 1665c80476e4SDavid E. O'Brien return CC_ERROR; 1666c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1667c80476e4SDavid E. O'Brien } 1668c80476e4SDavid E. O'Brien else { /* else starting an argument */ 1669c80476e4SDavid E. O'Brien Argument = c - '0'; 1670c80476e4SDavid E. O'Brien DoingArg = 1; 1671c80476e4SDavid E. O'Brien } 1672c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1673c80476e4SDavid E. O'Brien } 1674c80476e4SDavid E. O'Brien 1675c80476e4SDavid E. O'Brien CCRETVAL 1676c80476e4SDavid E. O'Brien v_zero(c) /* command mode 0 for vi */ 16776767bd61SMark Peek int c; 1678c80476e4SDavid E. O'Brien { 1679c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1680c80476e4SDavid E. O'Brien if (Argument > 1000000) 1681c80476e4SDavid E. O'Brien return CC_ERROR; 1682c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1683c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1684c80476e4SDavid E. O'Brien } 1685c80476e4SDavid E. O'Brien else { /* else starting an argument */ 1686c80476e4SDavid E. O'Brien Cursor = InputBuf; 1687c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 1688c80476e4SDavid E. O'Brien c_delfini(); 1689c80476e4SDavid E. O'Brien return(CC_REFRESH); 1690c80476e4SDavid E. O'Brien } 1691c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 1692c80476e4SDavid E. O'Brien return(CC_NORM); 1693c80476e4SDavid E. O'Brien } 1694c80476e4SDavid E. O'Brien } 1695c80476e4SDavid E. O'Brien 1696c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1697c80476e4SDavid E. O'Brien CCRETVAL 1698c80476e4SDavid E. O'Brien e_newline(c) 1699c80476e4SDavid E. O'Brien int c; 1700c80476e4SDavid E. O'Brien { /* always ignore argument */ 1701c80476e4SDavid E. O'Brien USE(c); 1702c80476e4SDavid E. O'Brien /* PastBottom(); NOW done in ed.inputl.c */ 1703c80476e4SDavid E. O'Brien *LastChar++ = '\n'; /* for the benefit of CSH */ 1704c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1705c80476e4SDavid E. O'Brien if (VImode) 1706c80476e4SDavid E. O'Brien InsertPos = InputBuf; /* Reset editing position */ 1707c80476e4SDavid E. O'Brien return(CC_NEWLINE); 1708c80476e4SDavid E. O'Brien } 1709c80476e4SDavid E. O'Brien 1710c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1711c80476e4SDavid E. O'Brien CCRETVAL 1712c80476e4SDavid E. O'Brien e_send_eof(c) 1713c80476e4SDavid E. O'Brien int c; 1714c80476e4SDavid E. O'Brien { /* for when ^D is ONLY send-eof */ 1715c80476e4SDavid E. O'Brien USE(c); 1716c80476e4SDavid E. O'Brien PastBottom(); 1717c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1718c80476e4SDavid E. O'Brien return(CC_EOF); 1719c80476e4SDavid E. O'Brien } 1720c80476e4SDavid E. O'Brien 1721c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1722c80476e4SDavid E. O'Brien CCRETVAL 1723c80476e4SDavid E. O'Brien e_complete(c) 1724c80476e4SDavid E. O'Brien int c; 1725c80476e4SDavid E. O'Brien { 1726c80476e4SDavid E. O'Brien USE(c); 1727c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1728c80476e4SDavid E. O'Brien return(CC_COMPLETE); 1729c80476e4SDavid E. O'Brien } 1730c80476e4SDavid E. O'Brien 1731c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1732c80476e4SDavid E. O'Brien CCRETVAL 1733c80476e4SDavid E. O'Brien e_complete_back(c) 1734c80476e4SDavid E. O'Brien int c; 1735c80476e4SDavid E. O'Brien { 1736c80476e4SDavid E. O'Brien USE(c); 1737c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1738c80476e4SDavid E. O'Brien return(CC_COMPLETE_BACK); 1739c80476e4SDavid E. O'Brien } 1740c80476e4SDavid E. O'Brien 1741c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1742c80476e4SDavid E. O'Brien CCRETVAL 1743c80476e4SDavid E. O'Brien e_complete_fwd(c) 1744c80476e4SDavid E. O'Brien int c; 1745c80476e4SDavid E. O'Brien { 1746c80476e4SDavid E. O'Brien USE(c); 1747c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1748c80476e4SDavid E. O'Brien return(CC_COMPLETE_FWD); 1749c80476e4SDavid E. O'Brien } 1750c80476e4SDavid E. O'Brien 1751c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1752c80476e4SDavid E. O'Brien CCRETVAL 1753c80476e4SDavid E. O'Brien e_complete_all(c) 1754c80476e4SDavid E. O'Brien int c; 1755c80476e4SDavid E. O'Brien { 1756c80476e4SDavid E. O'Brien USE(c); 1757c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1758c80476e4SDavid E. O'Brien return(CC_COMPLETE_ALL); 1759c80476e4SDavid E. O'Brien } 1760c80476e4SDavid E. O'Brien 1761c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1762c80476e4SDavid E. O'Brien CCRETVAL 1763c80476e4SDavid E. O'Brien v_cm_complete(c) 1764c80476e4SDavid E. O'Brien int c; 1765c80476e4SDavid E. O'Brien { 1766c80476e4SDavid E. O'Brien USE(c); 1767c80476e4SDavid E. O'Brien if (Cursor < LastChar) 1768c80476e4SDavid E. O'Brien Cursor++; 1769c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1770c80476e4SDavid E. O'Brien return(CC_COMPLETE); 1771c80476e4SDavid E. O'Brien } 1772c80476e4SDavid E. O'Brien 1773c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1774c80476e4SDavid E. O'Brien CCRETVAL 1775c80476e4SDavid E. O'Brien e_toggle_hist(c) 1776c80476e4SDavid E. O'Brien int c; 1777c80476e4SDavid E. O'Brien { 1778c80476e4SDavid E. O'Brien struct Hist *hp; 1779c80476e4SDavid E. O'Brien int h; 1780c80476e4SDavid E. O'Brien 1781c80476e4SDavid E. O'Brien USE(c); 1782c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1783c80476e4SDavid E. O'Brien 1784c80476e4SDavid E. O'Brien if (Hist_num <= 0) { 1785c80476e4SDavid E. O'Brien return CC_ERROR; 1786c80476e4SDavid E. O'Brien } 1787c80476e4SDavid E. O'Brien 1788c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1789c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */ 1790c80476e4SDavid E. O'Brien return(CC_ERROR); 1791c80476e4SDavid E. O'Brien } 1792c80476e4SDavid E. O'Brien 1793c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++) 1794c80476e4SDavid E. O'Brien hp = hp->Hnext; 1795c80476e4SDavid E. O'Brien 1796c80476e4SDavid E. O'Brien if (!CurrentHistLit) { 1797c80476e4SDavid E. O'Brien if (hp->histline) { 1798c80476e4SDavid E. O'Brien copyn(InputBuf, hp->histline, INBUFSIZE); 1799c80476e4SDavid E. O'Brien CurrentHistLit = 1; 1800c80476e4SDavid E. O'Brien } 1801c80476e4SDavid E. O'Brien else { 1802c80476e4SDavid E. O'Brien return CC_ERROR; 1803c80476e4SDavid E. O'Brien } 1804c80476e4SDavid E. O'Brien } 1805c80476e4SDavid E. O'Brien else { 1806b2be84b1SDavid E. O'Brien (void) sprlex(InputBuf, sizeof(InputBuf) / sizeof(Char), &hp->Hlex); 1807c80476e4SDavid E. O'Brien CurrentHistLit = 0; 1808c80476e4SDavid E. O'Brien } 1809c80476e4SDavid E. O'Brien 1810c80476e4SDavid E. O'Brien LastChar = InputBuf + Strlen(InputBuf); 1811c80476e4SDavid E. O'Brien if (LastChar > InputBuf) { 1812c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n') 1813c80476e4SDavid E. O'Brien LastChar--; 1814c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ') 1815c80476e4SDavid E. O'Brien LastChar--; 1816c80476e4SDavid E. O'Brien if (LastChar < InputBuf) 1817c80476e4SDavid E. O'Brien LastChar = InputBuf; 1818c80476e4SDavid E. O'Brien } 1819c80476e4SDavid E. O'Brien 1820c80476e4SDavid E. O'Brien #ifdef KSHVI 1821c80476e4SDavid E. O'Brien if (VImode) 1822c80476e4SDavid E. O'Brien Cursor = InputBuf; 1823c80476e4SDavid E. O'Brien else 1824c80476e4SDavid E. O'Brien #endif /* KSHVI */ 1825c80476e4SDavid E. O'Brien Cursor = LastChar; 1826c80476e4SDavid E. O'Brien 1827c80476e4SDavid E. O'Brien return(CC_REFRESH); 1828c80476e4SDavid E. O'Brien } 1829c80476e4SDavid E. O'Brien 1830c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1831c80476e4SDavid E. O'Brien CCRETVAL 1832c80476e4SDavid E. O'Brien e_up_hist(c) 1833c80476e4SDavid E. O'Brien int c; 1834c80476e4SDavid E. O'Brien { 1835c80476e4SDavid E. O'Brien Char beep = 0; 1836c80476e4SDavid E. O'Brien 1837c80476e4SDavid E. O'Brien USE(c); 1838c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1839c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1840c80476e4SDavid E. O'Brien 1841c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* save the current buffer away */ 1842c80476e4SDavid E. O'Brien copyn(HistBuf, InputBuf, INBUFSIZE); 1843c80476e4SDavid E. O'Brien LastHist = HistBuf + (LastChar - InputBuf); 1844c80476e4SDavid E. O'Brien } 1845c80476e4SDavid E. O'Brien 1846c80476e4SDavid E. O'Brien Hist_num += Argument; 1847c80476e4SDavid E. O'Brien 1848c80476e4SDavid E. O'Brien if (c_get_histline() == CC_ERROR) { 1849c80476e4SDavid E. O'Brien beep = 1; 1850c80476e4SDavid E. O'Brien (void) c_get_histline(); /* Hist_num was fixed by first call */ 1851c80476e4SDavid E. O'Brien } 1852c80476e4SDavid E. O'Brien 1853c80476e4SDavid E. O'Brien Refresh(); 1854c80476e4SDavid E. O'Brien if (beep) 1855c80476e4SDavid E. O'Brien return(CC_ERROR); 1856c80476e4SDavid E. O'Brien else 1857c80476e4SDavid E. O'Brien return(CC_NORM); /* was CC_UP_HIST */ 1858c80476e4SDavid E. O'Brien } 1859c80476e4SDavid E. O'Brien 1860c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1861c80476e4SDavid E. O'Brien CCRETVAL 1862c80476e4SDavid E. O'Brien e_down_hist(c) 1863c80476e4SDavid E. O'Brien int c; 1864c80476e4SDavid E. O'Brien { 1865c80476e4SDavid E. O'Brien USE(c); 1866c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1867c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1868c80476e4SDavid E. O'Brien 1869c80476e4SDavid E. O'Brien Hist_num -= Argument; 1870c80476e4SDavid E. O'Brien 1871c80476e4SDavid E. O'Brien if (Hist_num < 0) { 1872c80476e4SDavid E. O'Brien Hist_num = 0; 1873c80476e4SDavid E. O'Brien return(CC_ERROR); /* make it beep */ 1874c80476e4SDavid E. O'Brien } 1875c80476e4SDavid E. O'Brien 1876c80476e4SDavid E. O'Brien return(c_get_histline()); 1877c80476e4SDavid E. O'Brien } 1878c80476e4SDavid E. O'Brien 1879c80476e4SDavid E. O'Brien 1880c80476e4SDavid E. O'Brien 1881c80476e4SDavid E. O'Brien /* 1882c80476e4SDavid E. O'Brien * c_hmatch() return True if the pattern matches the prefix 1883c80476e4SDavid E. O'Brien */ 1884c80476e4SDavid E. O'Brien static int 1885c80476e4SDavid E. O'Brien c_hmatch(str) 1886c80476e4SDavid E. O'Brien Char *str; 1887c80476e4SDavid E. O'Brien { 1888c80476e4SDavid E. O'Brien if (Strncmp(patbuf, str, (size_t) patlen) == 0) 1889c80476e4SDavid E. O'Brien return 1; 1890c80476e4SDavid E. O'Brien return Gmatch(str, patbuf); 1891c80476e4SDavid E. O'Brien } 1892c80476e4SDavid E. O'Brien 1893c80476e4SDavid E. O'Brien /* 1894c80476e4SDavid E. O'Brien * c_hsetpat(): Set the history seatch pattern 1895c80476e4SDavid E. O'Brien */ 1896c80476e4SDavid E. O'Brien static void 1897c80476e4SDavid E. O'Brien c_hsetpat() 1898c80476e4SDavid E. O'Brien { 1899c80476e4SDavid E. O'Brien if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) { 1900c80476e4SDavid E. O'Brien patlen = (int) (Cursor - InputBuf); 1901c80476e4SDavid E. O'Brien if (patlen >= INBUFSIZE) patlen = INBUFSIZE -1; 1902c80476e4SDavid E. O'Brien if (patlen >= 0) { 1903c80476e4SDavid E. O'Brien (void) Strncpy(patbuf, InputBuf, (size_t) patlen); 1904c80476e4SDavid E. O'Brien patbuf[patlen] = '\0'; 1905c80476e4SDavid E. O'Brien } 1906c80476e4SDavid E. O'Brien else 1907c80476e4SDavid E. O'Brien patlen = (int) Strlen(patbuf); 1908c80476e4SDavid E. O'Brien } 1909c80476e4SDavid E. O'Brien #ifdef SDEBUG 1910c80476e4SDavid E. O'Brien xprintf("\nHist_num = %d\n", Hist_num); 1911c80476e4SDavid E. O'Brien xprintf("patlen = %d\n", patlen); 1912c80476e4SDavid E. O'Brien xprintf("patbuf = \"%S\"\n", patbuf); 1913c80476e4SDavid E. O'Brien xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf); 1914c80476e4SDavid E. O'Brien #endif 1915c80476e4SDavid E. O'Brien } 1916c80476e4SDavid E. O'Brien 1917c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1918c80476e4SDavid E. O'Brien CCRETVAL 1919c80476e4SDavid E. O'Brien e_up_search_hist(c) 1920c80476e4SDavid E. O'Brien int c; 1921c80476e4SDavid E. O'Brien { 1922c80476e4SDavid E. O'Brien struct Hist *hp; 1923c80476e4SDavid E. O'Brien int h; 1924c80476e4SDavid E. O'Brien bool found = 0; 1925c80476e4SDavid E. O'Brien 1926c80476e4SDavid E. O'Brien USE(c); 1927c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 1928c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1929c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1930c80476e4SDavid E. O'Brien if (Hist_num < 0) { 1931c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT 1932c80476e4SDavid E. O'Brien xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname); 1933c80476e4SDavid E. O'Brien #endif 1934c80476e4SDavid E. O'Brien Hist_num = 0; 1935c80476e4SDavid E. O'Brien return(CC_ERROR); 1936c80476e4SDavid E. O'Brien } 1937c80476e4SDavid E. O'Brien 1938c80476e4SDavid E. O'Brien if (Hist_num == 0) 1939c80476e4SDavid E. O'Brien { 1940c80476e4SDavid E. O'Brien copyn(HistBuf, InputBuf, INBUFSIZE); 1941c80476e4SDavid E. O'Brien LastHist = HistBuf + (LastChar - InputBuf); 1942c80476e4SDavid E. O'Brien } 1943c80476e4SDavid E. O'Brien 1944c80476e4SDavid E. O'Brien 1945c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1946c80476e4SDavid E. O'Brien if (hp == NULL) 1947c80476e4SDavid E. O'Brien return(CC_ERROR); 1948c80476e4SDavid E. O'Brien 1949c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */ 1950c80476e4SDavid E. O'Brien 1951c80476e4SDavid E. O'Brien for (h = 1; h <= Hist_num; h++) 1952c80476e4SDavid E. O'Brien hp = hp->Hnext; 1953c80476e4SDavid E. O'Brien 1954c80476e4SDavid E. O'Brien while (hp != NULL) { 1955c80476e4SDavid E. O'Brien Char sbuf[INBUFSIZE], *hl; 1956c80476e4SDavid E. O'Brien if (hp->histline == NULL) { 1957b2be84b1SDavid E. O'Brien hp->histline = Strsave(sprlex(sbuf, sizeof(sbuf) / sizeof(Char), 1958b2be84b1SDavid E. O'Brien &hp->Hlex)); 1959c80476e4SDavid E. O'Brien } 1960b2be84b1SDavid E. O'Brien hl = HistLit ? hp->histline : sprlex(sbuf, sizeof(sbuf) / sizeof(Char), 1961b2be84b1SDavid E. O'Brien &hp->Hlex); 1962c80476e4SDavid E. O'Brien #ifdef SDEBUG 1963c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl); 1964c80476e4SDavid E. O'Brien #endif 1965c80476e4SDavid E. O'Brien if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) || 1966c80476e4SDavid E. O'Brien hl[LastChar-InputBuf]) && c_hmatch(hl)) { 1967c80476e4SDavid E. O'Brien found++; 1968c80476e4SDavid E. O'Brien break; 1969c80476e4SDavid E. O'Brien } 1970c80476e4SDavid E. O'Brien h++; 1971c80476e4SDavid E. O'Brien hp = hp->Hnext; 1972c80476e4SDavid E. O'Brien } 1973c80476e4SDavid E. O'Brien 1974c80476e4SDavid E. O'Brien if (!found) { 1975c80476e4SDavid E. O'Brien #ifdef SDEBUG 1976c80476e4SDavid E. O'Brien xprintf("not found\n"); 1977c80476e4SDavid E. O'Brien #endif 1978c80476e4SDavid E. O'Brien return(CC_ERROR); 1979c80476e4SDavid E. O'Brien } 1980c80476e4SDavid E. O'Brien 1981c80476e4SDavid E. O'Brien Hist_num = h; 1982c80476e4SDavid E. O'Brien 1983c80476e4SDavid E. O'Brien return(c_get_histline()); 1984c80476e4SDavid E. O'Brien } 1985c80476e4SDavid E. O'Brien 1986c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1987c80476e4SDavid E. O'Brien CCRETVAL 1988c80476e4SDavid E. O'Brien e_down_search_hist(c) 1989c80476e4SDavid E. O'Brien int c; 1990c80476e4SDavid E. O'Brien { 1991c80476e4SDavid E. O'Brien struct Hist *hp; 1992c80476e4SDavid E. O'Brien int h; 1993c80476e4SDavid E. O'Brien bool found = 0; 1994c80476e4SDavid E. O'Brien 1995c80476e4SDavid E. O'Brien USE(c); 1996c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 1997c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1998c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1999c80476e4SDavid E. O'Brien 2000c80476e4SDavid E. O'Brien if (Hist_num == 0) 2001c80476e4SDavid E. O'Brien return(CC_ERROR); 2002c80476e4SDavid E. O'Brien 2003c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 2004c80476e4SDavid E. O'Brien if (hp == 0) 2005c80476e4SDavid E. O'Brien return(CC_ERROR); 2006c80476e4SDavid E. O'Brien 2007c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */ 2008c80476e4SDavid E. O'Brien 2009c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num && hp; h++) { 2010c80476e4SDavid E. O'Brien Char sbuf[INBUFSIZE], *hl; 2011c80476e4SDavid E. O'Brien if (hp->histline == NULL) { 2012b2be84b1SDavid E. O'Brien hp->histline = Strsave(sprlex(sbuf, sizeof(sbuf) / sizeof(Char), 2013b2be84b1SDavid E. O'Brien &hp->Hlex)); 2014c80476e4SDavid E. O'Brien } 2015b2be84b1SDavid E. O'Brien hl = HistLit ? hp->histline : sprlex(sbuf, sizeof(sbuf) / sizeof(Char), 2016b2be84b1SDavid E. O'Brien &hp->Hlex); 2017c80476e4SDavid E. O'Brien #ifdef SDEBUG 2018c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl); 2019c80476e4SDavid E. O'Brien #endif 2020c80476e4SDavid E. O'Brien if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) || 2021c80476e4SDavid E. O'Brien hl[LastChar-InputBuf]) && c_hmatch(hl)) 2022c80476e4SDavid E. O'Brien found = h; 2023c80476e4SDavid E. O'Brien hp = hp->Hnext; 2024c80476e4SDavid E. O'Brien } 2025c80476e4SDavid E. O'Brien 2026c80476e4SDavid E. O'Brien if (!found) { /* is it the current history number? */ 2027c80476e4SDavid E. O'Brien if (!c_hmatch(HistBuf)) { 2028c80476e4SDavid E. O'Brien #ifdef SDEBUG 2029c80476e4SDavid E. O'Brien xprintf("not found\n"); 2030c80476e4SDavid E. O'Brien #endif 2031c80476e4SDavid E. O'Brien return(CC_ERROR); 2032c80476e4SDavid E. O'Brien } 2033c80476e4SDavid E. O'Brien } 2034c80476e4SDavid E. O'Brien 2035c80476e4SDavid E. O'Brien Hist_num = found; 2036c80476e4SDavid E. O'Brien 2037c80476e4SDavid E. O'Brien return(c_get_histline()); 2038c80476e4SDavid E. O'Brien } 2039c80476e4SDavid E. O'Brien 2040c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2041c80476e4SDavid E. O'Brien CCRETVAL 2042c80476e4SDavid E. O'Brien e_helpme(c) 2043c80476e4SDavid E. O'Brien int c; 2044c80476e4SDavid E. O'Brien { 2045c80476e4SDavid E. O'Brien USE(c); 2046c80476e4SDavid E. O'Brien PastBottom(); 2047c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2048c80476e4SDavid E. O'Brien return(CC_HELPME); 2049c80476e4SDavid E. O'Brien } 2050c80476e4SDavid E. O'Brien 2051c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2052c80476e4SDavid E. O'Brien CCRETVAL 2053c80476e4SDavid E. O'Brien e_correct(c) 2054c80476e4SDavid E. O'Brien int c; 2055c80476e4SDavid E. O'Brien { 2056c80476e4SDavid E. O'Brien USE(c); 2057c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2058c80476e4SDavid E. O'Brien return(CC_CORRECT); 2059c80476e4SDavid E. O'Brien } 2060c80476e4SDavid E. O'Brien 2061c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2062c80476e4SDavid E. O'Brien CCRETVAL 2063c80476e4SDavid E. O'Brien e_correctl(c) 2064c80476e4SDavid E. O'Brien int c; 2065c80476e4SDavid E. O'Brien { 2066c80476e4SDavid E. O'Brien USE(c); 2067c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2068c80476e4SDavid E. O'Brien return(CC_CORRECT_L); 2069c80476e4SDavid E. O'Brien } 2070c80476e4SDavid E. O'Brien 2071c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2072c80476e4SDavid E. O'Brien CCRETVAL 2073c80476e4SDavid E. O'Brien e_run_fg_editor(c) 2074c80476e4SDavid E. O'Brien int c; 2075c80476e4SDavid E. O'Brien { 20766767bd61SMark Peek struct process *pp; 2077c80476e4SDavid E. O'Brien extern bool tellwhat; 2078c80476e4SDavid E. O'Brien 2079c80476e4SDavid E. O'Brien USE(c); 2080c80476e4SDavid E. O'Brien if ((pp = find_stop_ed()) != NULL) { 2081c80476e4SDavid E. O'Brien /* save our editor state so we can restore it */ 2082c80476e4SDavid E. O'Brien tellwhat = 1; 2083c80476e4SDavid E. O'Brien copyn(WhichBuf, InputBuf, INBUFSIZE); 2084c80476e4SDavid E. O'Brien LastWhich = WhichBuf + (LastChar - InputBuf); 2085c80476e4SDavid E. O'Brien CursWhich = WhichBuf + (Cursor - InputBuf); 2086c80476e4SDavid E. O'Brien HistWhich = Hist_num; 2087c80476e4SDavid E. O'Brien Hist_num = 0; /* for the history commands */ 2088c80476e4SDavid E. O'Brien 2089c80476e4SDavid E. O'Brien /* put the tty in a sane mode */ 2090c80476e4SDavid E. O'Brien PastBottom(); 2091c80476e4SDavid E. O'Brien (void) Cookedmode(); /* make sure the tty is set up correctly */ 2092c80476e4SDavid E. O'Brien 2093c80476e4SDavid E. O'Brien /* do it! */ 2094c80476e4SDavid E. O'Brien fg_proc_entry(pp); 2095c80476e4SDavid E. O'Brien 2096c80476e4SDavid E. O'Brien (void) Rawmode(); /* go on */ 2097c80476e4SDavid E. O'Brien Refresh(); 2098c80476e4SDavid E. O'Brien tellwhat = 0; 2099c80476e4SDavid E. O'Brien } 2100c80476e4SDavid E. O'Brien return(CC_NORM); 2101c80476e4SDavid E. O'Brien } 2102c80476e4SDavid E. O'Brien 2103c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2104c80476e4SDavid E. O'Brien CCRETVAL 2105c80476e4SDavid E. O'Brien e_list_choices(c) 2106c80476e4SDavid E. O'Brien int c; 2107c80476e4SDavid E. O'Brien { 2108c80476e4SDavid E. O'Brien USE(c); 2109c80476e4SDavid E. O'Brien PastBottom(); 2110c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2111c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2112c80476e4SDavid E. O'Brien } 2113c80476e4SDavid E. O'Brien 2114c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2115c80476e4SDavid E. O'Brien CCRETVAL 2116c80476e4SDavid E. O'Brien e_list_all(c) 2117c80476e4SDavid E. O'Brien int c; 2118c80476e4SDavid E. O'Brien { 2119c80476e4SDavid E. O'Brien USE(c); 2120c80476e4SDavid E. O'Brien PastBottom(); 2121c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2122c80476e4SDavid E. O'Brien return(CC_LIST_ALL); 2123c80476e4SDavid E. O'Brien } 2124c80476e4SDavid E. O'Brien 2125c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2126c80476e4SDavid E. O'Brien CCRETVAL 2127c80476e4SDavid E. O'Brien e_list_glob(c) 2128c80476e4SDavid E. O'Brien int c; 2129c80476e4SDavid E. O'Brien { 2130c80476e4SDavid E. O'Brien USE(c); 2131c80476e4SDavid E. O'Brien PastBottom(); 2132c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2133c80476e4SDavid E. O'Brien return(CC_LIST_GLOB); 2134c80476e4SDavid E. O'Brien } 2135c80476e4SDavid E. O'Brien 2136c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2137c80476e4SDavid E. O'Brien CCRETVAL 2138c80476e4SDavid E. O'Brien e_expand_glob(c) 2139c80476e4SDavid E. O'Brien int c; 2140c80476e4SDavid E. O'Brien { 2141c80476e4SDavid E. O'Brien USE(c); 2142c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2143c80476e4SDavid E. O'Brien return(CC_EXPAND_GLOB); 2144c80476e4SDavid E. O'Brien } 2145c80476e4SDavid E. O'Brien 2146c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2147c80476e4SDavid E. O'Brien CCRETVAL 2148c80476e4SDavid E. O'Brien e_normalize_path(c) 2149c80476e4SDavid E. O'Brien int c; 2150c80476e4SDavid E. O'Brien { 2151c80476e4SDavid E. O'Brien USE(c); 2152c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2153c80476e4SDavid E. O'Brien return(CC_NORMALIZE_PATH); 2154c80476e4SDavid E. O'Brien } 2155c80476e4SDavid E. O'Brien 2156c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2157c80476e4SDavid E. O'Brien CCRETVAL 2158c80476e4SDavid E. O'Brien e_normalize_command(c) 2159c80476e4SDavid E. O'Brien int c; 2160c80476e4SDavid E. O'Brien { 2161c80476e4SDavid E. O'Brien USE(c); 2162c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2163c80476e4SDavid E. O'Brien return(CC_NORMALIZE_COMMAND); 2164c80476e4SDavid E. O'Brien } 2165c80476e4SDavid E. O'Brien 2166c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2167c80476e4SDavid E. O'Brien CCRETVAL 2168c80476e4SDavid E. O'Brien e_expand_vars(c) 2169c80476e4SDavid E. O'Brien int c; 2170c80476e4SDavid E. O'Brien { 2171c80476e4SDavid E. O'Brien USE(c); 2172c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2173c80476e4SDavid E. O'Brien return(CC_EXPAND_VARS); 2174c80476e4SDavid E. O'Brien } 2175c80476e4SDavid E. O'Brien 2176c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2177c80476e4SDavid E. O'Brien CCRETVAL 2178c80476e4SDavid E. O'Brien e_which(c) 2179c80476e4SDavid E. O'Brien int c; 2180c80476e4SDavid E. O'Brien { /* do a fast command line which(1) */ 2181c80476e4SDavid E. O'Brien USE(c); 2182c80476e4SDavid E. O'Brien PastBottom(); 2183c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2184c80476e4SDavid E. O'Brien return(CC_WHICH); 2185c80476e4SDavid E. O'Brien } 2186c80476e4SDavid E. O'Brien 2187c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2188c80476e4SDavid E. O'Brien CCRETVAL 2189c80476e4SDavid E. O'Brien e_last_item(c) 2190c80476e4SDavid E. O'Brien int c; 2191c80476e4SDavid E. O'Brien { /* insert the last element of the prev. cmd */ 21926767bd61SMark Peek Char *cp; 21936767bd61SMark Peek struct Hist *hp; 21946767bd61SMark Peek struct wordent *wp, *firstp; 21956767bd61SMark Peek int i; 2196c80476e4SDavid E. O'Brien Char buf[INBUFSIZE]; 2197c80476e4SDavid E. O'Brien 2198c80476e4SDavid E. O'Brien USE(c); 2199c80476e4SDavid E. O'Brien if (Argument <= 0) 2200c80476e4SDavid E. O'Brien return(CC_ERROR); 2201c80476e4SDavid E. O'Brien 2202c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 2203c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */ 2204c80476e4SDavid E. O'Brien return(CC_ERROR); 2205c80476e4SDavid E. O'Brien } 2206c80476e4SDavid E. O'Brien 2207c80476e4SDavid E. O'Brien wp = (hp->Hlex).prev; 2208c80476e4SDavid E. O'Brien 2209c80476e4SDavid E. O'Brien if (wp->prev == (struct wordent *) NULL) 2210c80476e4SDavid E. O'Brien return(CC_ERROR); /* an empty history entry */ 2211c80476e4SDavid E. O'Brien 2212c80476e4SDavid E. O'Brien firstp = (hp->Hlex).next; 2213c80476e4SDavid E. O'Brien 2214c80476e4SDavid E. O'Brien /* back up arg words in lex */ 2215c80476e4SDavid E. O'Brien for (i = 0; i < Argument && wp != firstp; i++) { 2216c80476e4SDavid E. O'Brien wp = wp->prev; 2217c80476e4SDavid E. O'Brien } 2218c80476e4SDavid E. O'Brien 2219c80476e4SDavid E. O'Brien cp = expand_lex(buf, INBUFSIZE, wp->prev, 0, i - 1); 2220c80476e4SDavid E. O'Brien *cp = '\0'; 2221c80476e4SDavid E. O'Brien if (InsertStr(buf)) 2222c80476e4SDavid E. O'Brien return(CC_ERROR); 2223c80476e4SDavid E. O'Brien 2224c80476e4SDavid E. O'Brien return(CC_REFRESH); 2225c80476e4SDavid E. O'Brien } 2226c80476e4SDavid E. O'Brien 2227c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2228c80476e4SDavid E. O'Brien CCRETVAL 2229c80476e4SDavid E. O'Brien e_dabbrev_expand(c) 2230c80476e4SDavid E. O'Brien int c; 2231c80476e4SDavid E. O'Brien { /* expand to preceding word matching prefix */ 22326767bd61SMark Peek Char *cp, *ncp, *bp; 22336767bd61SMark Peek struct Hist *hp; 22346767bd61SMark Peek int arg = 0, len = 0, i; /* len = 0 to shut up gcc -Wall */ 22356767bd61SMark Peek bool found = 0; 2236c80476e4SDavid E. O'Brien Char hbuf[INBUFSIZE]; 2237c80476e4SDavid E. O'Brien static int oldevent, hist, word; 2238c80476e4SDavid E. O'Brien static Char *start, *oldcursor; 2239c80476e4SDavid E. O'Brien 2240c80476e4SDavid E. O'Brien USE(c); 2241c80476e4SDavid E. O'Brien if (Argument <= 0) 2242c80476e4SDavid E. O'Brien return(CC_ERROR); 2243c80476e4SDavid E. O'Brien 22446767bd61SMark Peek cp = c_preword(Cursor, InputBuf, 1, STRshwordsep); 2245c80476e4SDavid E. O'Brien if (cp == Cursor || Isspace(*cp)) 2246c80476e4SDavid E. O'Brien return(CC_ERROR); 2247c80476e4SDavid E. O'Brien 2248c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 2249c80476e4SDavid E. O'Brien bp = InputBuf; 2250c80476e4SDavid E. O'Brien if (Argument == 1 && eventno == oldevent && cp == start && 2251c80476e4SDavid E. O'Brien Cursor == oldcursor && patlen > 0 && Strncmp(patbuf, cp, patlen) == 0){ 2252c80476e4SDavid E. O'Brien /* continue previous search - go to last match (hist/word) */ 2253c80476e4SDavid E. O'Brien if (hist != 0) { /* need to move up history */ 2254c80476e4SDavid E. O'Brien for (i = 1; i < hist && hp != NULL; i++) 2255c80476e4SDavid E. O'Brien hp = hp->Hnext; 2256c80476e4SDavid E. O'Brien if (hp == NULL) /* "can't happen" */ 2257c80476e4SDavid E. O'Brien return(CC_ERROR); 2258c80476e4SDavid E. O'Brien cp = expand_lex(hbuf, INBUFSIZE, &hp->Hlex, 0, NCARGS); 2259c80476e4SDavid E. O'Brien *cp = '\0'; 2260c80476e4SDavid E. O'Brien bp = hbuf; 2261c80476e4SDavid E. O'Brien hp = hp->Hnext; 2262c80476e4SDavid E. O'Brien } 22636767bd61SMark Peek cp = c_preword(cp, bp, word, STRshwordsep); 2264c80476e4SDavid E. O'Brien } else { /* starting new search */ 2265c80476e4SDavid E. O'Brien oldevent = eventno; 2266c80476e4SDavid E. O'Brien start = cp; 2267c80476e4SDavid E. O'Brien patlen = (int) (Cursor - cp); 2268c80476e4SDavid E. O'Brien (void) Strncpy(patbuf, cp, patlen); 2269c80476e4SDavid E. O'Brien hist = 0; 2270c80476e4SDavid E. O'Brien word = 0; 2271c80476e4SDavid E. O'Brien } 2272c80476e4SDavid E. O'Brien 2273c80476e4SDavid E. O'Brien while (!found) { 22746767bd61SMark Peek ncp = c_preword(cp, bp, 1, STRshwordsep); 2275c80476e4SDavid E. O'Brien if (ncp == cp || Isspace(*ncp)) { /* beginning of line */ 2276c80476e4SDavid E. O'Brien hist++; 2277c80476e4SDavid E. O'Brien word = 0; 2278c80476e4SDavid E. O'Brien if (hp == NULL) 2279c80476e4SDavid E. O'Brien return(CC_ERROR); 2280c80476e4SDavid E. O'Brien cp = expand_lex(hbuf, INBUFSIZE, &hp->Hlex, 0, NCARGS); 2281c80476e4SDavid E. O'Brien *cp = '\0'; 2282c80476e4SDavid E. O'Brien bp = hbuf; 2283c80476e4SDavid E. O'Brien hp = hp->Hnext; 2284c80476e4SDavid E. O'Brien continue; 2285c80476e4SDavid E. O'Brien } else { 2286c80476e4SDavid E. O'Brien word++; 22876767bd61SMark Peek len = (int) (c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1); 2288c80476e4SDavid E. O'Brien cp = ncp; 2289c80476e4SDavid E. O'Brien } 2290c80476e4SDavid E. O'Brien if (len > patlen && Strncmp(cp, patbuf, patlen) == 0) { 2291c80476e4SDavid E. O'Brien /* We don't fully check distinct matches as Gnuemacs does: */ 2292c80476e4SDavid E. O'Brien if (Argument > 1) { /* just count matches */ 2293c80476e4SDavid E. O'Brien if (++arg >= Argument) 2294c80476e4SDavid E. O'Brien found++; 2295c80476e4SDavid E. O'Brien } else { /* match if distinct from previous */ 2296c80476e4SDavid E. O'Brien if (len != Cursor - start || Strncmp(cp, start, len) != 0) 2297c80476e4SDavid E. O'Brien found++; 2298c80476e4SDavid E. O'Brien } 2299c80476e4SDavid E. O'Brien } 2300c80476e4SDavid E. O'Brien } 2301c80476e4SDavid E. O'Brien 2302c80476e4SDavid E. O'Brien if (LastChar + len - (Cursor - start) >= InputLim) 2303c80476e4SDavid E. O'Brien return(CC_ERROR); /* no room */ 2304c80476e4SDavid E. O'Brien DeleteBack(Cursor - start); 2305c80476e4SDavid E. O'Brien c_insert(len); 2306c80476e4SDavid E. O'Brien while (len--) 2307c80476e4SDavid E. O'Brien *Cursor++ = *cp++; 2308c80476e4SDavid E. O'Brien oldcursor = Cursor; 2309c80476e4SDavid E. O'Brien return(CC_REFRESH); 2310c80476e4SDavid E. O'Brien } 2311c80476e4SDavid E. O'Brien 2312c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2313c80476e4SDavid E. O'Brien CCRETVAL 2314c80476e4SDavid E. O'Brien e_yank_kill(c) 2315c80476e4SDavid E. O'Brien int c; 2316c80476e4SDavid E. O'Brien { /* almost like GnuEmacs */ 23176767bd61SMark Peek int len; 23186767bd61SMark Peek Char *kp, *cp; 2319c80476e4SDavid E. O'Brien 2320c80476e4SDavid E. O'Brien USE(c); 23216767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */ 2322c80476e4SDavid E. O'Brien return(CC_ERROR); 23236767bd61SMark Peek len = Strlen(KillRing[YankPos].buf); 23246767bd61SMark Peek if (LastChar + len >= InputLim) 2325c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */ 2326c80476e4SDavid E. O'Brien 2327c80476e4SDavid E. O'Brien /* else */ 2328c80476e4SDavid E. O'Brien cp = Cursor; /* for speed */ 2329c80476e4SDavid E. O'Brien 23306767bd61SMark Peek c_insert(len); /* open the space, */ 23316767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */ 2332c80476e4SDavid E. O'Brien *cp++ = *kp; 2333c80476e4SDavid E. O'Brien 23346767bd61SMark Peek if (Argument == 1) { /* if no arg */ 23356767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */ 23366767bd61SMark Peek Cursor = cp; 23376767bd61SMark Peek } else { 23386767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */ 23396767bd61SMark Peek } 23406767bd61SMark Peek 23416767bd61SMark Peek return(CC_REFRESH); 23426767bd61SMark Peek } 23436767bd61SMark Peek 23446767bd61SMark Peek /*ARGSUSED*/ 23456767bd61SMark Peek CCRETVAL 23466767bd61SMark Peek e_yank_pop(c) 23476767bd61SMark Peek int c; 23486767bd61SMark Peek { /* almost like GnuEmacs */ 23496767bd61SMark Peek int m_bef_c, del_len, ins_len; 23506767bd61SMark Peek Char *kp, *cp; 23516767bd61SMark Peek 23526767bd61SMark Peek USE(c); 23536767bd61SMark Peek 23546767bd61SMark Peek #if 0 23556767bd61SMark Peek /* XXX This "should" be here, but doesn't work, since LastCmd 23566767bd61SMark Peek gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?). 23576767bd61SMark Peek (But what about F_ARGFOUR?) I.e. if you hit M-y twice the 23586767bd61SMark Peek second one will "succeed" even if the first one wasn't preceded 23596767bd61SMark Peek by a yank, and giving an argument is impossible. Now we "succeed" 23606767bd61SMark Peek regardless of previous command, which is wrong too of course. */ 23616767bd61SMark Peek if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP) 23626767bd61SMark Peek return(CC_ERROR); 23636767bd61SMark Peek #endif 23646767bd61SMark Peek 23656767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */ 23666767bd61SMark Peek return(CC_ERROR); 23676767bd61SMark Peek YankPos -= Argument; 23686767bd61SMark Peek while (YankPos < 0) 23696767bd61SMark Peek YankPos += KillRingLen; 23706767bd61SMark Peek YankPos %= KillRingLen; 23716767bd61SMark Peek 23726767bd61SMark Peek if (Cursor > Mark) { 23736767bd61SMark Peek del_len = Cursor - Mark; 23746767bd61SMark Peek m_bef_c = 1; 23756767bd61SMark Peek } else { 23766767bd61SMark Peek del_len = Mark - Cursor; 23776767bd61SMark Peek m_bef_c = 0; 23786767bd61SMark Peek } 23796767bd61SMark Peek ins_len = Strlen(KillRing[YankPos].buf); 23806767bd61SMark Peek if (LastChar + ins_len - del_len >= InputLim) 23816767bd61SMark Peek return(CC_ERROR); /* end of buffer space */ 23826767bd61SMark Peek 23836767bd61SMark Peek if (m_bef_c) { 23846767bd61SMark Peek c_delbefore(del_len); 23856767bd61SMark Peek Cursor = Mark; 23866767bd61SMark Peek } else { 23876767bd61SMark Peek c_delafter(del_len); 23886767bd61SMark Peek } 23896767bd61SMark Peek cp = Cursor; /* for speed */ 23906767bd61SMark Peek 23916767bd61SMark Peek c_insert(ins_len); /* open the space, */ 23926767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */ 23936767bd61SMark Peek *cp++ = *kp; 23946767bd61SMark Peek 23956767bd61SMark Peek if (m_bef_c) { 23966767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */ 23976767bd61SMark Peek Cursor = cp; 23986767bd61SMark Peek } else { 23996767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */ 24006767bd61SMark Peek } 2401c80476e4SDavid E. O'Brien 2402c80476e4SDavid E. O'Brien return(CC_REFRESH); 2403c80476e4SDavid E. O'Brien } 2404c80476e4SDavid E. O'Brien 2405c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2406c80476e4SDavid E. O'Brien CCRETVAL 2407c80476e4SDavid E. O'Brien v_delprev(c) /* Backspace key in insert mode */ 2408c80476e4SDavid E. O'Brien int c; 2409c80476e4SDavid E. O'Brien { 2410c80476e4SDavid E. O'Brien int rc; 2411c80476e4SDavid E. O'Brien 2412c80476e4SDavid E. O'Brien USE(c); 2413c80476e4SDavid E. O'Brien rc = CC_ERROR; 2414c80476e4SDavid E. O'Brien 2415c80476e4SDavid E. O'Brien if (InsertPos != 0) { 2416c80476e4SDavid E. O'Brien if (Argument <= Cursor - InsertPos) { 2417c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before */ 2418c80476e4SDavid E. O'Brien Cursor -= Argument; 2419c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 2420c80476e4SDavid E. O'Brien if (_enable_mbdisp && extdel) { 2421c80476e4SDavid E. O'Brien Cursor--; 2422c80476e4SDavid E. O'Brien e_redisp(c); 2423c80476e4SDavid E. O'Brien } 2424c80476e4SDavid E. O'Brien #endif 2425c80476e4SDavid E. O'Brien rc = CC_REFRESH; 2426c80476e4SDavid E. O'Brien } 2427c80476e4SDavid E. O'Brien } 2428c80476e4SDavid E. O'Brien return(rc); 2429c80476e4SDavid E. O'Brien } /* v_delprev */ 2430c80476e4SDavid E. O'Brien 2431c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2432c80476e4SDavid E. O'Brien CCRETVAL 2433c80476e4SDavid E. O'Brien e_delprev(c) 2434c80476e4SDavid E. O'Brien int c; 2435c80476e4SDavid E. O'Brien { 2436c80476e4SDavid E. O'Brien USE(c); 2437c80476e4SDavid E. O'Brien if (Cursor > InputBuf) { 2438c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before dot */ 2439c80476e4SDavid E. O'Brien if (Argument > Cursor - InputBuf) 2440c80476e4SDavid E. O'Brien Cursor = InputBuf; /* bounds check */ 2441c80476e4SDavid E. O'Brien else 2442c80476e4SDavid E. O'Brien Cursor -= Argument; 2443c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) 2444c80476e4SDavid E. O'Brien if (_enable_mbdisp && extdel && Cursor > InputBuf) { 2445c80476e4SDavid E. O'Brien Cursor--; 2446c80476e4SDavid E. O'Brien e_redisp(c); 2447c80476e4SDavid E. O'Brien } 2448c80476e4SDavid E. O'Brien #endif 2449c80476e4SDavid E. O'Brien return(CC_REFRESH); 2450c80476e4SDavid E. O'Brien } 2451c80476e4SDavid E. O'Brien else { 2452c80476e4SDavid E. O'Brien return(CC_ERROR); 2453c80476e4SDavid E. O'Brien } 2454c80476e4SDavid E. O'Brien } 2455c80476e4SDavid E. O'Brien 2456c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2457c80476e4SDavid E. O'Brien CCRETVAL 2458c80476e4SDavid E. O'Brien e_delwordprev(c) 2459c80476e4SDavid E. O'Brien int c; 2460c80476e4SDavid E. O'Brien { 24616767bd61SMark Peek Char *cp; 2462c80476e4SDavid E. O'Brien 2463c80476e4SDavid E. O'Brien USE(c); 2464c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 2465c80476e4SDavid E. O'Brien return(CC_ERROR); 2466c80476e4SDavid E. O'Brien /* else */ 2467c80476e4SDavid E. O'Brien 2468c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument); 2469c80476e4SDavid E. O'Brien 24706767bd61SMark Peek c_push_kill(cp, Cursor); /* save the text */ 2471c80476e4SDavid E. O'Brien 2472c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - cp)); /* delete before dot */ 2473c80476e4SDavid E. O'Brien Cursor = cp; 2474c80476e4SDavid E. O'Brien if (Cursor < InputBuf) 2475c80476e4SDavid E. O'Brien Cursor = InputBuf; /* bounds check */ 2476c80476e4SDavid E. O'Brien return(CC_REFRESH); 2477c80476e4SDavid E. O'Brien } 2478c80476e4SDavid E. O'Brien 2479c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93 2480c80476e4SDavid E. O'Brien * 2481c80476e4SDavid E. O'Brien * Changed the names of some of the ^D family of editor functions to 2482c80476e4SDavid E. O'Brien * correspond to what they actually do and created new e_delnext_list 2483c80476e4SDavid E. O'Brien * for completeness. 2484c80476e4SDavid E. O'Brien * 2485c80476e4SDavid E. O'Brien * Old names: New names: 2486c80476e4SDavid E. O'Brien * 2487c80476e4SDavid E. O'Brien * delete-char delete-char-or-eof 2488c80476e4SDavid E. O'Brien * F_DELNEXT F_DELNEXT_EOF 2489c80476e4SDavid E. O'Brien * e_delnext e_delnext_eof 2490c80476e4SDavid E. O'Brien * edelnxt edelnxteof 2491c80476e4SDavid E. O'Brien * delete-char-or-eof delete-char 2492c80476e4SDavid E. O'Brien * F_DELNEXT_EOF F_DELNEXT 2493c80476e4SDavid E. O'Brien * e_delnext_eof e_delnext 2494c80476e4SDavid E. O'Brien * edelnxteof edelnxt 2495c80476e4SDavid E. O'Brien * delete-char-or-list delete-char-or-list-or-eof 2496c80476e4SDavid E. O'Brien * F_LIST_DELNEXT F_DELNEXT_LIST_EOF 2497c80476e4SDavid E. O'Brien * e_list_delnext e_delnext_list_eof 2498c80476e4SDavid E. O'Brien * edellsteof 2499c80476e4SDavid E. O'Brien * (no old equivalent) delete-char-or-list 2500c80476e4SDavid E. O'Brien * F_DELNEXT_LIST 2501c80476e4SDavid E. O'Brien * e_delnext_list 2502c80476e4SDavid E. O'Brien * e_delnxtlst 2503c80476e4SDavid E. O'Brien */ 2504c80476e4SDavid E. O'Brien 2505c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */ 2506c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */ 2507c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2508c80476e4SDavid E. O'Brien CCRETVAL 2509c80476e4SDavid E. O'Brien e_delnext(c) 2510c80476e4SDavid E. O'Brien int c; 2511c80476e4SDavid E. O'Brien { 2512c80476e4SDavid E. O'Brien USE(c); 2513c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */ 2514c80476e4SDavid E. O'Brien if (!VImode) { 2515c80476e4SDavid E. O'Brien return(CC_ERROR); 2516c80476e4SDavid E. O'Brien } 2517c80476e4SDavid E. O'Brien else { 2518c80476e4SDavid E. O'Brien if (Cursor != InputBuf) 2519c80476e4SDavid E. O'Brien Cursor--; 2520c80476e4SDavid E. O'Brien else 2521c80476e4SDavid E. O'Brien return(CC_ERROR); 2522c80476e4SDavid E. O'Brien } 2523c80476e4SDavid E. O'Brien } 2524c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2525c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2526c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2527c80476e4SDavid E. O'Brien return(CC_REFRESH); 2528c80476e4SDavid E. O'Brien } 2529c80476e4SDavid E. O'Brien 2530c80476e4SDavid E. O'Brien 2531c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2532c80476e4SDavid E. O'Brien CCRETVAL 2533c80476e4SDavid E. O'Brien e_delnext_eof(c) 2534c80476e4SDavid E. O'Brien int c; 2535c80476e4SDavid E. O'Brien { 2536c80476e4SDavid E. O'Brien USE(c); 2537c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */ 2538c80476e4SDavid E. O'Brien if (!VImode) { 2539c80476e4SDavid E. O'Brien if (Cursor == InputBuf) { 2540c80476e4SDavid E. O'Brien /* if I'm also at the beginning */ 2541c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */ 2542c80476e4SDavid E. O'Brien flush(); 2543c80476e4SDavid E. O'Brien return(CC_EOF); 2544c80476e4SDavid E. O'Brien } 2545c80476e4SDavid E. O'Brien else 2546c80476e4SDavid E. O'Brien return(CC_ERROR); 2547c80476e4SDavid E. O'Brien } 2548c80476e4SDavid E. O'Brien else { 2549c80476e4SDavid E. O'Brien if (Cursor != InputBuf) 2550c80476e4SDavid E. O'Brien Cursor--; 2551c80476e4SDavid E. O'Brien else 2552c80476e4SDavid E. O'Brien return(CC_ERROR); 2553c80476e4SDavid E. O'Brien } 2554c80476e4SDavid E. O'Brien } 2555c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2556c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2557c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2558c80476e4SDavid E. O'Brien return(CC_REFRESH); 2559c80476e4SDavid E. O'Brien } 2560c80476e4SDavid E. O'Brien 2561c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2562c80476e4SDavid E. O'Brien CCRETVAL 2563c80476e4SDavid E. O'Brien e_delnext_list(c) 2564c80476e4SDavid E. O'Brien int c; 2565c80476e4SDavid E. O'Brien { 2566c80476e4SDavid E. O'Brien USE(c); 2567c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */ 2568c80476e4SDavid E. O'Brien PastBottom(); 2569c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2570c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2571c80476e4SDavid E. O'Brien } 2572c80476e4SDavid E. O'Brien else { 2573c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2574c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2575c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2576c80476e4SDavid E. O'Brien return(CC_REFRESH); 2577c80476e4SDavid E. O'Brien } 2578c80476e4SDavid E. O'Brien } 2579c80476e4SDavid E. O'Brien 2580c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2581c80476e4SDavid E. O'Brien CCRETVAL 2582c80476e4SDavid E. O'Brien e_delnext_list_eof(c) 2583c80476e4SDavid E. O'Brien int c; 2584c80476e4SDavid E. O'Brien { 2585c80476e4SDavid E. O'Brien USE(c); 2586c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */ 2587c80476e4SDavid E. O'Brien if (Cursor == InputBuf) { /* if I'm also at the beginning */ 2588c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */ 2589c80476e4SDavid E. O'Brien flush(); 2590c80476e4SDavid E. O'Brien return(CC_EOF); 2591c80476e4SDavid E. O'Brien } 2592c80476e4SDavid E. O'Brien else { 2593c80476e4SDavid E. O'Brien PastBottom(); 2594c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2595c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2596c80476e4SDavid E. O'Brien } 2597c80476e4SDavid E. O'Brien } 2598c80476e4SDavid E. O'Brien else { 2599c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2600c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2601c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2602c80476e4SDavid E. O'Brien return(CC_REFRESH); 2603c80476e4SDavid E. O'Brien } 2604c80476e4SDavid E. O'Brien } 2605c80476e4SDavid E. O'Brien 2606c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2607c80476e4SDavid E. O'Brien CCRETVAL 2608c80476e4SDavid E. O'Brien e_list_eof(c) 2609c80476e4SDavid E. O'Brien int c; 2610c80476e4SDavid E. O'Brien { 2611c80476e4SDavid E. O'Brien CCRETVAL rv; 2612c80476e4SDavid E. O'Brien 2613c80476e4SDavid E. O'Brien USE(c); 2614c80476e4SDavid E. O'Brien if (Cursor == LastChar && Cursor == InputBuf) { 2615c80476e4SDavid E. O'Brien so_write(STReof, 4); /* then do a EOF */ 2616c80476e4SDavid E. O'Brien flush(); 2617c80476e4SDavid E. O'Brien rv = CC_EOF; 2618c80476e4SDavid E. O'Brien } 2619c80476e4SDavid E. O'Brien else { 2620c80476e4SDavid E. O'Brien PastBottom(); 2621c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2622c80476e4SDavid E. O'Brien rv = CC_LIST_CHOICES; 2623c80476e4SDavid E. O'Brien } 2624c80476e4SDavid E. O'Brien return rv; 2625c80476e4SDavid E. O'Brien } 2626c80476e4SDavid E. O'Brien 2627c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2628c80476e4SDavid E. O'Brien CCRETVAL 2629c80476e4SDavid E. O'Brien e_delwordnext(c) 2630c80476e4SDavid E. O'Brien int c; 2631c80476e4SDavid E. O'Brien { 26326767bd61SMark Peek Char *cp; 2633c80476e4SDavid E. O'Brien 2634c80476e4SDavid E. O'Brien USE(c); 2635c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2636c80476e4SDavid E. O'Brien return(CC_ERROR); 2637c80476e4SDavid E. O'Brien /* else */ 2638c80476e4SDavid E. O'Brien 2639c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, Argument); 2640c80476e4SDavid E. O'Brien 26416767bd61SMark Peek c_push_kill(Cursor, cp); /* save the text */ 2642c80476e4SDavid E. O'Brien 2643c80476e4SDavid E. O'Brien c_delafter((int)(cp - Cursor)); /* delete after dot */ 2644c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2645c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2646c80476e4SDavid E. O'Brien return(CC_REFRESH); 2647c80476e4SDavid E. O'Brien } 2648c80476e4SDavid E. O'Brien 2649c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2650c80476e4SDavid E. O'Brien CCRETVAL 2651c80476e4SDavid E. O'Brien e_toend(c) 2652c80476e4SDavid E. O'Brien int c; 2653c80476e4SDavid E. O'Brien { 2654c80476e4SDavid E. O'Brien USE(c); 2655c80476e4SDavid E. O'Brien Cursor = LastChar; 2656c80476e4SDavid E. O'Brien if (VImode) 2657c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2658c80476e4SDavid E. O'Brien c_delfini(); 2659c80476e4SDavid E. O'Brien return(CC_REFRESH); 2660c80476e4SDavid E. O'Brien } 2661c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 2662c80476e4SDavid E. O'Brien return(CC_NORM); 2663c80476e4SDavid E. O'Brien } 2664c80476e4SDavid E. O'Brien 2665c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2666c80476e4SDavid E. O'Brien CCRETVAL 2667c80476e4SDavid E. O'Brien e_tobeg(c) 2668c80476e4SDavid E. O'Brien int c; 2669c80476e4SDavid E. O'Brien { 2670c80476e4SDavid E. O'Brien USE(c); 2671c80476e4SDavid E. O'Brien Cursor = InputBuf; 2672c80476e4SDavid E. O'Brien 2673c80476e4SDavid E. O'Brien if (VImode) { 2674c80476e4SDavid E. O'Brien while (Isspace(*Cursor)) /* We want FIRST non space character */ 2675c80476e4SDavid E. O'Brien Cursor++; 2676c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2677c80476e4SDavid E. O'Brien c_delfini(); 2678c80476e4SDavid E. O'Brien return(CC_REFRESH); 2679c80476e4SDavid E. O'Brien } 2680c80476e4SDavid E. O'Brien } 2681c80476e4SDavid E. O'Brien 2682c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 2683c80476e4SDavid E. O'Brien return(CC_NORM); 2684c80476e4SDavid E. O'Brien } 2685c80476e4SDavid E. O'Brien 2686c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2687c80476e4SDavid E. O'Brien CCRETVAL 2688c80476e4SDavid E. O'Brien e_killend(c) 2689c80476e4SDavid E. O'Brien int c; 2690c80476e4SDavid E. O'Brien { 2691c80476e4SDavid E. O'Brien USE(c); 26926767bd61SMark Peek c_push_kill(Cursor, LastChar); /* copy it */ 2693c80476e4SDavid E. O'Brien LastChar = Cursor; /* zap! -- delete to end */ 2694c80476e4SDavid E. O'Brien return(CC_REFRESH); 2695c80476e4SDavid E. O'Brien } 2696c80476e4SDavid E. O'Brien 2697c80476e4SDavid E. O'Brien 2698c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2699c80476e4SDavid E. O'Brien CCRETVAL 2700c80476e4SDavid E. O'Brien e_killbeg(c) 2701c80476e4SDavid E. O'Brien int c; 2702c80476e4SDavid E. O'Brien { 2703c80476e4SDavid E. O'Brien USE(c); 27046767bd61SMark Peek c_push_kill(InputBuf, Cursor); /* copy it */ 2705c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - InputBuf)); 2706c80476e4SDavid E. O'Brien Cursor = InputBuf; /* zap! */ 2707c80476e4SDavid E. O'Brien return(CC_REFRESH); 2708c80476e4SDavid E. O'Brien } 2709c80476e4SDavid E. O'Brien 2710c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2711c80476e4SDavid E. O'Brien CCRETVAL 2712c80476e4SDavid E. O'Brien e_killall(c) 2713c80476e4SDavid E. O'Brien int c; 2714c80476e4SDavid E. O'Brien { 2715c80476e4SDavid E. O'Brien USE(c); 27166767bd61SMark Peek c_push_kill(InputBuf, LastChar); /* copy it */ 2717c80476e4SDavid E. O'Brien LastChar = InputBuf; /* zap! -- delete all of it */ 2718c80476e4SDavid E. O'Brien Cursor = InputBuf; 2719c80476e4SDavid E. O'Brien return(CC_REFRESH); 2720c80476e4SDavid E. O'Brien } 2721c80476e4SDavid E. O'Brien 2722c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2723c80476e4SDavid E. O'Brien CCRETVAL 2724c80476e4SDavid E. O'Brien e_killregion(c) 2725c80476e4SDavid E. O'Brien int c; 2726c80476e4SDavid E. O'Brien { 2727c80476e4SDavid E. O'Brien USE(c); 2728c80476e4SDavid E. O'Brien if (!Mark) 2729c80476e4SDavid E. O'Brien return(CC_ERROR); 2730c80476e4SDavid E. O'Brien 2731c80476e4SDavid E. O'Brien if (Mark > Cursor) { 27326767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */ 27336767bd61SMark Peek c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */ 27346767bd61SMark Peek Mark = Cursor; 2735c80476e4SDavid E. O'Brien } 2736c80476e4SDavid E. O'Brien else { /* mark is before cursor */ 27376767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */ 27386767bd61SMark Peek c_delbefore((int)(Cursor - Mark)); 2739c80476e4SDavid E. O'Brien Cursor = Mark; 2740c80476e4SDavid E. O'Brien } 2741c80476e4SDavid E. O'Brien return(CC_REFRESH); 2742c80476e4SDavid E. O'Brien } 2743c80476e4SDavid E. O'Brien 2744c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2745c80476e4SDavid E. O'Brien CCRETVAL 2746c80476e4SDavid E. O'Brien e_copyregion(c) 2747c80476e4SDavid E. O'Brien int c; 2748c80476e4SDavid E. O'Brien { 2749c80476e4SDavid E. O'Brien USE(c); 2750c80476e4SDavid E. O'Brien if (!Mark) 2751c80476e4SDavid E. O'Brien return(CC_ERROR); 2752c80476e4SDavid E. O'Brien 2753c80476e4SDavid E. O'Brien if (Mark > Cursor) { 27546767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */ 2755c80476e4SDavid E. O'Brien } 2756c80476e4SDavid E. O'Brien else { /* mark is before cursor */ 27576767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */ 2758c80476e4SDavid E. O'Brien } 2759c80476e4SDavid E. O'Brien return(CC_NORM); /* don't even need to Refresh() */ 2760c80476e4SDavid E. O'Brien } 2761c80476e4SDavid E. O'Brien 2762c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2763c80476e4SDavid E. O'Brien CCRETVAL 2764c80476e4SDavid E. O'Brien e_charswitch(cc) 2765c80476e4SDavid E. O'Brien int cc; 2766c80476e4SDavid E. O'Brien { 27676767bd61SMark Peek Char c; 2768c80476e4SDavid E. O'Brien 2769c80476e4SDavid E. O'Brien USE(cc); 2770c80476e4SDavid E. O'Brien 2771c80476e4SDavid E. O'Brien /* do nothing if we are at beginning of line or have only one char */ 2772c80476e4SDavid E. O'Brien if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) { 2773c80476e4SDavid E. O'Brien return(CC_ERROR); 2774c80476e4SDavid E. O'Brien } 2775c80476e4SDavid E. O'Brien 2776c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 2777c80476e4SDavid E. O'Brien Cursor++; 2778c80476e4SDavid E. O'Brien } 2779c80476e4SDavid E. O'Brien c = Cursor[-2]; 2780c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1]; 2781c80476e4SDavid E. O'Brien Cursor[-1] = c; 2782c80476e4SDavid E. O'Brien return(CC_REFRESH); 2783c80476e4SDavid E. O'Brien } 2784c80476e4SDavid E. O'Brien 2785c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2786c80476e4SDavid E. O'Brien CCRETVAL 2787c80476e4SDavid E. O'Brien e_gcharswitch(cc) 2788c80476e4SDavid E. O'Brien int cc; 2789c80476e4SDavid E. O'Brien { /* gosmacs style ^T */ 27906767bd61SMark Peek Char c; 2791c80476e4SDavid E. O'Brien 2792c80476e4SDavid E. O'Brien USE(cc); 2793c80476e4SDavid E. O'Brien if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */ 2794c80476e4SDavid E. O'Brien c = Cursor[-2]; 2795c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1]; 2796c80476e4SDavid E. O'Brien Cursor[-1] = c; 2797c80476e4SDavid E. O'Brien return(CC_REFRESH); 2798c80476e4SDavid E. O'Brien } 2799c80476e4SDavid E. O'Brien else { 2800c80476e4SDavid E. O'Brien return(CC_ERROR); 2801c80476e4SDavid E. O'Brien } 2802c80476e4SDavid E. O'Brien } 2803c80476e4SDavid E. O'Brien 2804c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */ 2805c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2806c80476e4SDavid E. O'Brien static void 2807c80476e4SDavid E. O'Brien e_charback_mbyte(argument) 2808c80476e4SDavid E. O'Brien int argument; 2809c80476e4SDavid E. O'Brien { 2810c80476e4SDavid E. O'Brien if (!_enable_mbdisp) { 2811c80476e4SDavid E. O'Brien if (Argument > Cursor - InputBuf) 2812c80476e4SDavid E. O'Brien Cursor = InputBuf; 2813c80476e4SDavid E. O'Brien else 2814c80476e4SDavid E. O'Brien Cursor -= Argument; 2815c80476e4SDavid E. O'Brien } 2816c80476e4SDavid E. O'Brien else { 2817c80476e4SDavid E. O'Brien while (0 < argument && Cursor > InputBuf) { 2818c80476e4SDavid E. O'Brien if (Cursor - 1 != InputBuf && 2819c80476e4SDavid E. O'Brien Ismbyte1(*(Cursor - 2)) && Ismbyte2(*(Cursor - 1))) { 2820c80476e4SDavid E. O'Brien Cursor--; 2821c80476e4SDavid E. O'Brien } 2822c80476e4SDavid E. O'Brien Cursor--; 2823c80476e4SDavid E. O'Brien argument--; 2824c80476e4SDavid E. O'Brien } 2825c80476e4SDavid E. O'Brien } 2826c80476e4SDavid E. O'Brien } 2827c80476e4SDavid E. O'Brien #endif 2828c80476e4SDavid E. O'Brien 2829c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2830c80476e4SDavid E. O'Brien CCRETVAL 2831c80476e4SDavid E. O'Brien e_charback(c) 2832c80476e4SDavid E. O'Brien int c; 2833c80476e4SDavid E. O'Brien { 2834c80476e4SDavid E. O'Brien USE(c); 2835c80476e4SDavid E. O'Brien if (Cursor > InputBuf) { 2836c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */ 2837c80476e4SDavid E. O'Brien e_charback_mbyte(Argument); 2838c80476e4SDavid E. O'Brien #else 2839c80476e4SDavid E. O'Brien if (Argument > Cursor - InputBuf) 2840c80476e4SDavid E. O'Brien Cursor = InputBuf; 2841c80476e4SDavid E. O'Brien else 2842c80476e4SDavid E. O'Brien Cursor -= Argument; 2843c80476e4SDavid E. O'Brien #endif 2844c80476e4SDavid E. O'Brien 2845c80476e4SDavid E. O'Brien if (VImode) 2846c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2847c80476e4SDavid E. O'Brien c_delfini(); 2848c80476e4SDavid E. O'Brien return(CC_REFRESH); 2849c80476e4SDavid E. O'Brien } 2850c80476e4SDavid E. O'Brien 2851c80476e4SDavid E. O'Brien RefCursor(); 2852c80476e4SDavid E. O'Brien return(CC_NORM); 2853c80476e4SDavid E. O'Brien } 2854c80476e4SDavid E. O'Brien else { 2855c80476e4SDavid E. O'Brien return(CC_ERROR); 2856c80476e4SDavid E. O'Brien } 2857c80476e4SDavid E. O'Brien } 2858c80476e4SDavid E. O'Brien 2859c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2860c80476e4SDavid E. O'Brien CCRETVAL 2861c80476e4SDavid E. O'Brien v_wordback(c) 2862c80476e4SDavid E. O'Brien int c; 2863c80476e4SDavid E. O'Brien { 2864c80476e4SDavid E. O'Brien USE(c); 2865c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 2866c80476e4SDavid E. O'Brien return(CC_ERROR); 2867c80476e4SDavid E. O'Brien /* else */ 2868c80476e4SDavid E. O'Brien 28696767bd61SMark Peek Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */ 2870c80476e4SDavid E. O'Brien 2871c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2872c80476e4SDavid E. O'Brien c_delfini(); 2873c80476e4SDavid E. O'Brien return(CC_REFRESH); 2874c80476e4SDavid E. O'Brien } 2875c80476e4SDavid E. O'Brien 2876c80476e4SDavid E. O'Brien RefCursor(); 2877c80476e4SDavid E. O'Brien return(CC_NORM); 2878c80476e4SDavid E. O'Brien } 2879c80476e4SDavid E. O'Brien 2880c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2881c80476e4SDavid E. O'Brien CCRETVAL 2882c80476e4SDavid E. O'Brien e_wordback(c) 2883c80476e4SDavid E. O'Brien int c; 2884c80476e4SDavid E. O'Brien { 2885c80476e4SDavid E. O'Brien USE(c); 2886c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 2887c80476e4SDavid E. O'Brien return(CC_ERROR); 2888c80476e4SDavid E. O'Brien /* else */ 2889c80476e4SDavid E. O'Brien 2890c80476e4SDavid E. O'Brien Cursor = c_prev_word(Cursor, InputBuf, Argument); /* bounds check */ 2891c80476e4SDavid E. O'Brien 2892c80476e4SDavid E. O'Brien if (VImode) 2893c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2894c80476e4SDavid E. O'Brien c_delfini(); 2895c80476e4SDavid E. O'Brien return(CC_REFRESH); 2896c80476e4SDavid E. O'Brien } 2897c80476e4SDavid E. O'Brien 2898c80476e4SDavid E. O'Brien RefCursor(); 2899c80476e4SDavid E. O'Brien return(CC_NORM); 2900c80476e4SDavid E. O'Brien } 2901c80476e4SDavid E. O'Brien 2902c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */ 2903c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2904c80476e4SDavid E. O'Brien static void 2905c80476e4SDavid E. O'Brien e_charfwd_mbyte(argument) 2906c80476e4SDavid E. O'Brien int argument; 2907c80476e4SDavid E. O'Brien { 2908c80476e4SDavid E. O'Brien if (!_enable_mbdisp) 2909c80476e4SDavid E. O'Brien Cursor += argument; 2910c80476e4SDavid E. O'Brien else 2911c80476e4SDavid E. O'Brien while (0 < argument && Cursor < LastChar) { 2912c80476e4SDavid E. O'Brien if (Cursor + 1 != LastChar && 2913c80476e4SDavid E. O'Brien Ismbyte1(*Cursor) && Ismbyte2(*(Cursor + 1))) { 2914c80476e4SDavid E. O'Brien Cursor++; 2915c80476e4SDavid E. O'Brien } 2916c80476e4SDavid E. O'Brien Cursor++; 2917c80476e4SDavid E. O'Brien argument--; 2918c80476e4SDavid E. O'Brien } 2919c80476e4SDavid E. O'Brien } 2920c80476e4SDavid E. O'Brien #endif 2921c80476e4SDavid E. O'Brien 2922c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2923c80476e4SDavid E. O'Brien CCRETVAL 2924c80476e4SDavid E. O'Brien e_charfwd(c) 2925c80476e4SDavid E. O'Brien int c; 2926c80476e4SDavid E. O'Brien { 2927c80476e4SDavid E. O'Brien USE(c); 2928c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 2929c80476e4SDavid E. O'Brien #if defined(DSPMBYTE) /* BY TAGA Nayuta VERY THANKS */ 2930c80476e4SDavid E. O'Brien e_charfwd_mbyte(Argument); 2931c80476e4SDavid E. O'Brien #else 2932c80476e4SDavid E. O'Brien Cursor += Argument; 2933c80476e4SDavid E. O'Brien #endif 2934c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2935c80476e4SDavid E. O'Brien Cursor = LastChar; 2936c80476e4SDavid E. O'Brien 2937c80476e4SDavid E. O'Brien if (VImode) 2938c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2939c80476e4SDavid E. O'Brien c_delfini(); 2940c80476e4SDavid E. O'Brien return(CC_REFRESH); 2941c80476e4SDavid E. O'Brien } 2942c80476e4SDavid E. O'Brien 2943c80476e4SDavid E. O'Brien RefCursor(); 2944c80476e4SDavid E. O'Brien return(CC_NORM); 2945c80476e4SDavid E. O'Brien } 2946c80476e4SDavid E. O'Brien else { 2947c80476e4SDavid E. O'Brien return(CC_ERROR); 2948c80476e4SDavid E. O'Brien } 2949c80476e4SDavid E. O'Brien } 2950c80476e4SDavid E. O'Brien 2951c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2952c80476e4SDavid E. O'Brien CCRETVAL 2953c80476e4SDavid E. O'Brien e_wordfwd(c) 2954c80476e4SDavid E. O'Brien int c; 2955c80476e4SDavid E. O'Brien { 2956c80476e4SDavid E. O'Brien USE(c); 2957c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2958c80476e4SDavid E. O'Brien return(CC_ERROR); 2959c80476e4SDavid E. O'Brien /* else */ 2960c80476e4SDavid E. O'Brien 2961c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument); 2962c80476e4SDavid E. O'Brien 2963c80476e4SDavid E. O'Brien if (VImode) 2964c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2965c80476e4SDavid E. O'Brien c_delfini(); 2966c80476e4SDavid E. O'Brien return(CC_REFRESH); 2967c80476e4SDavid E. O'Brien } 2968c80476e4SDavid E. O'Brien 2969c80476e4SDavid E. O'Brien RefCursor(); 2970c80476e4SDavid E. O'Brien return(CC_NORM); 2971c80476e4SDavid E. O'Brien } 2972c80476e4SDavid E. O'Brien 2973c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2974c80476e4SDavid E. O'Brien CCRETVAL 2975c80476e4SDavid E. O'Brien v_wordfwd(c) 2976c80476e4SDavid E. O'Brien int c; 2977c80476e4SDavid E. O'Brien { 2978c80476e4SDavid E. O'Brien USE(c); 2979c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2980c80476e4SDavid E. O'Brien return(CC_ERROR); 2981c80476e4SDavid E. O'Brien /* else */ 2982c80476e4SDavid E. O'Brien 2983c80476e4SDavid E. O'Brien Cursor = c_nexword(Cursor, LastChar, Argument); 2984c80476e4SDavid E. O'Brien 2985c80476e4SDavid E. O'Brien if (VImode) 2986c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2987c80476e4SDavid E. O'Brien c_delfini(); 2988c80476e4SDavid E. O'Brien return(CC_REFRESH); 2989c80476e4SDavid E. O'Brien } 2990c80476e4SDavid E. O'Brien 2991c80476e4SDavid E. O'Brien RefCursor(); 2992c80476e4SDavid E. O'Brien return(CC_NORM); 2993c80476e4SDavid E. O'Brien } 2994c80476e4SDavid E. O'Brien 2995c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2996c80476e4SDavid E. O'Brien CCRETVAL 2997c80476e4SDavid E. O'Brien v_wordbegnext(c) 2998c80476e4SDavid E. O'Brien int c; 2999c80476e4SDavid E. O'Brien { 3000c80476e4SDavid E. O'Brien USE(c); 3001c80476e4SDavid E. O'Brien if (Cursor == LastChar) 3002c80476e4SDavid E. O'Brien return(CC_ERROR); 3003c80476e4SDavid E. O'Brien /* else */ 3004c80476e4SDavid E. O'Brien 3005c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument); 3006c80476e4SDavid E. O'Brien if (Cursor < LastChar) 3007c80476e4SDavid E. O'Brien Cursor++; 3008c80476e4SDavid E. O'Brien 3009c80476e4SDavid E. O'Brien if (VImode) 3010c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 3011c80476e4SDavid E. O'Brien c_delfini(); 3012c80476e4SDavid E. O'Brien return(CC_REFRESH); 3013c80476e4SDavid E. O'Brien } 3014c80476e4SDavid E. O'Brien 3015c80476e4SDavid E. O'Brien RefCursor(); 3016c80476e4SDavid E. O'Brien return(CC_NORM); 3017c80476e4SDavid E. O'Brien } 3018c80476e4SDavid E. O'Brien 3019c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3020c80476e4SDavid E. O'Brien static CCRETVAL 3021c80476e4SDavid E. O'Brien v_repeat_srch(c) 3022c80476e4SDavid E. O'Brien int c; 3023c80476e4SDavid E. O'Brien { 3024c80476e4SDavid E. O'Brien CCRETVAL rv = CC_ERROR; 3025c80476e4SDavid E. O'Brien #ifdef SDEBUG 3026c80476e4SDavid E. O'Brien xprintf("dir %d patlen %d patbuf %S\n", 3027c80476e4SDavid E. O'Brien c, patlen, patbuf); 3028c80476e4SDavid E. O'Brien #endif 3029c80476e4SDavid E. O'Brien 3030c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) c; /* Hack to stop c_hsetpat */ 3031c80476e4SDavid E. O'Brien LastChar = InputBuf; 3032c80476e4SDavid E. O'Brien switch (c) { 3033c80476e4SDavid E. O'Brien case F_DOWN_SEARCH_HIST: 3034c80476e4SDavid E. O'Brien rv = e_down_search_hist(0); 3035c80476e4SDavid E. O'Brien break; 3036c80476e4SDavid E. O'Brien case F_UP_SEARCH_HIST: 3037c80476e4SDavid E. O'Brien rv = e_up_search_hist(0); 3038c80476e4SDavid E. O'Brien break; 3039c80476e4SDavid E. O'Brien default: 3040c80476e4SDavid E. O'Brien break; 3041c80476e4SDavid E. O'Brien } 3042c80476e4SDavid E. O'Brien return rv; 3043c80476e4SDavid E. O'Brien } 3044c80476e4SDavid E. O'Brien 3045c80476e4SDavid E. O'Brien static CCRETVAL 3046c80476e4SDavid E. O'Brien v_csearch_back(ch, count, tflag) 3047c80476e4SDavid E. O'Brien int ch, count, tflag; 3048c80476e4SDavid E. O'Brien { 3049c80476e4SDavid E. O'Brien Char *cp; 3050c80476e4SDavid E. O'Brien 3051c80476e4SDavid E. O'Brien cp = Cursor; 3052c80476e4SDavid E. O'Brien while (count--) { 3053c80476e4SDavid E. O'Brien if (*cp == ch) 3054c80476e4SDavid E. O'Brien cp--; 3055c80476e4SDavid E. O'Brien while (cp > InputBuf && *cp != ch) 3056c80476e4SDavid E. O'Brien cp--; 3057c80476e4SDavid E. O'Brien } 3058c80476e4SDavid E. O'Brien 3059c80476e4SDavid E. O'Brien if (cp < InputBuf || (cp == InputBuf && *cp != ch)) 3060c80476e4SDavid E. O'Brien return(CC_ERROR); 3061c80476e4SDavid E. O'Brien 3062c80476e4SDavid E. O'Brien if (*cp == ch && tflag) 3063c80476e4SDavid E. O'Brien cp++; 3064c80476e4SDavid E. O'Brien 3065c80476e4SDavid E. O'Brien Cursor = cp; 3066c80476e4SDavid E. O'Brien 3067c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 3068c80476e4SDavid E. O'Brien Cursor++; 3069c80476e4SDavid E. O'Brien c_delfini(); 3070c80476e4SDavid E. O'Brien return(CC_REFRESH); 3071c80476e4SDavid E. O'Brien } 3072c80476e4SDavid E. O'Brien 3073c80476e4SDavid E. O'Brien RefCursor(); 3074c80476e4SDavid E. O'Brien return(CC_NORM); 3075c80476e4SDavid E. O'Brien } 3076c80476e4SDavid E. O'Brien 3077c80476e4SDavid E. O'Brien static CCRETVAL 3078c80476e4SDavid E. O'Brien v_csearch_fwd(ch, count, tflag) 3079c80476e4SDavid E. O'Brien int ch, count, tflag; 3080c80476e4SDavid E. O'Brien { 3081c80476e4SDavid E. O'Brien Char *cp; 3082c80476e4SDavid E. O'Brien 3083c80476e4SDavid E. O'Brien cp = Cursor; 3084c80476e4SDavid E. O'Brien while (count--) { 3085c80476e4SDavid E. O'Brien if(*cp == ch) 3086c80476e4SDavid E. O'Brien cp++; 3087c80476e4SDavid E. O'Brien while (cp < LastChar && *cp != ch) 3088c80476e4SDavid E. O'Brien cp++; 3089c80476e4SDavid E. O'Brien } 3090c80476e4SDavid E. O'Brien 3091c80476e4SDavid E. O'Brien if (cp >= LastChar) 3092c80476e4SDavid E. O'Brien return(CC_ERROR); 3093c80476e4SDavid E. O'Brien 3094c80476e4SDavid E. O'Brien if (*cp == ch && tflag) 3095c80476e4SDavid E. O'Brien cp--; 3096c80476e4SDavid E. O'Brien 3097c80476e4SDavid E. O'Brien Cursor = cp; 3098c80476e4SDavid E. O'Brien 3099c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 3100c80476e4SDavid E. O'Brien Cursor++; 3101c80476e4SDavid E. O'Brien c_delfini(); 3102c80476e4SDavid E. O'Brien return(CC_REFRESH); 3103c80476e4SDavid E. O'Brien } 3104c80476e4SDavid E. O'Brien RefCursor(); 3105c80476e4SDavid E. O'Brien return(CC_NORM); 3106c80476e4SDavid E. O'Brien } 3107c80476e4SDavid E. O'Brien 3108c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3109c80476e4SDavid E. O'Brien static CCRETVAL 3110c80476e4SDavid E. O'Brien v_action(c) 3111c80476e4SDavid E. O'Brien int c; 3112c80476e4SDavid E. O'Brien { 31136767bd61SMark Peek Char *cp, *kp; 3114c80476e4SDavid E. O'Brien 3115c80476e4SDavid E. O'Brien if (ActionFlag == TCSHOP_DELETE) { 3116c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 3117c80476e4SDavid E. O'Brien ActionPos = 0; 3118c80476e4SDavid E. O'Brien 3119c80476e4SDavid E. O'Brien UndoSize = 0; 3120c80476e4SDavid E. O'Brien kp = UndoBuf; 3121c80476e4SDavid E. O'Brien for (cp = InputBuf; cp < LastChar; cp++) { 3122c80476e4SDavid E. O'Brien *kp++ = *cp; 3123c80476e4SDavid E. O'Brien UndoSize++; 3124c80476e4SDavid E. O'Brien } 3125c80476e4SDavid E. O'Brien 3126c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 3127c80476e4SDavid E. O'Brien UndoPtr = InputBuf; 3128c80476e4SDavid E. O'Brien LastChar = InputBuf; 3129c80476e4SDavid E. O'Brien Cursor = InputBuf; 3130c80476e4SDavid E. O'Brien if (c & TCSHOP_INSERT) 3131c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3132c80476e4SDavid E. O'Brien 3133c80476e4SDavid E. O'Brien return(CC_REFRESH); 3134c80476e4SDavid E. O'Brien } 3135c80476e4SDavid E. O'Brien #ifdef notdef 3136c80476e4SDavid E. O'Brien else if (ActionFlag == TCSHOP_NOP) { 3137c80476e4SDavid E. O'Brien #endif 3138c80476e4SDavid E. O'Brien ActionPos = Cursor; 3139c80476e4SDavid E. O'Brien ActionFlag = c; 3140c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* Do NOT clear out argument */ 3141c80476e4SDavid E. O'Brien #ifdef notdef 3142c80476e4SDavid E. O'Brien } 3143c80476e4SDavid E. O'Brien else { 3144c80476e4SDavid E. O'Brien ActionFlag = 0; 3145c80476e4SDavid E. O'Brien ActionPos = 0; 3146c80476e4SDavid E. O'Brien return(CC_ERROR); 3147c80476e4SDavid E. O'Brien } 3148c80476e4SDavid E. O'Brien #endif 3149c80476e4SDavid E. O'Brien } 3150c80476e4SDavid E. O'Brien 3151c80476e4SDavid E. O'Brien #ifdef COMMENT 3152c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */ 3153c80476e4SDavid E. O'Brien static void 3154c80476e4SDavid E. O'Brien c_get_word(begin, end) 3155c80476e4SDavid E. O'Brien Char **begin; 3156c80476e4SDavid E. O'Brien Char **end; 3157c80476e4SDavid E. O'Brien { 3158c80476e4SDavid E. O'Brien Char *cp; 3159c80476e4SDavid E. O'Brien 3160c80476e4SDavid E. O'Brien cp = &Cursor[0]; 3161c80476e4SDavid E. O'Brien while (Argument--) { 3162c80476e4SDavid E. O'Brien while ((cp <= LastChar) && (isword(*cp))) 3163c80476e4SDavid E. O'Brien cp++; 3164c80476e4SDavid E. O'Brien *end = --cp; 3165c80476e4SDavid E. O'Brien while ((cp >= InputBuf) && (isword(*cp))) 3166c80476e4SDavid E. O'Brien cp--; 3167c80476e4SDavid E. O'Brien *begin = ++cp; 3168c80476e4SDavid E. O'Brien } 3169c80476e4SDavid E. O'Brien } 3170c80476e4SDavid E. O'Brien #endif /* COMMENT */ 3171c80476e4SDavid E. O'Brien 3172c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3173c80476e4SDavid E. O'Brien CCRETVAL 3174c80476e4SDavid E. O'Brien e_uppercase(c) 3175c80476e4SDavid E. O'Brien int c; 3176c80476e4SDavid E. O'Brien { 3177c80476e4SDavid E. O'Brien Char *cp, *end; 3178c80476e4SDavid E. O'Brien 3179c80476e4SDavid E. O'Brien USE(c); 3180c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3181c80476e4SDavid E. O'Brien 3182c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++) /* PWP: was cp=begin */ 3183c80476e4SDavid E. O'Brien if (Islower(*cp)) 3184c80476e4SDavid E. O'Brien *cp = Toupper(*cp); 3185c80476e4SDavid E. O'Brien 3186c80476e4SDavid E. O'Brien Cursor = end; 3187c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3188c80476e4SDavid E. O'Brien Cursor = LastChar; 3189c80476e4SDavid E. O'Brien return(CC_REFRESH); 3190c80476e4SDavid E. O'Brien } 3191c80476e4SDavid E. O'Brien 3192c80476e4SDavid E. O'Brien 3193c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3194c80476e4SDavid E. O'Brien CCRETVAL 3195c80476e4SDavid E. O'Brien e_capitolcase(c) 3196c80476e4SDavid E. O'Brien int c; 3197c80476e4SDavid E. O'Brien { 3198c80476e4SDavid E. O'Brien Char *cp, *end; 3199c80476e4SDavid E. O'Brien 3200c80476e4SDavid E. O'Brien USE(c); 3201c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3202c80476e4SDavid E. O'Brien 3203c80476e4SDavid E. O'Brien cp = Cursor; 3204c80476e4SDavid E. O'Brien for (; cp < end; cp++) { 3205c80476e4SDavid E. O'Brien if (Isalpha(*cp)) { 3206c80476e4SDavid E. O'Brien if (Islower(*cp)) 3207c80476e4SDavid E. O'Brien *cp = Toupper(*cp); 3208c80476e4SDavid E. O'Brien cp++; 3209c80476e4SDavid E. O'Brien break; 3210c80476e4SDavid E. O'Brien } 3211c80476e4SDavid E. O'Brien } 3212c80476e4SDavid E. O'Brien for (; cp < end; cp++) 3213c80476e4SDavid E. O'Brien if (Isupper(*cp)) 3214c80476e4SDavid E. O'Brien *cp = Tolower(*cp); 3215c80476e4SDavid E. O'Brien 3216c80476e4SDavid E. O'Brien Cursor = end; 3217c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3218c80476e4SDavid E. O'Brien Cursor = LastChar; 3219c80476e4SDavid E. O'Brien return(CC_REFRESH); 3220c80476e4SDavid E. O'Brien } 3221c80476e4SDavid E. O'Brien 3222c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3223c80476e4SDavid E. O'Brien CCRETVAL 3224c80476e4SDavid E. O'Brien e_lowercase(c) 3225c80476e4SDavid E. O'Brien int c; 3226c80476e4SDavid E. O'Brien { 3227c80476e4SDavid E. O'Brien Char *cp, *end; 3228c80476e4SDavid E. O'Brien 3229c80476e4SDavid E. O'Brien USE(c); 3230c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3231c80476e4SDavid E. O'Brien 3232c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++) 3233c80476e4SDavid E. O'Brien if (Isupper(*cp)) 3234c80476e4SDavid E. O'Brien *cp = Tolower(*cp); 3235c80476e4SDavid E. O'Brien 3236c80476e4SDavid E. O'Brien Cursor = end; 3237c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3238c80476e4SDavid E. O'Brien Cursor = LastChar; 3239c80476e4SDavid E. O'Brien return(CC_REFRESH); 3240c80476e4SDavid E. O'Brien } 3241c80476e4SDavid E. O'Brien 3242c80476e4SDavid E. O'Brien 3243c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3244c80476e4SDavid E. O'Brien CCRETVAL 3245c80476e4SDavid E. O'Brien e_set_mark(c) 3246c80476e4SDavid E. O'Brien int c; 3247c80476e4SDavid E. O'Brien { 3248c80476e4SDavid E. O'Brien USE(c); 3249c80476e4SDavid E. O'Brien Mark = Cursor; 3250c80476e4SDavid E. O'Brien return(CC_NORM); 3251c80476e4SDavid E. O'Brien } 3252c80476e4SDavid E. O'Brien 3253c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3254c80476e4SDavid E. O'Brien CCRETVAL 3255c80476e4SDavid E. O'Brien e_exchange_mark(c) 3256c80476e4SDavid E. O'Brien int c; 3257c80476e4SDavid E. O'Brien { 32586767bd61SMark Peek Char *cp; 3259c80476e4SDavid E. O'Brien 3260c80476e4SDavid E. O'Brien USE(c); 3261c80476e4SDavid E. O'Brien cp = Cursor; 3262c80476e4SDavid E. O'Brien Cursor = Mark; 3263c80476e4SDavid E. O'Brien Mark = cp; 3264c80476e4SDavid E. O'Brien RefCursor(); 3265c80476e4SDavid E. O'Brien return(CC_NORM); 3266c80476e4SDavid E. O'Brien } 3267c80476e4SDavid E. O'Brien 3268c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3269c80476e4SDavid E. O'Brien CCRETVAL 3270c80476e4SDavid E. O'Brien e_argfour(c) 3271c80476e4SDavid E. O'Brien int c; 3272c80476e4SDavid E. O'Brien { /* multiply current argument by 4 */ 3273c80476e4SDavid E. O'Brien USE(c); 3274c80476e4SDavid E. O'Brien if (Argument > 1000000) 3275c80476e4SDavid E. O'Brien return CC_ERROR; 3276c80476e4SDavid E. O'Brien DoingArg = 1; 3277c80476e4SDavid E. O'Brien Argument *= 4; 3278c80476e4SDavid E. O'Brien return(CC_ARGHACK); 3279c80476e4SDavid E. O'Brien } 3280c80476e4SDavid E. O'Brien 3281c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3282c80476e4SDavid E. O'Brien CCRETVAL 3283c80476e4SDavid E. O'Brien e_quote(c) 3284c80476e4SDavid E. O'Brien int c; 3285c80476e4SDavid E. O'Brien { 3286c80476e4SDavid E. O'Brien Char ch; 3287c80476e4SDavid E. O'Brien int num; 3288c80476e4SDavid E. O'Brien 3289c80476e4SDavid E. O'Brien USE(c); 3290c80476e4SDavid E. O'Brien QuoteModeOn(); 3291c80476e4SDavid E. O'Brien num = GetNextChar(&ch); 3292c80476e4SDavid E. O'Brien QuoteModeOff(); 3293c80476e4SDavid E. O'Brien if (num == 1) 3294c80476e4SDavid E. O'Brien return e_insert(ch); 3295c80476e4SDavid E. O'Brien else 3296c80476e4SDavid E. O'Brien return e_send_eof(0); 3297c80476e4SDavid E. O'Brien } 3298c80476e4SDavid E. O'Brien 3299c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3300c80476e4SDavid E. O'Brien CCRETVAL 3301c80476e4SDavid E. O'Brien e_metanext(c) 3302c80476e4SDavid E. O'Brien int c; 3303c80476e4SDavid E. O'Brien { 3304c80476e4SDavid E. O'Brien USE(c); 3305c80476e4SDavid E. O'Brien MetaNext = 1; 3306c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */ 3307c80476e4SDavid E. O'Brien } 3308c80476e4SDavid E. O'Brien 3309c80476e4SDavid E. O'Brien #ifdef notdef 3310c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3311c80476e4SDavid E. O'Brien CCRETVAL 3312c80476e4SDavid E. O'Brien e_extendnext(c) 3313c80476e4SDavid E. O'Brien int c; 3314c80476e4SDavid E. O'Brien { 3315c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap; 3316c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */ 3317c80476e4SDavid E. O'Brien } 3318c80476e4SDavid E. O'Brien 3319c80476e4SDavid E. O'Brien #endif 3320c80476e4SDavid E. O'Brien 3321c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3322c80476e4SDavid E. O'Brien CCRETVAL 3323c80476e4SDavid E. O'Brien v_insbeg(c) 3324c80476e4SDavid E. O'Brien int c; 3325c80476e4SDavid E. O'Brien { /* move to beginning of line and start vi 3326c80476e4SDavid E. O'Brien * insert mode */ 3327c80476e4SDavid E. O'Brien USE(c); 3328c80476e4SDavid E. O'Brien Cursor = InputBuf; 3329c80476e4SDavid E. O'Brien InsertPos = Cursor; 3330c80476e4SDavid E. O'Brien 3331c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3332c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3333c80476e4SDavid E. O'Brien 3334c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 3335c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3336c80476e4SDavid E. O'Brien return(CC_NORM); 3337c80476e4SDavid E. O'Brien } 3338c80476e4SDavid E. O'Brien 3339c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3340c80476e4SDavid E. O'Brien CCRETVAL 3341c80476e4SDavid E. O'Brien v_replone(c) 3342c80476e4SDavid E. O'Brien int c; 3343c80476e4SDavid E. O'Brien { /* vi mode overwrite one character */ 3344c80476e4SDavid E. O'Brien USE(c); 3345c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3346c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE_1; 3347c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */ 3348c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3349c80476e4SDavid E. O'Brien UndoSize = 0; 3350c80476e4SDavid E. O'Brien return(CC_NORM); 3351c80476e4SDavid E. O'Brien } 3352c80476e4SDavid E. O'Brien 3353c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3354c80476e4SDavid E. O'Brien CCRETVAL 3355c80476e4SDavid E. O'Brien v_replmode(c) 3356c80476e4SDavid E. O'Brien int c; 3357c80476e4SDavid E. O'Brien { /* vi mode start overwriting */ 3358c80476e4SDavid E. O'Brien USE(c); 3359c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3360c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE; 3361c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */ 3362c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3363c80476e4SDavid E. O'Brien UndoSize = 0; 3364c80476e4SDavid E. O'Brien return(CC_NORM); 3365c80476e4SDavid E. O'Brien } 3366c80476e4SDavid E. O'Brien 3367c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3368c80476e4SDavid E. O'Brien CCRETVAL 3369c80476e4SDavid E. O'Brien v_substchar(c) 3370c80476e4SDavid E. O'Brien int c; 3371c80476e4SDavid E. O'Brien { /* vi mode substitute for one char */ 3372c80476e4SDavid E. O'Brien USE(c); 3373c80476e4SDavid E. O'Brien c_delafter(Argument); 3374c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3375c80476e4SDavid E. O'Brien return(CC_REFRESH); 3376c80476e4SDavid E. O'Brien } 3377c80476e4SDavid E. O'Brien 3378c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3379c80476e4SDavid E. O'Brien CCRETVAL 3380c80476e4SDavid E. O'Brien v_substline(c) 3381c80476e4SDavid E. O'Brien int c; 3382c80476e4SDavid E. O'Brien { /* vi mode replace whole line */ 3383c80476e4SDavid E. O'Brien USE(c); 3384c80476e4SDavid E. O'Brien (void) e_killall(0); 3385c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3386c80476e4SDavid E. O'Brien return(CC_REFRESH); 3387c80476e4SDavid E. O'Brien } 3388c80476e4SDavid E. O'Brien 3389c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3390c80476e4SDavid E. O'Brien CCRETVAL 3391c80476e4SDavid E. O'Brien v_chgtoend(c) 3392c80476e4SDavid E. O'Brien int c; 3393c80476e4SDavid E. O'Brien { /* vi mode change to end of line */ 3394c80476e4SDavid E. O'Brien USE(c); 3395c80476e4SDavid E. O'Brien (void) e_killend(0); 3396c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3397c80476e4SDavid E. O'Brien return(CC_REFRESH); 3398c80476e4SDavid E. O'Brien } 3399c80476e4SDavid E. O'Brien 3400c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3401c80476e4SDavid E. O'Brien CCRETVAL 3402c80476e4SDavid E. O'Brien v_insert(c) 3403c80476e4SDavid E. O'Brien int c; 3404c80476e4SDavid E. O'Brien { /* vi mode start inserting */ 3405c80476e4SDavid E. O'Brien USE(c); 3406c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3407c80476e4SDavid E. O'Brien 3408c80476e4SDavid E. O'Brien InsertPos = Cursor; 3409c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3410c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3411c80476e4SDavid E. O'Brien 3412c80476e4SDavid E. O'Brien return(CC_NORM); 3413c80476e4SDavid E. O'Brien } 3414c80476e4SDavid E. O'Brien 3415c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3416c80476e4SDavid E. O'Brien CCRETVAL 3417c80476e4SDavid E. O'Brien v_add(c) 3418c80476e4SDavid E. O'Brien int c; 3419c80476e4SDavid E. O'Brien { /* vi mode start adding */ 3420c80476e4SDavid E. O'Brien USE(c); 3421c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3422c80476e4SDavid E. O'Brien if (Cursor < LastChar) 3423c80476e4SDavid E. O'Brien { 3424c80476e4SDavid E. O'Brien Cursor++; 3425c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3426c80476e4SDavid E. O'Brien Cursor = LastChar; 3427c80476e4SDavid E. O'Brien RefCursor(); 3428c80476e4SDavid E. O'Brien } 3429c80476e4SDavid E. O'Brien 3430c80476e4SDavid E. O'Brien InsertPos = Cursor; 3431c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3432c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3433c80476e4SDavid E. O'Brien 3434c80476e4SDavid E. O'Brien return(CC_NORM); 3435c80476e4SDavid E. O'Brien } 3436c80476e4SDavid E. O'Brien 3437c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3438c80476e4SDavid E. O'Brien CCRETVAL 3439c80476e4SDavid E. O'Brien v_addend(c) 3440c80476e4SDavid E. O'Brien int c; 3441c80476e4SDavid E. O'Brien { /* vi mode to add at end of line */ 3442c80476e4SDavid E. O'Brien USE(c); 3443c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3444c80476e4SDavid E. O'Brien Cursor = LastChar; 3445c80476e4SDavid E. O'Brien 3446c80476e4SDavid E. O'Brien InsertPos = LastChar; /* Mark where insertion begins */ 3447c80476e4SDavid E. O'Brien UndoPtr = LastChar; 3448c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3449c80476e4SDavid E. O'Brien 3450c80476e4SDavid E. O'Brien RefCursor(); 3451c80476e4SDavid E. O'Brien return(CC_NORM); 3452c80476e4SDavid E. O'Brien } 3453c80476e4SDavid E. O'Brien 3454c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3455c80476e4SDavid E. O'Brien CCRETVAL 3456c80476e4SDavid E. O'Brien v_change_case(cc) 3457c80476e4SDavid E. O'Brien int cc; 3458c80476e4SDavid E. O'Brien { 3459c80476e4SDavid E. O'Brien char c; 3460c80476e4SDavid E. O'Brien 3461c80476e4SDavid E. O'Brien USE(cc); 3462c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 34633b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 3464c80476e4SDavid E. O'Brien c = *Cursor; 3465c80476e4SDavid E. O'Brien #else 3466c80476e4SDavid E. O'Brien c = CHAR & *Cursor; 34673b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 3468c80476e4SDavid E. O'Brien if (Isupper(c)) 3469c80476e4SDavid E. O'Brien *Cursor++ = Tolower(c); 3470c80476e4SDavid E. O'Brien else if (Islower(c)) 3471c80476e4SDavid E. O'Brien *Cursor++ = Toupper(c); 3472c80476e4SDavid E. O'Brien else 3473c80476e4SDavid E. O'Brien Cursor++; 3474c80476e4SDavid E. O'Brien RefPlusOne(); /* fast refresh for one char */ 3475c80476e4SDavid E. O'Brien return(CC_NORM); 3476c80476e4SDavid E. O'Brien } 3477c80476e4SDavid E. O'Brien return(CC_ERROR); 3478c80476e4SDavid E. O'Brien } 3479c80476e4SDavid E. O'Brien 3480c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3481c80476e4SDavid E. O'Brien CCRETVAL 3482c80476e4SDavid E. O'Brien e_expand(c) 3483c80476e4SDavid E. O'Brien int c; 3484c80476e4SDavid E. O'Brien { 34856767bd61SMark Peek Char *p; 3486c80476e4SDavid E. O'Brien extern bool justpr; 3487c80476e4SDavid E. O'Brien 3488c80476e4SDavid E. O'Brien USE(c); 3489c80476e4SDavid E. O'Brien for (p = InputBuf; Isspace(*p); p++) 3490c80476e4SDavid E. O'Brien continue; 3491c80476e4SDavid E. O'Brien if (p == LastChar) 3492c80476e4SDavid E. O'Brien return(CC_ERROR); 3493c80476e4SDavid E. O'Brien 3494c80476e4SDavid E. O'Brien justpr++; 3495c80476e4SDavid E. O'Brien Expand++; 3496c80476e4SDavid E. O'Brien return(e_newline(0)); 3497c80476e4SDavid E. O'Brien } 3498c80476e4SDavid E. O'Brien 3499c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3500c80476e4SDavid E. O'Brien CCRETVAL 3501c80476e4SDavid E. O'Brien e_startover(c) 3502c80476e4SDavid E. O'Brien int c; 3503c80476e4SDavid E. O'Brien { /* erase all of current line, start again */ 3504c80476e4SDavid E. O'Brien USE(c); 3505c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */ 3506c80476e4SDavid E. O'Brien return(CC_REFRESH); 3507c80476e4SDavid E. O'Brien } 3508c80476e4SDavid E. O'Brien 3509c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3510c80476e4SDavid E. O'Brien CCRETVAL 3511c80476e4SDavid E. O'Brien e_redisp(c) 3512c80476e4SDavid E. O'Brien int c; 3513c80476e4SDavid E. O'Brien { 3514c80476e4SDavid E. O'Brien USE(c); 3515c80476e4SDavid E. O'Brien ClearLines(); 3516c80476e4SDavid E. O'Brien ClearDisp(); 3517c80476e4SDavid E. O'Brien return(CC_REFRESH); 3518c80476e4SDavid E. O'Brien } 3519c80476e4SDavid E. O'Brien 3520c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3521c80476e4SDavid E. O'Brien CCRETVAL 3522c80476e4SDavid E. O'Brien e_cleardisp(c) 3523c80476e4SDavid E. O'Brien int c; 3524c80476e4SDavid E. O'Brien { 3525c80476e4SDavid E. O'Brien USE(c); 3526c80476e4SDavid E. O'Brien ClearScreen(); /* clear the whole real screen */ 3527c80476e4SDavid E. O'Brien ClearDisp(); /* reset everything */ 3528c80476e4SDavid E. O'Brien return(CC_REFRESH); 3529c80476e4SDavid E. O'Brien } 3530c80476e4SDavid E. O'Brien 3531c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3532c80476e4SDavid E. O'Brien CCRETVAL 3533c80476e4SDavid E. O'Brien e_tty_int(c) 3534c80476e4SDavid E. O'Brien int c; 3535c80476e4SDavid E. O'Brien { 3536c80476e4SDavid E. O'Brien USE(c); 35373b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE) 3538c80476e4SDavid E. O'Brien /* SAK PATCH: erase all of current line, start again */ 3539c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */ 3540c80476e4SDavid E. O'Brien xputchar('\n'); 3541c80476e4SDavid E. O'Brien ClearDisp(); 3542c80476e4SDavid E. O'Brien return (CC_REFRESH); 35433b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */ 3544c80476e4SDavid E. O'Brien /* do no editing */ 3545c80476e4SDavid E. O'Brien return (CC_NORM); 35463b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */ 3547c80476e4SDavid E. O'Brien } 3548c80476e4SDavid E. O'Brien 3549c80476e4SDavid E. O'Brien /* 3550c80476e4SDavid E. O'Brien * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi) 3551c80476e4SDavid E. O'Brien * Function to send a character back to the input stream in cooked 3552c80476e4SDavid E. O'Brien * mode. Only works if we have TIOCSTI 3553c80476e4SDavid E. O'Brien */ 3554c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3555c80476e4SDavid E. O'Brien CCRETVAL 3556c80476e4SDavid E. O'Brien e_stuff_char(c) 3557c80476e4SDavid E. O'Brien int c; 3558c80476e4SDavid E. O'Brien { 3559c80476e4SDavid E. O'Brien #ifdef TIOCSTI 3560c80476e4SDavid E. O'Brien extern int Tty_raw_mode; 3561c80476e4SDavid E. O'Brien int was_raw = Tty_raw_mode; 3562c80476e4SDavid E. O'Brien char ch = (char) c; 3563c80476e4SDavid E. O'Brien 3564c80476e4SDavid E. O'Brien if (was_raw) 3565c80476e4SDavid E. O'Brien (void) Cookedmode(); 3566c80476e4SDavid E. O'Brien 3567c80476e4SDavid E. O'Brien (void) write(SHIN, "\n", 1); 3568c80476e4SDavid E. O'Brien (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &ch); 3569c80476e4SDavid E. O'Brien 3570c80476e4SDavid E. O'Brien if (was_raw) 3571c80476e4SDavid E. O'Brien (void) Rawmode(); 3572c80476e4SDavid E. O'Brien return(e_redisp(c)); 3573c80476e4SDavid E. O'Brien #else /* !TIOCSTI */ 3574c80476e4SDavid E. O'Brien return(CC_ERROR); 3575c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */ 3576c80476e4SDavid E. O'Brien } 3577c80476e4SDavid E. O'Brien 3578c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3579c80476e4SDavid E. O'Brien CCRETVAL 3580c80476e4SDavid E. O'Brien e_insovr(c) 3581c80476e4SDavid E. O'Brien int c; 3582c80476e4SDavid E. O'Brien { 3583c80476e4SDavid E. O'Brien USE(c); 3584c80476e4SDavid E. O'Brien inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT); 3585c80476e4SDavid E. O'Brien return(CC_NORM); 3586c80476e4SDavid E. O'Brien } 3587c80476e4SDavid E. O'Brien 3588c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3589c80476e4SDavid E. O'Brien CCRETVAL 3590c80476e4SDavid E. O'Brien e_tty_dsusp(c) 3591c80476e4SDavid E. O'Brien int c; 3592c80476e4SDavid E. O'Brien { 3593c80476e4SDavid E. O'Brien USE(c); 3594c80476e4SDavid E. O'Brien /* do no editing */ 3595c80476e4SDavid E. O'Brien return(CC_NORM); 3596c80476e4SDavid E. O'Brien } 3597c80476e4SDavid E. O'Brien 3598c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3599c80476e4SDavid E. O'Brien CCRETVAL 3600c80476e4SDavid E. O'Brien e_tty_flusho(c) 3601c80476e4SDavid E. O'Brien int c; 3602c80476e4SDavid E. O'Brien { 3603c80476e4SDavid E. O'Brien USE(c); 3604c80476e4SDavid E. O'Brien /* do no editing */ 3605c80476e4SDavid E. O'Brien return(CC_NORM); 3606c80476e4SDavid E. O'Brien } 3607c80476e4SDavid E. O'Brien 3608c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3609c80476e4SDavid E. O'Brien CCRETVAL 3610c80476e4SDavid E. O'Brien e_tty_quit(c) 3611c80476e4SDavid E. O'Brien int c; 3612c80476e4SDavid E. O'Brien { 3613c80476e4SDavid E. O'Brien USE(c); 3614c80476e4SDavid E. O'Brien /* do no editing */ 3615c80476e4SDavid E. O'Brien return(CC_NORM); 3616c80476e4SDavid E. O'Brien } 3617c80476e4SDavid E. O'Brien 3618c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3619c80476e4SDavid E. O'Brien CCRETVAL 3620c80476e4SDavid E. O'Brien e_tty_tsusp(c) 3621c80476e4SDavid E. O'Brien int c; 3622c80476e4SDavid E. O'Brien { 3623c80476e4SDavid E. O'Brien USE(c); 3624c80476e4SDavid E. O'Brien /* do no editing */ 3625c80476e4SDavid E. O'Brien return(CC_NORM); 3626c80476e4SDavid E. O'Brien } 3627c80476e4SDavid E. O'Brien 3628c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3629c80476e4SDavid E. O'Brien CCRETVAL 3630c80476e4SDavid E. O'Brien e_tty_stopo(c) 3631c80476e4SDavid E. O'Brien int c; 3632c80476e4SDavid E. O'Brien { 3633c80476e4SDavid E. O'Brien USE(c); 3634c80476e4SDavid E. O'Brien /* do no editing */ 3635c80476e4SDavid E. O'Brien return(CC_NORM); 3636c80476e4SDavid E. O'Brien } 3637c80476e4SDavid E. O'Brien 3638c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3639c80476e4SDavid E. O'Brien CCRETVAL 3640c80476e4SDavid E. O'Brien e_expand_history(c) 3641c80476e4SDavid E. O'Brien int c; 3642c80476e4SDavid E. O'Brien { 3643c80476e4SDavid E. O'Brien USE(c); 3644c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 3645c80476e4SDavid E. O'Brien c_substitute(); 3646c80476e4SDavid E. O'Brien return(CC_NORM); 3647c80476e4SDavid E. O'Brien } 3648c80476e4SDavid E. O'Brien 3649c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3650c80476e4SDavid E. O'Brien CCRETVAL 3651c80476e4SDavid E. O'Brien e_magic_space(c) 3652c80476e4SDavid E. O'Brien int c; 3653c80476e4SDavid E. O'Brien { 3654c80476e4SDavid E. O'Brien USE(c); 3655c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 3656c80476e4SDavid E. O'Brien c_substitute(); 3657c80476e4SDavid E. O'Brien return(e_insert(' ')); 3658c80476e4SDavid E. O'Brien } 3659c80476e4SDavid E. O'Brien 3660c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3661c80476e4SDavid E. O'Brien CCRETVAL 3662c80476e4SDavid E. O'Brien e_inc_fwd(c) 3663c80476e4SDavid E. O'Brien int c; 3664c80476e4SDavid E. O'Brien { 3665c80476e4SDavid E. O'Brien USE(c); 3666c80476e4SDavid E. O'Brien patlen = 0; 3667c80476e4SDavid E. O'Brien return e_inc_search(F_DOWN_SEARCH_HIST); 3668c80476e4SDavid E. O'Brien } 3669c80476e4SDavid E. O'Brien 3670c80476e4SDavid E. O'Brien 3671c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3672c80476e4SDavid E. O'Brien CCRETVAL 3673c80476e4SDavid E. O'Brien e_inc_back(c) 3674c80476e4SDavid E. O'Brien int c; 3675c80476e4SDavid E. O'Brien { 3676c80476e4SDavid E. O'Brien USE(c); 3677c80476e4SDavid E. O'Brien patlen = 0; 3678c80476e4SDavid E. O'Brien return e_inc_search(F_UP_SEARCH_HIST); 3679c80476e4SDavid E. O'Brien } 3680c80476e4SDavid E. O'Brien 3681c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3682c80476e4SDavid E. O'Brien CCRETVAL 3683c80476e4SDavid E. O'Brien e_copyprev(c) 3684c80476e4SDavid E. O'Brien int c; 3685c80476e4SDavid E. O'Brien { 36866767bd61SMark Peek Char *cp, *oldc, *dp; 3687c80476e4SDavid E. O'Brien 3688c80476e4SDavid E. O'Brien USE(c); 3689c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 3690c80476e4SDavid E. O'Brien return(CC_ERROR); 3691c80476e4SDavid E. O'Brien /* else */ 3692c80476e4SDavid E. O'Brien 3693c80476e4SDavid E. O'Brien oldc = Cursor; 3694c80476e4SDavid E. O'Brien /* does a bounds check */ 3695c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument); 3696c80476e4SDavid E. O'Brien 3697c80476e4SDavid E. O'Brien c_insert((int)(oldc - cp)); 3698c80476e4SDavid E. O'Brien for (dp = oldc; cp < oldc && dp < LastChar; cp++) 3699c80476e4SDavid E. O'Brien *dp++ = *cp; 3700c80476e4SDavid E. O'Brien 3701c80476e4SDavid E. O'Brien Cursor = dp; /* put cursor at end */ 3702c80476e4SDavid E. O'Brien 3703c80476e4SDavid E. O'Brien return(CC_REFRESH); 3704c80476e4SDavid E. O'Brien } 3705c80476e4SDavid E. O'Brien 3706c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3707c80476e4SDavid E. O'Brien CCRETVAL 3708c80476e4SDavid E. O'Brien e_tty_starto(c) 3709c80476e4SDavid E. O'Brien int c; 3710c80476e4SDavid E. O'Brien { 3711c80476e4SDavid E. O'Brien USE(c); 3712c80476e4SDavid E. O'Brien /* do no editing */ 3713c80476e4SDavid E. O'Brien return(CC_NORM); 3714c80476e4SDavid E. O'Brien } 3715c80476e4SDavid E. O'Brien 3716c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3717c80476e4SDavid E. O'Brien CCRETVAL 3718c80476e4SDavid E. O'Brien e_load_average(c) 3719c80476e4SDavid E. O'Brien int c; 3720c80476e4SDavid E. O'Brien { 3721c80476e4SDavid E. O'Brien USE(c); 3722c80476e4SDavid E. O'Brien PastBottom(); 3723c80476e4SDavid E. O'Brien #ifdef TIOCSTAT 3724c80476e4SDavid E. O'Brien /* 3725c80476e4SDavid E. O'Brien * Here we pass &c to the ioctl because some os's (NetBSD) expect it 3726c80476e4SDavid E. O'Brien * there even if they don't use it. (lukem@netbsd.org) 3727c80476e4SDavid E. O'Brien */ 3728c80476e4SDavid E. O'Brien if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0) 3729c80476e4SDavid E. O'Brien #endif 3730c80476e4SDavid E. O'Brien xprintf(CGETS(5, 1, "Load average unavailable\n")); 3731c80476e4SDavid E. O'Brien return(CC_REFRESH); 3732c80476e4SDavid E. O'Brien } 3733c80476e4SDavid E. O'Brien 3734c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3735c80476e4SDavid E. O'Brien CCRETVAL 3736c80476e4SDavid E. O'Brien v_chgmeta(c) 3737c80476e4SDavid E. O'Brien int c; 3738c80476e4SDavid E. O'Brien { 3739c80476e4SDavid E. O'Brien USE(c); 3740c80476e4SDavid E. O'Brien /* 3741c80476e4SDavid E. O'Brien * Delete with insert == change: first we delete and then we leave in 3742c80476e4SDavid E. O'Brien * insert mode. 3743c80476e4SDavid E. O'Brien */ 3744c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE|TCSHOP_INSERT)); 3745c80476e4SDavid E. O'Brien } 3746c80476e4SDavid E. O'Brien 3747c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3748c80476e4SDavid E. O'Brien CCRETVAL 3749c80476e4SDavid E. O'Brien v_delmeta(c) 3750c80476e4SDavid E. O'Brien int c; 3751c80476e4SDavid E. O'Brien { 3752c80476e4SDavid E. O'Brien USE(c); 3753c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE)); 3754c80476e4SDavid E. O'Brien } 3755c80476e4SDavid E. O'Brien 3756c80476e4SDavid E. O'Brien 3757c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3758c80476e4SDavid E. O'Brien CCRETVAL 3759c80476e4SDavid E. O'Brien v_endword(c) 3760c80476e4SDavid E. O'Brien int c; 3761c80476e4SDavid E. O'Brien { 3762c80476e4SDavid E. O'Brien USE(c); 3763c80476e4SDavid E. O'Brien if (Cursor == LastChar) 3764c80476e4SDavid E. O'Brien return(CC_ERROR); 3765c80476e4SDavid E. O'Brien /* else */ 3766c80476e4SDavid E. O'Brien 37676767bd61SMark Peek Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace); 3768c80476e4SDavid E. O'Brien 3769c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) 3770c80476e4SDavid E. O'Brien { 3771c80476e4SDavid E. O'Brien Cursor++; 3772c80476e4SDavid E. O'Brien c_delfini(); 3773c80476e4SDavid E. O'Brien return(CC_REFRESH); 3774c80476e4SDavid E. O'Brien } 3775c80476e4SDavid E. O'Brien 3776c80476e4SDavid E. O'Brien RefCursor(); 3777c80476e4SDavid E. O'Brien return(CC_NORM); 3778c80476e4SDavid E. O'Brien } 3779c80476e4SDavid E. O'Brien 3780c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3781c80476e4SDavid E. O'Brien CCRETVAL 3782c80476e4SDavid E. O'Brien v_eword(c) 3783c80476e4SDavid E. O'Brien int c; 3784c80476e4SDavid E. O'Brien { 3785c80476e4SDavid E. O'Brien USE(c); 3786c80476e4SDavid E. O'Brien if (Cursor == LastChar) 3787c80476e4SDavid E. O'Brien return(CC_ERROR); 3788c80476e4SDavid E. O'Brien /* else */ 3789c80476e4SDavid E. O'Brien 3790c80476e4SDavid E. O'Brien Cursor = c_eword(Cursor, LastChar, Argument); 3791c80476e4SDavid E. O'Brien 3792c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 3793c80476e4SDavid E. O'Brien Cursor++; 3794c80476e4SDavid E. O'Brien c_delfini(); 3795c80476e4SDavid E. O'Brien return(CC_REFRESH); 3796c80476e4SDavid E. O'Brien } 3797c80476e4SDavid E. O'Brien 3798c80476e4SDavid E. O'Brien RefCursor(); 3799c80476e4SDavid E. O'Brien return(CC_NORM); 3800c80476e4SDavid E. O'Brien } 3801c80476e4SDavid E. O'Brien 3802c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3803c80476e4SDavid E. O'Brien CCRETVAL 3804c80476e4SDavid E. O'Brien v_char_fwd(c) 3805c80476e4SDavid E. O'Brien int c; 3806c80476e4SDavid E. O'Brien { 3807c80476e4SDavid E. O'Brien Char ch; 3808c80476e4SDavid E. O'Brien 3809c80476e4SDavid E. O'Brien USE(c); 3810c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3811c80476e4SDavid E. O'Brien return e_send_eof(0); 3812c80476e4SDavid E. O'Brien 3813c80476e4SDavid E. O'Brien srch_dir = CHAR_FWD; 3814c80476e4SDavid E. O'Brien srch_char = ch; 3815c80476e4SDavid E. O'Brien 3816c80476e4SDavid E. O'Brien return v_csearch_fwd(ch, Argument, 0); 3817c80476e4SDavid E. O'Brien 3818c80476e4SDavid E. O'Brien } 3819c80476e4SDavid E. O'Brien 3820c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3821c80476e4SDavid E. O'Brien CCRETVAL 3822c80476e4SDavid E. O'Brien v_char_back(c) 3823c80476e4SDavid E. O'Brien int c; 3824c80476e4SDavid E. O'Brien { 3825c80476e4SDavid E. O'Brien Char ch; 3826c80476e4SDavid E. O'Brien 3827c80476e4SDavid E. O'Brien USE(c); 3828c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3829c80476e4SDavid E. O'Brien return e_send_eof(0); 3830c80476e4SDavid E. O'Brien 3831c80476e4SDavid E. O'Brien srch_dir = CHAR_BACK; 3832c80476e4SDavid E. O'Brien srch_char = ch; 3833c80476e4SDavid E. O'Brien 3834c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 0); 3835c80476e4SDavid E. O'Brien } 3836c80476e4SDavid E. O'Brien 3837c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3838c80476e4SDavid E. O'Brien CCRETVAL 3839c80476e4SDavid E. O'Brien v_charto_fwd(c) 3840c80476e4SDavid E. O'Brien int c; 3841c80476e4SDavid E. O'Brien { 3842c80476e4SDavid E. O'Brien Char ch; 3843c80476e4SDavid E. O'Brien 3844c80476e4SDavid E. O'Brien USE(c); 3845c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3846c80476e4SDavid E. O'Brien return e_send_eof(0); 3847c80476e4SDavid E. O'Brien 3848c80476e4SDavid E. O'Brien return v_csearch_fwd(ch, Argument, 1); 3849c80476e4SDavid E. O'Brien 3850c80476e4SDavid E. O'Brien } 3851c80476e4SDavid E. O'Brien 3852c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3853c80476e4SDavid E. O'Brien CCRETVAL 3854c80476e4SDavid E. O'Brien v_charto_back(c) 3855c80476e4SDavid E. O'Brien int c; 3856c80476e4SDavid E. O'Brien { 3857c80476e4SDavid E. O'Brien Char ch; 3858c80476e4SDavid E. O'Brien 3859c80476e4SDavid E. O'Brien USE(c); 3860c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3861c80476e4SDavid E. O'Brien return e_send_eof(0); 3862c80476e4SDavid E. O'Brien 3863c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 1); 3864c80476e4SDavid E. O'Brien } 3865c80476e4SDavid E. O'Brien 3866c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3867c80476e4SDavid E. O'Brien CCRETVAL 3868c80476e4SDavid E. O'Brien v_rchar_fwd(c) 3869c80476e4SDavid E. O'Brien int c; 3870c80476e4SDavid E. O'Brien { 3871c80476e4SDavid E. O'Brien USE(c); 3872c80476e4SDavid E. O'Brien if (srch_char == 0) 3873c80476e4SDavid E. O'Brien return CC_ERROR; 3874c80476e4SDavid E. O'Brien 3875c80476e4SDavid E. O'Brien return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) : 3876c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0); 3877c80476e4SDavid E. O'Brien } 3878c80476e4SDavid E. O'Brien 3879c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3880c80476e4SDavid E. O'Brien CCRETVAL 3881c80476e4SDavid E. O'Brien v_rchar_back(c) 3882c80476e4SDavid E. O'Brien int c; 3883c80476e4SDavid E. O'Brien { 3884c80476e4SDavid E. O'Brien USE(c); 3885c80476e4SDavid E. O'Brien if (srch_char == 0) 3886c80476e4SDavid E. O'Brien return CC_ERROR; 3887c80476e4SDavid E. O'Brien 3888c80476e4SDavid E. O'Brien return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) : 3889c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0); 3890c80476e4SDavid E. O'Brien } 3891c80476e4SDavid E. O'Brien 3892c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3893c80476e4SDavid E. O'Brien CCRETVAL 3894c80476e4SDavid E. O'Brien v_undo(c) 3895c80476e4SDavid E. O'Brien int c; 3896c80476e4SDavid E. O'Brien { 38976767bd61SMark Peek int loop; 38986767bd61SMark Peek Char *kp, *cp; 3899c80476e4SDavid E. O'Brien Char temp; 3900c80476e4SDavid E. O'Brien int size; 3901c80476e4SDavid E. O'Brien 3902c80476e4SDavid E. O'Brien USE(c); 3903c80476e4SDavid E. O'Brien switch (UndoAction) { 3904c80476e4SDavid E. O'Brien case TCSHOP_DELETE|TCSHOP_INSERT: 3905c80476e4SDavid E. O'Brien case TCSHOP_DELETE: 3906c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3907c80476e4SDavid E. O'Brien cp = UndoPtr; 3908c80476e4SDavid E. O'Brien kp = UndoBuf; 3909c80476e4SDavid E. O'Brien for (loop=0; loop < UndoSize; loop++) /* copy the chars */ 3910c80476e4SDavid E. O'Brien *kp++ = *cp++; /* into UndoBuf */ 3911c80476e4SDavid E. O'Brien 3912c80476e4SDavid E. O'Brien for (cp = UndoPtr; cp <= LastChar; cp++) 3913c80476e4SDavid E. O'Brien *cp = cp[UndoSize]; 3914c80476e4SDavid E. O'Brien 3915c80476e4SDavid E. O'Brien LastChar -= UndoSize; 3916c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3917c80476e4SDavid E. O'Brien 3918c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 3919c80476e4SDavid E. O'Brien break; 3920c80476e4SDavid E. O'Brien 3921c80476e4SDavid E. O'Brien case TCSHOP_INSERT: 3922c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3923c80476e4SDavid E. O'Brien cp = UndoPtr; 3924c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3925c80476e4SDavid E. O'Brien kp = UndoBuf; 3926c80476e4SDavid E. O'Brien c_insert(UndoSize); /* open the space, */ 3927c80476e4SDavid E. O'Brien for (loop = 0; loop < UndoSize; loop++) /* copy the chars */ 3928c80476e4SDavid E. O'Brien *cp++ = *kp++; 3929c80476e4SDavid E. O'Brien 3930c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3931c80476e4SDavid E. O'Brien break; 3932c80476e4SDavid E. O'Brien 3933c80476e4SDavid E. O'Brien case TCSHOP_CHANGE: 3934c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3935c80476e4SDavid E. O'Brien cp = UndoPtr; 3936c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3937c80476e4SDavid E. O'Brien kp = UndoBuf; 3938c80476e4SDavid E. O'Brien size = (int)(Cursor-LastChar); /* NOT NSL independant */ 3939c80476e4SDavid E. O'Brien if (size < UndoSize) 3940c80476e4SDavid E. O'Brien size = UndoSize; 3941c80476e4SDavid E. O'Brien for(loop = 0; loop < size; loop++) { 3942c80476e4SDavid E. O'Brien temp = *kp; 3943c80476e4SDavid E. O'Brien *kp++ = *cp; 3944c80476e4SDavid E. O'Brien *cp++ = temp; 3945c80476e4SDavid E. O'Brien } 3946c80476e4SDavid E. O'Brien break; 3947c80476e4SDavid E. O'Brien 3948c80476e4SDavid E. O'Brien default: 3949c80476e4SDavid E. O'Brien return(CC_ERROR); 3950c80476e4SDavid E. O'Brien } 3951c80476e4SDavid E. O'Brien 3952c80476e4SDavid E. O'Brien return(CC_REFRESH); 3953c80476e4SDavid E. O'Brien } 3954c80476e4SDavid E. O'Brien 3955c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3956c80476e4SDavid E. O'Brien CCRETVAL 3957c80476e4SDavid E. O'Brien v_ush_meta(c) 3958c80476e4SDavid E. O'Brien int c; 3959c80476e4SDavid E. O'Brien { 3960c80476e4SDavid E. O'Brien USE(c); 3961c80476e4SDavid E. O'Brien return v_search(F_UP_SEARCH_HIST); 3962c80476e4SDavid E. O'Brien } 3963c80476e4SDavid E. O'Brien 3964c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3965c80476e4SDavid E. O'Brien CCRETVAL 3966c80476e4SDavid E. O'Brien v_dsh_meta(c) 3967c80476e4SDavid E. O'Brien int c; 3968c80476e4SDavid E. O'Brien { 3969c80476e4SDavid E. O'Brien USE(c); 3970c80476e4SDavid E. O'Brien return v_search(F_DOWN_SEARCH_HIST); 3971c80476e4SDavid E. O'Brien } 3972c80476e4SDavid E. O'Brien 3973c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3974c80476e4SDavid E. O'Brien CCRETVAL 3975c80476e4SDavid E. O'Brien v_rsrch_fwd(c) 3976c80476e4SDavid E. O'Brien int c; 3977c80476e4SDavid E. O'Brien { 3978c80476e4SDavid E. O'Brien USE(c); 3979c80476e4SDavid E. O'Brien if (patlen == 0) return(CC_ERROR); 3980c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir)); 3981c80476e4SDavid E. O'Brien } 3982c80476e4SDavid E. O'Brien 3983c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3984c80476e4SDavid E. O'Brien CCRETVAL 3985c80476e4SDavid E. O'Brien v_rsrch_back(c) 3986c80476e4SDavid E. O'Brien int c; 3987c80476e4SDavid E. O'Brien { 3988c80476e4SDavid E. O'Brien USE(c); 3989c80476e4SDavid E. O'Brien if (patlen == 0) return(CC_ERROR); 3990c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ? 3991c80476e4SDavid E. O'Brien F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST)); 3992c80476e4SDavid E. O'Brien } 3993c80476e4SDavid E. O'Brien 39943b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 3995c80476e4SDavid E. O'Brien /* Since ed.defns.h is generated from ed.defns.c, these empty 3996c80476e4SDavid E. O'Brien functions will keep the F_NUM_FNS consistent 3997c80476e4SDavid E. O'Brien */ 3998c80476e4SDavid E. O'Brien CCRETVAL 3999c80476e4SDavid E. O'Brien e_copy_to_clipboard(c) 4000c80476e4SDavid E. O'Brien int c; 4001c80476e4SDavid E. O'Brien { 4002c80476e4SDavid E. O'Brien USE(c); 4003c80476e4SDavid E. O'Brien return CC_ERROR; 4004c80476e4SDavid E. O'Brien } 4005c80476e4SDavid E. O'Brien 4006c80476e4SDavid E. O'Brien CCRETVAL 4007c80476e4SDavid E. O'Brien e_paste_from_clipboard(c) 4008c80476e4SDavid E. O'Brien int c; 4009c80476e4SDavid E. O'Brien { 4010c80476e4SDavid E. O'Brien USE(c); 4011c80476e4SDavid E. O'Brien return (CC_ERROR); 4012c80476e4SDavid E. O'Brien } 4013c80476e4SDavid E. O'Brien 4014c80476e4SDavid E. O'Brien CCRETVAL 4015c80476e4SDavid E. O'Brien e_dosify_next(c) 4016c80476e4SDavid E. O'Brien int c; 4017c80476e4SDavid E. O'Brien { 4018c80476e4SDavid E. O'Brien USE(c); 4019c80476e4SDavid E. O'Brien return (CC_ERROR); 4020c80476e4SDavid E. O'Brien } 4021c80476e4SDavid E. O'Brien CCRETVAL 4022c80476e4SDavid E. O'Brien e_dosify_prev(c) 4023c80476e4SDavid E. O'Brien int c; 4024c80476e4SDavid E. O'Brien { 4025c80476e4SDavid E. O'Brien USE(c); 4026c80476e4SDavid E. O'Brien return (CC_ERROR); 4027c80476e4SDavid E. O'Brien } 4028c80476e4SDavid E. O'Brien CCRETVAL 40293b6eaa7bSAndrey A. Chernov e_page_up(c) 4030c80476e4SDavid E. O'Brien int c; 4031c80476e4SDavid E. O'Brien { 4032c80476e4SDavid E. O'Brien USE(c); 4033c80476e4SDavid E. O'Brien return (CC_ERROR); 4034c80476e4SDavid E. O'Brien } 4035c80476e4SDavid E. O'Brien CCRETVAL 40363b6eaa7bSAndrey A. Chernov e_page_down(c) 4037c80476e4SDavid E. O'Brien int c; 4038c80476e4SDavid E. O'Brien { 4039c80476e4SDavid E. O'Brien USE(c); 4040c80476e4SDavid E. O'Brien return (CC_ERROR); 4041c80476e4SDavid E. O'Brien } 40423b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */ 4043c80476e4SDavid E. O'Brien 4044c80476e4SDavid E. O'Brien #ifdef notdef 4045c80476e4SDavid E. O'Brien void 4046c80476e4SDavid E. O'Brien MoveCursor(n) /* move cursor + right - left char */ 4047c80476e4SDavid E. O'Brien int n; 4048c80476e4SDavid E. O'Brien { 4049c80476e4SDavid E. O'Brien Cursor = Cursor + n; 4050c80476e4SDavid E. O'Brien if (Cursor < InputBuf) 4051c80476e4SDavid E. O'Brien Cursor = InputBuf; 4052c80476e4SDavid E. O'Brien if (Cursor > LastChar) 4053c80476e4SDavid E. O'Brien Cursor = LastChar; 4054c80476e4SDavid E. O'Brien return; 4055c80476e4SDavid E. O'Brien } 4056c80476e4SDavid E. O'Brien 4057c80476e4SDavid E. O'Brien Char * 4058c80476e4SDavid E. O'Brien GetCursor() 4059c80476e4SDavid E. O'Brien { 4060c80476e4SDavid E. O'Brien return(Cursor); 4061c80476e4SDavid E. O'Brien } 4062c80476e4SDavid E. O'Brien 4063c80476e4SDavid E. O'Brien int 4064c80476e4SDavid E. O'Brien PutCursor(p) 4065c80476e4SDavid E. O'Brien Char *p; 4066c80476e4SDavid E. O'Brien { 4067c80476e4SDavid E. O'Brien if (p < InputBuf || p > LastChar) 4068c80476e4SDavid E. O'Brien return 1; /* Error */ 4069c80476e4SDavid E. O'Brien Cursor = p; 4070c80476e4SDavid E. O'Brien return 0; 4071c80476e4SDavid E. O'Brien } 4072c80476e4SDavid E. O'Brien #endif 4073