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