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