119d2e3deSDmitry Chagin /* $Header: /p/tcsh/cvsroot/tcsh/ed.chared.c,v 3.103 2015/08/19 14:29:55 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * ed.chared.c: Character editing functions. 4c80476e4SDavid E. O'Brien */ 5c80476e4SDavid E. O'Brien /*- 6c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 7c80476e4SDavid E. O'Brien * All rights reserved. 8c80476e4SDavid E. O'Brien * 9c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 10c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 11c80476e4SDavid E. O'Brien * are met: 12c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 13c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 14c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 16c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 1729301572SMark Peek * 3. Neither the name of the University nor the names of its contributors 18c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 19c80476e4SDavid E. O'Brien * without specific prior written permission. 20c80476e4SDavid E. O'Brien * 21c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31c80476e4SDavid E. O'Brien * SUCH DAMAGE. 32c80476e4SDavid E. O'Brien */ 33c80476e4SDavid E. O'Brien /* 34c80476e4SDavid E. O'Brien Bjorn Knutsson @ Thu Jun 24 19:02:17 1999 35c80476e4SDavid E. O'Brien 36c80476e4SDavid E. O'Brien e_dabbrev_expand() did not do proper completion if quoted spaces were present 37c80476e4SDavid E. O'Brien in the string being completed. Exemple: 38c80476e4SDavid E. O'Brien 39c80476e4SDavid E. O'Brien # echo hello\ world 40c80476e4SDavid E. O'Brien hello world 41c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande> 42c80476e4SDavid E. O'Brien # echo hello\<cursor> 43c80476e4SDavid E. O'Brien 44c80476e4SDavid E. O'Brien Correct behavior is: 45c80476e4SDavid E. O'Brien # echo h<press key bound to dabbrev-expande> 46c80476e4SDavid E. O'Brien # echo hello\ world<cursor> 47c80476e4SDavid E. O'Brien 48c80476e4SDavid E. O'Brien The same problem occured if spaces were present in a string withing quotation 49c80476e4SDavid E. O'Brien marks. Example: 50c80476e4SDavid E. O'Brien 51c80476e4SDavid E. O'Brien # echo "hello world" 52c80476e4SDavid E. O'Brien hello world 53c80476e4SDavid E. O'Brien # echo "h<press key bound to dabbrev-expande> 54c80476e4SDavid E. O'Brien # echo "hello<cursor> 55c80476e4SDavid E. O'Brien 56c80476e4SDavid E. O'Brien The former problem could be solved with minor modifications of c_preword() 57c80476e4SDavid E. O'Brien and c_endword(). The latter, however, required a significant rewrite of 58c80476e4SDavid E. O'Brien c_preword(), since quoted strings must be parsed from start to end to 59c80476e4SDavid E. O'Brien determine if a given character is inside or outside the quotation marks. 60c80476e4SDavid E. O'Brien 61c80476e4SDavid E. O'Brien Compare the following two strings: 62c80476e4SDavid E. O'Brien 63c80476e4SDavid E. O'Brien # echo \"" 'foo \' bar\" 64c80476e4SDavid E. O'Brien " 'foo \' bar\ 65c80476e4SDavid E. O'Brien # echo '\"" 'foo \' bar\" 66c80476e4SDavid E. O'Brien \"" foo ' bar" 67c80476e4SDavid E. O'Brien 68c80476e4SDavid E. O'Brien The only difference between the two echo lines is in the first character 69c80476e4SDavid E. O'Brien after the echo command. The result is either one or three arguments. 70c80476e4SDavid E. O'Brien 71c80476e4SDavid E. O'Brien */ 72c80476e4SDavid E. O'Brien 73c80476e4SDavid E. O'Brien #include "sh.h" 74c80476e4SDavid E. O'Brien 7519d2e3deSDmitry Chagin RCSID("$tcsh: ed.chared.c,v 3.103 2015/08/19 14:29:55 christos Exp $") 76c80476e4SDavid E. O'Brien 77c80476e4SDavid E. O'Brien #include "ed.h" 78c80476e4SDavid E. O'Brien #include "tw.h" 79c80476e4SDavid E. O'Brien #include "ed.defns.h" 80c80476e4SDavid E. O'Brien 81c80476e4SDavid E. O'Brien /* #define SDEBUG */ 82c80476e4SDavid E. O'Brien 83c80476e4SDavid E. O'Brien #define TCSHOP_NOP 0x00 84c80476e4SDavid E. O'Brien #define TCSHOP_DELETE 0x01 85c80476e4SDavid E. O'Brien #define TCSHOP_INSERT 0x02 86c80476e4SDavid E. O'Brien #define TCSHOP_CHANGE 0x04 87c80476e4SDavid E. O'Brien 88c80476e4SDavid E. O'Brien #define CHAR_FWD 0 89c80476e4SDavid E. O'Brien #define CHAR_BACK 1 90c80476e4SDavid E. O'Brien 91c80476e4SDavid E. O'Brien /* 92c80476e4SDavid E. O'Brien * vi word treatment 93c80476e4SDavid E. O'Brien * from: Gert-Jan Vons <vons@cesar.crbca1.sinet.slb.com> 94c80476e4SDavid E. O'Brien */ 95c80476e4SDavid E. O'Brien #define C_CLASS_WHITE 1 9619d2e3deSDmitry Chagin #define C_CLASS_WORD 2 97c80476e4SDavid E. O'Brien #define C_CLASS_OTHER 3 98c80476e4SDavid E. O'Brien 99c80476e4SDavid E. O'Brien static Char *InsertPos = InputBuf; /* Where insertion starts */ 100c80476e4SDavid E. O'Brien static Char *ActionPos = 0; /* Where action begins */ 101c80476e4SDavid E. O'Brien static int ActionFlag = TCSHOP_NOP; /* What delayed action to take */ 102c80476e4SDavid E. O'Brien /* 103c80476e4SDavid E. O'Brien * Word search state 104c80476e4SDavid E. O'Brien */ 105c80476e4SDavid E. O'Brien static int searchdir = F_UP_SEARCH_HIST; /* Direction of last search */ 10645e5710bSMark Peek static struct Strbuf patbuf; /* = Strbuf_INIT; Search target */ 107c80476e4SDavid E. O'Brien /* 108c80476e4SDavid E. O'Brien * Char search state 109c80476e4SDavid E. O'Brien */ 110c80476e4SDavid E. O'Brien static int srch_dir = CHAR_FWD; /* Direction of last search */ 111c80476e4SDavid E. O'Brien static Char srch_char = 0; /* Search target */ 112c80476e4SDavid E. O'Brien 113c80476e4SDavid E. O'Brien /* all routines that start with c_ are private to this set of routines */ 11445e5710bSMark Peek static void c_alternativ_key_map (int); 11545e5710bSMark Peek void c_insert (int); 11645e5710bSMark Peek void c_delafter (int); 11745e5710bSMark Peek void c_delbefore (int); 11845e5710bSMark Peek static int c_to_class (Char); 11945e5710bSMark Peek static Char *c_prev_word (Char *, Char *, int); 12045e5710bSMark Peek static Char *c_next_word (Char *, Char *, int); 12145e5710bSMark Peek static Char *c_number (Char *, int *, int); 12245e5710bSMark Peek static Char *c_expand (Char *); 123a15e6f9aSMark Peek static int c_excl (Char *); 124a15e6f9aSMark Peek static int c_substitute (void); 12545e5710bSMark Peek static void c_delfini (void); 12645e5710bSMark Peek static int c_hmatch (Char *); 12745e5710bSMark Peek static void c_hsetpat (void); 128c80476e4SDavid E. O'Brien #ifdef COMMENT 12945e5710bSMark Peek static void c_get_word (Char **, Char **); 130c80476e4SDavid E. O'Brien #endif 13145e5710bSMark Peek static Char *c_preword (Char *, Char *, int, Char *); 13245e5710bSMark Peek static Char *c_nexword (Char *, Char *, int); 13345e5710bSMark Peek static Char *c_endword (Char *, Char *, int, Char *); 13445e5710bSMark Peek static Char *c_eword (Char *, Char *, int); 13545e5710bSMark Peek static void c_push_kill (Char *, Char *); 13645e5710bSMark Peek static void c_save_inputbuf (void); 13745e5710bSMark Peek static CCRETVAL c_search_line (Char *, int); 13845e5710bSMark Peek static CCRETVAL v_repeat_srch (int); 13945e5710bSMark Peek static CCRETVAL e_inc_search (int); 14045e5710bSMark Peek #ifdef notyet 14145e5710bSMark Peek static CCRETVAL e_insert_str (Char *); 14245e5710bSMark Peek #endif 14345e5710bSMark Peek static CCRETVAL v_search (int); 14445e5710bSMark Peek static CCRETVAL v_csearch_fwd (Char, int, int); 14545e5710bSMark Peek static CCRETVAL v_action (int); 14645e5710bSMark Peek static CCRETVAL v_csearch_back (Char, int, int); 147c80476e4SDavid E. O'Brien 148c80476e4SDavid E. O'Brien static void 14945e5710bSMark Peek c_alternativ_key_map(int state) 150c80476e4SDavid E. O'Brien { 151c80476e4SDavid E. O'Brien switch (state) { 152c80476e4SDavid E. O'Brien case 0: 153c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap; 154c80476e4SDavid E. O'Brien break; 155c80476e4SDavid E. O'Brien case 1: 156c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap; 157c80476e4SDavid E. O'Brien break; 158c80476e4SDavid E. O'Brien default: 159c80476e4SDavid E. O'Brien return; 160c80476e4SDavid E. O'Brien } 161c80476e4SDavid E. O'Brien 162c80476e4SDavid E. O'Brien AltKeyMap = (Char) state; 163c80476e4SDavid E. O'Brien } 164c80476e4SDavid E. O'Brien 1656767bd61SMark Peek void 16645e5710bSMark Peek c_insert(int num) 167c80476e4SDavid E. O'Brien { 1686767bd61SMark Peek Char *cp; 169c80476e4SDavid E. O'Brien 170c80476e4SDavid E. O'Brien if (LastChar + num >= InputLim) 171c80476e4SDavid E. O'Brien return; /* can't go past end of buffer */ 172c80476e4SDavid E. O'Brien 173c80476e4SDavid E. O'Brien if (Cursor < LastChar) { /* if I must move chars */ 174c80476e4SDavid E. O'Brien for (cp = LastChar; cp >= Cursor; cp--) 175c80476e4SDavid E. O'Brien cp[num] = *cp; 17623338178SMark Peek if (Mark && Mark > Cursor) 17723338178SMark Peek Mark += num; 178c80476e4SDavid E. O'Brien } 179c80476e4SDavid E. O'Brien LastChar += num; 180c80476e4SDavid E. O'Brien } 181c80476e4SDavid E. O'Brien 1823b6eaa7bSAndrey A. Chernov void 18345e5710bSMark Peek c_delafter(int num) 184c80476e4SDavid E. O'Brien { 1856767bd61SMark Peek Char *cp, *kp = NULL; 186c80476e4SDavid E. O'Brien 187c80476e4SDavid E. O'Brien if (num > LastChar - Cursor) 188c80476e4SDavid E. O'Brien num = (int) (LastChar - Cursor); /* bounds check */ 189c80476e4SDavid E. O'Brien 190c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */ 191c80476e4SDavid E. O'Brien if (VImode) { 192c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */ 193c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 194c80476e4SDavid E. O'Brien UndoSize = num; 195c80476e4SDavid E. O'Brien UndoPtr = Cursor; 196c80476e4SDavid E. O'Brien for (cp = Cursor; cp <= LastChar; cp++) { 197c80476e4SDavid E. O'Brien *kp++ = *cp; /* Save deleted chars into undobuf */ 198c80476e4SDavid E. O'Brien *cp = cp[num]; 199c80476e4SDavid E. O'Brien } 200c80476e4SDavid E. O'Brien } 201c80476e4SDavid E. O'Brien else 20223338178SMark Peek for (cp = Cursor; cp + num <= LastChar; cp++) 203c80476e4SDavid E. O'Brien *cp = cp[num]; 204c80476e4SDavid E. O'Brien LastChar -= num; 20545e5710bSMark Peek /* Mark was within the range of the deleted word? */ 20645e5710bSMark Peek if (Mark && Mark > Cursor && Mark <= Cursor+num) 20745e5710bSMark Peek Mark = Cursor; 20845e5710bSMark Peek /* Mark after the deleted word? */ 20945e5710bSMark Peek else if (Mark && Mark > Cursor) 21023338178SMark Peek Mark -= num; 211c80476e4SDavid E. O'Brien } 212c80476e4SDavid E. O'Brien #ifdef notdef 213c80476e4SDavid E. O'Brien else { 214c80476e4SDavid E. O'Brien /* 215c80476e4SDavid E. O'Brien * XXX: We don't want to do that. In emacs mode overwrite should be 216c80476e4SDavid E. O'Brien * sticky. I am not sure how that affects vi mode 217c80476e4SDavid E. O'Brien */ 218c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 219c80476e4SDavid E. O'Brien } 220c80476e4SDavid E. O'Brien #endif /* notdef */ 221c80476e4SDavid E. O'Brien } 222c80476e4SDavid E. O'Brien 2233b6eaa7bSAndrey A. Chernov void 22445e5710bSMark Peek c_delbefore(int num) /* delete before dot, with bounds checking */ 225c80476e4SDavid E. O'Brien { 2266767bd61SMark Peek Char *cp, *kp = NULL; 227c80476e4SDavid E. O'Brien 228c80476e4SDavid E. O'Brien if (num > Cursor - InputBuf) 229c80476e4SDavid E. O'Brien num = (int) (Cursor - InputBuf); /* bounds check */ 230c80476e4SDavid E. O'Brien 231c80476e4SDavid E. O'Brien if (num > 0) { /* if I can delete anything */ 232c80476e4SDavid E. O'Brien if (VImode) { 233c80476e4SDavid E. O'Brien kp = UndoBuf; /* Set Up for VI undo command */ 234c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 235c80476e4SDavid E. O'Brien UndoSize = num; 236c80476e4SDavid E. O'Brien UndoPtr = Cursor - num; 237c80476e4SDavid E. O'Brien for (cp = Cursor - num; cp <= LastChar; cp++) { 238c80476e4SDavid E. O'Brien *kp++ = *cp; 239c80476e4SDavid E. O'Brien *cp = cp[num]; 240c80476e4SDavid E. O'Brien } 241c80476e4SDavid E. O'Brien } 242c80476e4SDavid E. O'Brien else 24323338178SMark Peek for (cp = Cursor - num; cp + num <= LastChar; cp++) 244c80476e4SDavid E. O'Brien *cp = cp[num]; 245c80476e4SDavid E. O'Brien LastChar -= num; 24623338178SMark Peek Cursor -= num; 24745e5710bSMark Peek /* Mark was within the range of the deleted word? */ 24845e5710bSMark Peek if (Mark && Mark > Cursor && Mark <= Cursor+num) 24945e5710bSMark Peek Mark = Cursor; 25045e5710bSMark Peek /* Mark after the deleted word? */ 25145e5710bSMark Peek else if (Mark && Mark > Cursor) 25223338178SMark Peek Mark -= num; 253c80476e4SDavid E. O'Brien } 254c80476e4SDavid E. O'Brien } 255c80476e4SDavid E. O'Brien 256c80476e4SDavid E. O'Brien static Char * 25745e5710bSMark Peek c_preword(Char *p, Char *low, int n, Char *delim) 258c80476e4SDavid E. O'Brien { 259c80476e4SDavid E. O'Brien while (n--) { 2606767bd61SMark Peek Char *prev = low; 2616767bd61SMark Peek Char *new; 262c80476e4SDavid E. O'Brien 2636767bd61SMark Peek while (prev < p) { /* Skip initial non-word chars */ 2646767bd61SMark Peek if (!Strchr(delim, *prev) || *(prev-1) == (Char)'\\') 265c80476e4SDavid E. O'Brien break; 266c80476e4SDavid E. O'Brien prev++; 267c80476e4SDavid E. O'Brien } 268c80476e4SDavid E. O'Brien 269c80476e4SDavid E. O'Brien new = prev; 270c80476e4SDavid E. O'Brien 271c80476e4SDavid E. O'Brien while (new < p) { 272c80476e4SDavid E. O'Brien prev = new; 2736767bd61SMark Peek new = c_endword(prev-1, p, 1, delim); /* Skip to next non-word char */ 274c80476e4SDavid E. O'Brien new++; /* Step away from end of word */ 2756767bd61SMark Peek while (new <= p) { /* Skip trailing non-word chars */ 2766767bd61SMark Peek if (!Strchr(delim, *new) || *(new-1) == (Char)'\\') 277c80476e4SDavid E. O'Brien break; 278c80476e4SDavid E. O'Brien new++; 279c80476e4SDavid E. O'Brien } 280c80476e4SDavid E. O'Brien } 281c80476e4SDavid E. O'Brien 282c80476e4SDavid E. O'Brien p = prev; /* Set to previous word start */ 283c80476e4SDavid E. O'Brien 284c80476e4SDavid E. O'Brien } 285c80476e4SDavid E. O'Brien if (p < low) 286c80476e4SDavid E. O'Brien p = low; 287c80476e4SDavid E. O'Brien return (p); 288c80476e4SDavid E. O'Brien } 289c80476e4SDavid E. O'Brien 290c80476e4SDavid E. O'Brien /* 291c80476e4SDavid E. O'Brien * c_to_class() returns the class of the given character. 292c80476e4SDavid E. O'Brien * 29319d2e3deSDmitry Chagin * This is used to make the c_prev_word(), c_next_word() and c_eword() functions 294c80476e4SDavid E. O'Brien * work like vi's, which classify characters. A word is a sequence of 295c80476e4SDavid E. O'Brien * characters belonging to the same class, classes being defined as 296c80476e4SDavid E. O'Brien * follows: 297c80476e4SDavid E. O'Brien * 298c80476e4SDavid E. O'Brien * 1/ whitespace 299c80476e4SDavid E. O'Brien * 2/ alphanumeric chars, + underscore 300c80476e4SDavid E. O'Brien * 3/ others 301c80476e4SDavid E. O'Brien */ 302c80476e4SDavid E. O'Brien static int 30345e5710bSMark Peek c_to_class(Char ch) 304c80476e4SDavid E. O'Brien { 305c80476e4SDavid E. O'Brien if (Isspace(ch)) 306c80476e4SDavid E. O'Brien return C_CLASS_WHITE; 307c80476e4SDavid E. O'Brien 30819d2e3deSDmitry Chagin if (isword(ch)) 30919d2e3deSDmitry Chagin return C_CLASS_WORD; 310c80476e4SDavid E. O'Brien 311c80476e4SDavid E. O'Brien return C_CLASS_OTHER; 312c80476e4SDavid E. O'Brien } 313c80476e4SDavid E. O'Brien 314c80476e4SDavid E. O'Brien static Char * 31545e5710bSMark Peek c_prev_word(Char *p, Char *low, int n) 316c80476e4SDavid E. O'Brien { 317c80476e4SDavid E. O'Brien p--; 318c80476e4SDavid E. O'Brien 319c80476e4SDavid E. O'Brien if (!VImode) { 320c80476e4SDavid E. O'Brien while (n--) { 321c80476e4SDavid E. O'Brien while ((p >= low) && !isword(*p)) 322c80476e4SDavid E. O'Brien p--; 323c80476e4SDavid E. O'Brien while ((p >= low) && isword(*p)) 324c80476e4SDavid E. O'Brien p--; 325c80476e4SDavid E. O'Brien } 326c80476e4SDavid E. O'Brien 327c80476e4SDavid E. O'Brien /* cp now points to one character before the word */ 328c80476e4SDavid E. O'Brien p++; 329c80476e4SDavid E. O'Brien if (p < low) 330c80476e4SDavid E. O'Brien p = low; 331c80476e4SDavid E. O'Brien /* cp now points where we want it */ 332c80476e4SDavid E. O'Brien return(p); 333c80476e4SDavid E. O'Brien } 334c80476e4SDavid E. O'Brien 335c80476e4SDavid E. O'Brien while (n--) { 3366767bd61SMark Peek int c_class; 337c80476e4SDavid E. O'Brien 338c80476e4SDavid E. O'Brien if (p < low) 339c80476e4SDavid E. O'Brien break; 340c80476e4SDavid E. O'Brien 341c80476e4SDavid E. O'Brien /* scan until beginning of current word (may be all whitespace!) */ 342c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 343c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p)) 344c80476e4SDavid E. O'Brien p--; 345c80476e4SDavid E. O'Brien 346c80476e4SDavid E. O'Brien /* if this was a non_whitespace word, we're ready */ 347c80476e4SDavid E. O'Brien if (c_class != C_CLASS_WHITE) 348c80476e4SDavid E. O'Brien continue; 349c80476e4SDavid E. O'Brien 350c80476e4SDavid E. O'Brien /* otherwise, move back to beginning of the word just found */ 351c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 352c80476e4SDavid E. O'Brien while ((p >= low) && c_class == c_to_class(*p)) 353c80476e4SDavid E. O'Brien p--; 354c80476e4SDavid E. O'Brien } 355c80476e4SDavid E. O'Brien 356c80476e4SDavid E. O'Brien p++; /* correct overshoot */ 357c80476e4SDavid E. O'Brien 358c80476e4SDavid E. O'Brien return (p); 359c80476e4SDavid E. O'Brien } 360c80476e4SDavid E. O'Brien 361c80476e4SDavid E. O'Brien static Char * 36245e5710bSMark Peek c_next_word(Char *p, Char *high, int n) 363c80476e4SDavid E. O'Brien { 364c80476e4SDavid E. O'Brien if (!VImode) { 365c80476e4SDavid E. O'Brien while (n--) { 366c80476e4SDavid E. O'Brien while ((p < high) && !isword(*p)) 367c80476e4SDavid E. O'Brien p++; 368c80476e4SDavid E. O'Brien while ((p < high) && isword(*p)) 369c80476e4SDavid E. O'Brien p++; 370c80476e4SDavid E. O'Brien } 371c80476e4SDavid E. O'Brien if (p > high) 372c80476e4SDavid E. O'Brien p = high; 373c80476e4SDavid E. O'Brien /* p now points where we want it */ 374c80476e4SDavid E. O'Brien return(p); 375c80476e4SDavid E. O'Brien } 376c80476e4SDavid E. O'Brien 377c80476e4SDavid E. O'Brien while (n--) { 3786767bd61SMark Peek int c_class; 379c80476e4SDavid E. O'Brien 380c80476e4SDavid E. O'Brien if (p >= high) 381c80476e4SDavid E. O'Brien break; 382c80476e4SDavid E. O'Brien 383c80476e4SDavid E. O'Brien /* scan until end of current word (may be all whitespace!) */ 384c80476e4SDavid E. O'Brien c_class = c_to_class(*p); 385c80476e4SDavid E. O'Brien while ((p < high) && c_class == c_to_class(*p)) 386c80476e4SDavid E. O'Brien p++; 387c80476e4SDavid E. O'Brien 388c80476e4SDavid E. O'Brien /* if this was all whitespace, we're ready */ 389c80476e4SDavid E. O'Brien if (c_class == C_CLASS_WHITE) 390c80476e4SDavid E. O'Brien continue; 391c80476e4SDavid E. O'Brien 392c80476e4SDavid E. O'Brien /* if we've found white-space at the end of the word, skip it */ 393c80476e4SDavid E. O'Brien while ((p < high) && c_to_class(*p) == C_CLASS_WHITE) 394c80476e4SDavid E. O'Brien p++; 395c80476e4SDavid E. O'Brien } 396c80476e4SDavid E. O'Brien 397c80476e4SDavid E. O'Brien p--; /* correct overshoot */ 398c80476e4SDavid E. O'Brien 399c80476e4SDavid E. O'Brien return (p); 400c80476e4SDavid E. O'Brien } 401c80476e4SDavid E. O'Brien 402c80476e4SDavid E. O'Brien static Char * 40345e5710bSMark Peek c_nexword(Char *p, Char *high, int n) 404c80476e4SDavid E. O'Brien { 405c80476e4SDavid E. O'Brien while (n--) { 406c80476e4SDavid E. O'Brien while ((p < high) && !Isspace(*p)) 407c80476e4SDavid E. O'Brien p++; 408c80476e4SDavid E. O'Brien while ((p < high) && Isspace(*p)) 409c80476e4SDavid E. O'Brien p++; 410c80476e4SDavid E. O'Brien } 411c80476e4SDavid E. O'Brien 412c80476e4SDavid E. O'Brien if (p > high) 413c80476e4SDavid E. O'Brien p = high; 414c80476e4SDavid E. O'Brien /* p now points where we want it */ 415c80476e4SDavid E. O'Brien return(p); 416c80476e4SDavid E. O'Brien } 417c80476e4SDavid E. O'Brien 418c80476e4SDavid E. O'Brien /* 419c80476e4SDavid E. O'Brien * Expand-History (originally "Magic-Space") code added by 420c80476e4SDavid E. O'Brien * Ray Moody <ray@gibbs.physics.purdue.edu> 421c80476e4SDavid E. O'Brien * this is a neat, but odd, addition. 422c80476e4SDavid E. O'Brien */ 423c80476e4SDavid E. O'Brien 424c80476e4SDavid E. O'Brien /* 425c80476e4SDavid E. O'Brien * c_number: Ignore character p points to, return number appearing after that. 426c80476e4SDavid E. O'Brien * A '$' by itself means a big number; "$-" is for negative; '^' means 1. 427c80476e4SDavid E. O'Brien * Return p pointing to last char used. 428c80476e4SDavid E. O'Brien */ 429c80476e4SDavid E. O'Brien 430c80476e4SDavid E. O'Brien /* 431c80476e4SDavid E. O'Brien * dval is the number to subtract from for things like $-3 432c80476e4SDavid E. O'Brien */ 433c80476e4SDavid E. O'Brien 434c80476e4SDavid E. O'Brien static Char * 43545e5710bSMark Peek c_number(Char *p, int *num, int dval) 436c80476e4SDavid E. O'Brien { 4376767bd61SMark Peek int i; 4386767bd61SMark Peek int sign = 1; 439c80476e4SDavid E. O'Brien 440c80476e4SDavid E. O'Brien if (*++p == '^') { 441c80476e4SDavid E. O'Brien *num = 1; 442c80476e4SDavid E. O'Brien return(p); 443c80476e4SDavid E. O'Brien } 444c80476e4SDavid E. O'Brien if (*p == '$') { 445c80476e4SDavid E. O'Brien if (*++p != '-') { 44645e5710bSMark Peek *num = INT_MAX; /* Handle $ */ 447c80476e4SDavid E. O'Brien return(--p); 448c80476e4SDavid E. O'Brien } 449c80476e4SDavid E. O'Brien sign = -1; /* Handle $- */ 450c80476e4SDavid E. O'Brien ++p; 451c80476e4SDavid E. O'Brien } 452c80476e4SDavid E. O'Brien for (i = 0; *p >= '0' && *p <= '9'; i = 10 * i + *p++ - '0') 453c80476e4SDavid E. O'Brien continue; 454c80476e4SDavid E. O'Brien *num = (sign < 0 ? dval - i : i); 455c80476e4SDavid E. O'Brien return(--p); 456c80476e4SDavid E. O'Brien } 457c80476e4SDavid E. O'Brien 458c80476e4SDavid E. O'Brien /* 459c80476e4SDavid E. O'Brien * excl_expand: There is an excl to be expanded to p -- do the right thing 460c80476e4SDavid E. O'Brien * with it and return a version of p advanced over the expanded stuff. Also, 461c80476e4SDavid E. O'Brien * update tsh_cur and related things as appropriate... 462c80476e4SDavid E. O'Brien */ 463c80476e4SDavid E. O'Brien 464c80476e4SDavid E. O'Brien static Char * 46545e5710bSMark Peek c_expand(Char *p) 466c80476e4SDavid E. O'Brien { 4676767bd61SMark Peek Char *q; 4686767bd61SMark Peek struct Hist *h = Histlist.Hnext; 4696767bd61SMark Peek struct wordent *l; 470c80476e4SDavid E. O'Brien int i, from, to, dval; 47123338178SMark Peek int all_dig; 47223338178SMark Peek int been_once = 0; 473c80476e4SDavid E. O'Brien Char *op = p; 47445e5710bSMark Peek Char *buf; 47545e5710bSMark Peek size_t buf_len; 47645e5710bSMark Peek Char *modbuf; 477c80476e4SDavid E. O'Brien 47845e5710bSMark Peek buf = NULL; 479c80476e4SDavid E. O'Brien if (!h) 480c80476e4SDavid E. O'Brien goto excl_err; 481c80476e4SDavid E. O'Brien excl_sw: 482c80476e4SDavid E. O'Brien switch (*(q = p + 1)) { 483c80476e4SDavid E. O'Brien 484c80476e4SDavid E. O'Brien case '^': 48545e5710bSMark Peek buf = expand_lex(&h->Hlex, 1, 1); 486c80476e4SDavid E. O'Brien break; 487c80476e4SDavid E. O'Brien 488c80476e4SDavid E. O'Brien case '$': 489c80476e4SDavid E. O'Brien if ((l = (h->Hlex).prev) != 0) 49045e5710bSMark Peek buf = expand_lex(l->prev->prev, 0, 0); 491c80476e4SDavid E. O'Brien break; 492c80476e4SDavid E. O'Brien 493c80476e4SDavid E. O'Brien case '*': 49445e5710bSMark Peek buf = expand_lex(&h->Hlex, 1, INT_MAX); 495c80476e4SDavid E. O'Brien break; 496c80476e4SDavid E. O'Brien 497c80476e4SDavid E. O'Brien default: 498c80476e4SDavid E. O'Brien if (been_once) { /* unknown argument */ 499c80476e4SDavid E. O'Brien /* assume it's a modifier, e.g. !foo:h, and get whole cmd */ 50045e5710bSMark Peek buf = expand_lex(&h->Hlex, 0, INT_MAX); 501c80476e4SDavid E. O'Brien q -= 2; 502c80476e4SDavid E. O'Brien break; 503c80476e4SDavid E. O'Brien } 504c80476e4SDavid E. O'Brien been_once = 1; 505c80476e4SDavid E. O'Brien 506c80476e4SDavid E. O'Brien if (*q == ':') /* short form: !:arg */ 507c80476e4SDavid E. O'Brien --q; 508c80476e4SDavid E. O'Brien 5099ccc37e3SMark Peek if (HIST != '\0' && *q != HIST) { 510c80476e4SDavid E. O'Brien /* 511c80476e4SDavid E. O'Brien * Search for a space, tab, or colon. See if we have a number (as 512c80476e4SDavid E. O'Brien * in !1234:xyz). Remember the number. 513c80476e4SDavid E. O'Brien */ 514c80476e4SDavid E. O'Brien for (i = 0, all_dig = 1; 515c80476e4SDavid E. O'Brien *q != ' ' && *q != '\t' && *q != ':' && q < Cursor; q++) { 516c80476e4SDavid E. O'Brien /* 517c80476e4SDavid E. O'Brien * PWP: !-4 is a valid history argument too, therefore the test 518c80476e4SDavid E. O'Brien * is if not a digit, or not a - as the first character. 519c80476e4SDavid E. O'Brien */ 520c80476e4SDavid E. O'Brien if ((*q < '0' || *q > '9') && (*q != '-' || q != p + 1)) 521c80476e4SDavid E. O'Brien all_dig = 0; 522c80476e4SDavid E. O'Brien else if (*q == '-') 523c80476e4SDavid E. O'Brien all_dig = 2;/* we are sneeky about this */ 524c80476e4SDavid E. O'Brien else 525c80476e4SDavid E. O'Brien i = 10 * i + *q - '0'; 526c80476e4SDavid E. O'Brien } 527c80476e4SDavid E. O'Brien --q; 528c80476e4SDavid E. O'Brien 529c80476e4SDavid E. O'Brien /* 530c80476e4SDavid E. O'Brien * If we have a number, search for event i. Otherwise, search for 531c80476e4SDavid E. O'Brien * a named event (as in !foo). (In this case, I is the length of 532c80476e4SDavid E. O'Brien * the named event). 533c80476e4SDavid E. O'Brien */ 534c80476e4SDavid E. O'Brien if (all_dig) { 535c80476e4SDavid E. O'Brien if (all_dig == 2) 536c80476e4SDavid E. O'Brien i = -i; /* make it negitive */ 537c80476e4SDavid E. O'Brien if (i < 0) /* if !-4 (for example) */ 538c80476e4SDavid E. O'Brien i = eventno + 1 + i; /* remember: i is < 0 */ 539c80476e4SDavid E. O'Brien for (; h; h = h->Hnext) { 540c80476e4SDavid E. O'Brien if (h->Hnum == i) 541c80476e4SDavid E. O'Brien break; 542c80476e4SDavid E. O'Brien } 543c80476e4SDavid E. O'Brien } 544c80476e4SDavid E. O'Brien else { 545c80476e4SDavid E. O'Brien for (i = (int) (q - p); h; h = h->Hnext) { 546c80476e4SDavid E. O'Brien if ((l = &h->Hlex) != 0) { 547c80476e4SDavid E. O'Brien if (!Strncmp(p + 1, l->next->word, (size_t) i)) 548c80476e4SDavid E. O'Brien break; 549c80476e4SDavid E. O'Brien } 550c80476e4SDavid E. O'Brien } 551c80476e4SDavid E. O'Brien } 552c80476e4SDavid E. O'Brien } 553c80476e4SDavid E. O'Brien if (!h) 554c80476e4SDavid E. O'Brien goto excl_err; 555c80476e4SDavid E. O'Brien if (q[1] == ':' || q[1] == '-' || q[1] == '*' || 556c80476e4SDavid E. O'Brien q[1] == '$' || q[1] == '^') { /* get some args */ 557c80476e4SDavid E. O'Brien p = q[1] == ':' ? ++q : q; 558c80476e4SDavid E. O'Brien /* 559c80476e4SDavid E. O'Brien * Go handle !foo:* 560c80476e4SDavid E. O'Brien */ 561c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') && 562c80476e4SDavid E. O'Brien q[1] != '-' && q[1] != '$' && q[1] != '^') 563c80476e4SDavid E. O'Brien goto excl_sw; 564c80476e4SDavid E. O'Brien /* 565c80476e4SDavid E. O'Brien * Go handle !foo:$ 566c80476e4SDavid E. O'Brien */ 567c80476e4SDavid E. O'Brien if (q[1] == '$' && (q[2] != '-' || q[3] < '0' || q[3] > '9')) 568c80476e4SDavid E. O'Brien goto excl_sw; 569c80476e4SDavid E. O'Brien /* 570c80476e4SDavid E. O'Brien * Count up the number of words in this event. Store it in dval. 571c80476e4SDavid E. O'Brien * Dval will be fed to number. 572c80476e4SDavid E. O'Brien */ 573c80476e4SDavid E. O'Brien dval = 0; 574c80476e4SDavid E. O'Brien if ((l = h->Hlex.prev) != 0) { 575c80476e4SDavid E. O'Brien for (l = l->prev; l != h->Hlex.next; l = l->prev, dval++) 576c80476e4SDavid E. O'Brien continue; 577c80476e4SDavid E. O'Brien } 578c80476e4SDavid E. O'Brien if (!dval) 579c80476e4SDavid E. O'Brien goto excl_err; 580c80476e4SDavid E. O'Brien if (q[1] == '-') 581c80476e4SDavid E. O'Brien from = 0; 582c80476e4SDavid E. O'Brien else 583c80476e4SDavid E. O'Brien q = c_number(q, &from, dval); 584c80476e4SDavid E. O'Brien if (q[1] == '-') { 585c80476e4SDavid E. O'Brien ++q; 586c80476e4SDavid E. O'Brien if ((q[1] < '0' || q[1] > '9') && q[1] != '$') 587c80476e4SDavid E. O'Brien to = dval - 1; 588c80476e4SDavid E. O'Brien else 589c80476e4SDavid E. O'Brien q = c_number(q, &to, dval); 590c80476e4SDavid E. O'Brien } 591c80476e4SDavid E. O'Brien else if (q[1] == '*') { 592c80476e4SDavid E. O'Brien ++q; 59345e5710bSMark Peek to = INT_MAX; 594c80476e4SDavid E. O'Brien } 595c80476e4SDavid E. O'Brien else { 596c80476e4SDavid E. O'Brien to = from; 597c80476e4SDavid E. O'Brien } 598c80476e4SDavid E. O'Brien if (from < 0 || to < from) 599c80476e4SDavid E. O'Brien goto excl_err; 60045e5710bSMark Peek buf = expand_lex(&h->Hlex, from, to); 601c80476e4SDavid E. O'Brien } 60245e5710bSMark Peek else /* get whole cmd */ 60345e5710bSMark Peek buf = expand_lex(&h->Hlex, 0, INT_MAX); 604c80476e4SDavid E. O'Brien break; 605c80476e4SDavid E. O'Brien } 60645e5710bSMark Peek if (buf == NULL) 60745e5710bSMark Peek buf = SAVE(""); 608c80476e4SDavid E. O'Brien 609c80476e4SDavid E. O'Brien /* 610c80476e4SDavid E. O'Brien * Apply modifiers, if any. 611c80476e4SDavid E. O'Brien */ 612c80476e4SDavid E. O'Brien if (q[1] == ':') { 61345e5710bSMark Peek modbuf = buf; 614c80476e4SDavid E. O'Brien while (q[1] == ':' && modbuf != NULL) { 615c80476e4SDavid E. O'Brien switch (q[2]) { 616c80476e4SDavid E. O'Brien case 'r': 617c80476e4SDavid E. O'Brien case 'e': 618c80476e4SDavid E. O'Brien case 'h': 619c80476e4SDavid E. O'Brien case 't': 620c80476e4SDavid E. O'Brien case 'q': 621c80476e4SDavid E. O'Brien case 'x': 622c80476e4SDavid E. O'Brien case 'u': 623c80476e4SDavid E. O'Brien case 'l': 62445e5710bSMark Peek if ((modbuf = domod(buf, (int) q[2])) != NULL) { 62545e5710bSMark Peek xfree(buf); 62645e5710bSMark Peek buf = modbuf; 627c80476e4SDavid E. O'Brien } 628c80476e4SDavid E. O'Brien ++q; 629c80476e4SDavid E. O'Brien break; 630c80476e4SDavid E. O'Brien 631c80476e4SDavid E. O'Brien case 'a': 632c80476e4SDavid E. O'Brien case 'g': 633c80476e4SDavid E. O'Brien /* Not implemented; this needs to be done before expanding 634c80476e4SDavid E. O'Brien * lex. We don't have the words available to us anymore. 635c80476e4SDavid E. O'Brien */ 636c80476e4SDavid E. O'Brien ++q; 637c80476e4SDavid E. O'Brien break; 638c80476e4SDavid E. O'Brien 639c80476e4SDavid E. O'Brien case 'p': 640c80476e4SDavid E. O'Brien /* Ok */ 641c80476e4SDavid E. O'Brien ++q; 642c80476e4SDavid E. O'Brien break; 643c80476e4SDavid E. O'Brien 644c80476e4SDavid E. O'Brien case '\0': 645c80476e4SDavid E. O'Brien break; 646c80476e4SDavid E. O'Brien 647c80476e4SDavid E. O'Brien default: 648c80476e4SDavid E. O'Brien ++q; 649c80476e4SDavid E. O'Brien break; 650c80476e4SDavid E. O'Brien } 651c80476e4SDavid E. O'Brien if (q[1]) 652c80476e4SDavid E. O'Brien ++q; 653c80476e4SDavid E. O'Brien } 654c80476e4SDavid E. O'Brien } 655c80476e4SDavid E. O'Brien 65645e5710bSMark Peek buf_len = Strlen(buf); 657c80476e4SDavid E. O'Brien /* 65845e5710bSMark Peek * Now replace the text from op to q inclusive with the text from buf. 659c80476e4SDavid E. O'Brien */ 660c80476e4SDavid E. O'Brien q++; 661c80476e4SDavid E. O'Brien 662c80476e4SDavid E. O'Brien /* 663c80476e4SDavid E. O'Brien * Now replace text non-inclusively like a real CS major! 664c80476e4SDavid E. O'Brien */ 66545e5710bSMark Peek if (LastChar + buf_len - (q - op) >= InputLim) 666c80476e4SDavid E. O'Brien goto excl_err; 66745e5710bSMark Peek (void) memmove(op + buf_len, q, (LastChar - q) * sizeof(Char)); 66845e5710bSMark Peek LastChar += buf_len - (q - op); 66945e5710bSMark Peek Cursor += buf_len - (q - op); 67045e5710bSMark Peek (void) memcpy(op, buf, buf_len * sizeof(Char)); 671c80476e4SDavid E. O'Brien *LastChar = '\0'; 67245e5710bSMark Peek xfree(buf); 67345e5710bSMark Peek return op + buf_len; 674c80476e4SDavid E. O'Brien excl_err: 67545e5710bSMark Peek xfree(buf); 676c80476e4SDavid E. O'Brien SoundBeep(); 677c80476e4SDavid E. O'Brien return(op + 1); 678c80476e4SDavid E. O'Brien } 679c80476e4SDavid E. O'Brien 680c80476e4SDavid E. O'Brien /* 681c80476e4SDavid E. O'Brien * c_excl: An excl has been found at point p -- back up and find some white 682c80476e4SDavid E. O'Brien * space (or the beginning of the buffer) and properly expand all the excl's 683c80476e4SDavid E. O'Brien * from there up to the current cursor position. We also avoid (trying to) 684c80476e4SDavid E. O'Brien * expanding '>!' 685a15e6f9aSMark Peek * Returns number of expansions attempted (doesn't matter whether they succeeded 686a15e6f9aSMark Peek * or not). 687c80476e4SDavid E. O'Brien */ 688c80476e4SDavid E. O'Brien 689a15e6f9aSMark Peek static int 69045e5710bSMark Peek c_excl(Char *p) 691c80476e4SDavid E. O'Brien { 6926767bd61SMark Peek int i; 6936767bd61SMark Peek Char *q; 694a15e6f9aSMark Peek int nr_exp; 695c80476e4SDavid E. O'Brien 696c80476e4SDavid E. O'Brien /* 697c80476e4SDavid E. O'Brien * if />[SPC TAB]*![SPC TAB]/, back up p to just after the >. otherwise, 698c80476e4SDavid E. O'Brien * back p up to just before the current word. 699c80476e4SDavid E. O'Brien */ 700c80476e4SDavid E. O'Brien if ((p[1] == ' ' || p[1] == '\t') && 701c80476e4SDavid E. O'Brien (p[-1] == ' ' || p[-1] == '\t' || p[-1] == '>')) { 702c80476e4SDavid E. O'Brien for (q = p - 1; q > InputBuf && (*q == ' ' || *q == '\t'); --q) 703c80476e4SDavid E. O'Brien continue; 704c80476e4SDavid E. O'Brien if (*q == '>') 705c80476e4SDavid E. O'Brien ++p; 706c80476e4SDavid E. O'Brien } 707c80476e4SDavid E. O'Brien else { 708c80476e4SDavid E. O'Brien while (*p != ' ' && *p != '\t' && p > InputBuf) 709c80476e4SDavid E. O'Brien --p; 710c80476e4SDavid E. O'Brien } 711c80476e4SDavid E. O'Brien 712c80476e4SDavid E. O'Brien /* 713c80476e4SDavid E. O'Brien * Forever: Look for history char. (Stop looking when we find the cursor.) 714a15e6f9aSMark Peek * Count backslashes. If odd, skip history char. Expand if even number of 715a15e6f9aSMark Peek * backslashes. 716c80476e4SDavid E. O'Brien */ 717a15e6f9aSMark Peek nr_exp = 0; 718c80476e4SDavid E. O'Brien for (;;) { 7199ccc37e3SMark Peek if (HIST != '\0') 720c80476e4SDavid E. O'Brien while (*p != HIST && p < Cursor) 721c80476e4SDavid E. O'Brien ++p; 722c80476e4SDavid E. O'Brien for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++) 723c80476e4SDavid E. O'Brien continue; 724c80476e4SDavid E. O'Brien if (i % 2 == 0) 725c80476e4SDavid E. O'Brien ++p; 726a15e6f9aSMark Peek if (p >= Cursor) /* all done */ 727a15e6f9aSMark Peek return nr_exp; 728a15e6f9aSMark Peek if (i % 2 == 1) { 729c80476e4SDavid E. O'Brien p = c_expand(p); 730a15e6f9aSMark Peek ++nr_exp; 731c80476e4SDavid E. O'Brien } 732c80476e4SDavid E. O'Brien } 733a15e6f9aSMark Peek } 734c80476e4SDavid E. O'Brien 735a15e6f9aSMark Peek 736a15e6f9aSMark Peek static int 73745e5710bSMark Peek c_substitute(void) 738c80476e4SDavid E. O'Brien { 7396767bd61SMark Peek Char *p; 740a15e6f9aSMark Peek int nr_exp; 741c80476e4SDavid E. O'Brien 742c80476e4SDavid E. O'Brien /* 743c80476e4SDavid E. O'Brien * Start p out one character before the cursor. Move it backwards looking 744c80476e4SDavid E. O'Brien * for white space, the beginning of the line, or a history character. 745c80476e4SDavid E. O'Brien */ 746c80476e4SDavid E. O'Brien for (p = Cursor - 1; 7479ccc37e3SMark Peek p > InputBuf && *p != ' ' && *p != '\t' && *p && *p != HIST; --p) 748c80476e4SDavid E. O'Brien continue; 749c80476e4SDavid E. O'Brien 750c80476e4SDavid E. O'Brien /* 751c80476e4SDavid E. O'Brien * If we found a history character, go expand it. 752c80476e4SDavid E. O'Brien */ 753*55b903e2SDmitry Chagin if (p >= InputBuf && HIST != '\0' && *p == HIST) 754a15e6f9aSMark Peek nr_exp = c_excl(p); 755a15e6f9aSMark Peek else 756a15e6f9aSMark Peek nr_exp = 0; 757c80476e4SDavid E. O'Brien Refresh(); 758a15e6f9aSMark Peek 759a15e6f9aSMark Peek return nr_exp; 760c80476e4SDavid E. O'Brien } 761c80476e4SDavid E. O'Brien 762c80476e4SDavid E. O'Brien static void 76345e5710bSMark Peek c_delfini(void) /* Finish up delete action */ 764c80476e4SDavid E. O'Brien { 7656767bd61SMark Peek int Size; 766c80476e4SDavid E. O'Brien 767c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_INSERT) 768c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 769c80476e4SDavid E. O'Brien 770c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 771c80476e4SDavid E. O'Brien 772c80476e4SDavid E. O'Brien if (ActionPos == 0) 773c80476e4SDavid E. O'Brien return; 774c80476e4SDavid E. O'Brien 775c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 776c80476e4SDavid E. O'Brien 777c80476e4SDavid E. O'Brien if (Cursor > ActionPos) { 778c80476e4SDavid E. O'Brien Size = (int) (Cursor-ActionPos); 779c80476e4SDavid E. O'Brien c_delbefore(Size); 780c80476e4SDavid E. O'Brien RefCursor(); 781c80476e4SDavid E. O'Brien } 782c80476e4SDavid E. O'Brien else if (Cursor < ActionPos) { 783c80476e4SDavid E. O'Brien Size = (int)(ActionPos-Cursor); 784c80476e4SDavid E. O'Brien c_delafter(Size); 785c80476e4SDavid E. O'Brien } 786c80476e4SDavid E. O'Brien else { 787c80476e4SDavid E. O'Brien Size = 1; 788c80476e4SDavid E. O'Brien c_delafter(Size); 789c80476e4SDavid E. O'Brien } 790c80476e4SDavid E. O'Brien UndoPtr = Cursor; 791c80476e4SDavid E. O'Brien UndoSize = Size; 792c80476e4SDavid E. O'Brien } 793c80476e4SDavid E. O'Brien 794c80476e4SDavid E. O'Brien static Char * 79545e5710bSMark Peek c_endword(Char *p, Char *high, int n, Char *delim) 796c80476e4SDavid E. O'Brien { 79723338178SMark Peek Char inquote = 0; 798c80476e4SDavid E. O'Brien p++; 799c80476e4SDavid E. O'Brien 800c80476e4SDavid E. O'Brien while (n--) { 8016767bd61SMark Peek while (p < high) { /* Skip non-word chars */ 8026767bd61SMark Peek if (!Strchr(delim, *p) || *(p-1) == (Char)'\\') 803c80476e4SDavid E. O'Brien break; 804c80476e4SDavid E. O'Brien p++; 805c80476e4SDavid E. O'Brien } 806c80476e4SDavid E. O'Brien while (p < high) { /* Skip string */ 807c80476e4SDavid E. O'Brien if ((*p == (Char)'\'' || *p == (Char)'"')) { /* Quotation marks? */ 8086767bd61SMark Peek if (inquote || *(p-1) != (Char)'\\') { /* Should it be honored? */ 809c80476e4SDavid E. O'Brien if (inquote == 0) inquote = *p; 810c80476e4SDavid E. O'Brien else if (inquote == *p) inquote = 0; 811c80476e4SDavid E. O'Brien } 812c80476e4SDavid E. O'Brien } 8136767bd61SMark Peek /* Break if unquoted non-word char */ 8146767bd61SMark Peek if (!inquote && Strchr(delim, *p) && *(p-1) != (Char)'\\') 815c80476e4SDavid E. O'Brien break; 816c80476e4SDavid E. O'Brien p++; 817c80476e4SDavid E. O'Brien } 818c80476e4SDavid E. O'Brien } 819c80476e4SDavid E. O'Brien 820c80476e4SDavid E. O'Brien p--; 821c80476e4SDavid E. O'Brien return(p); 822c80476e4SDavid E. O'Brien } 823c80476e4SDavid E. O'Brien 824c80476e4SDavid E. O'Brien 825c80476e4SDavid E. O'Brien static Char * 82645e5710bSMark Peek c_eword(Char *p, Char *high, int n) 827c80476e4SDavid E. O'Brien { 828c80476e4SDavid E. O'Brien p++; 829c80476e4SDavid E. O'Brien 830c80476e4SDavid E. O'Brien while (n--) { 83119d2e3deSDmitry Chagin int c_class; 83219d2e3deSDmitry Chagin 83319d2e3deSDmitry Chagin if (p >= high) 83419d2e3deSDmitry Chagin break; 83519d2e3deSDmitry Chagin 83619d2e3deSDmitry Chagin /* scan until end of current word (may be all whitespace!) */ 83719d2e3deSDmitry Chagin c_class = c_to_class(*p); 83819d2e3deSDmitry Chagin while ((p < high) && c_class == c_to_class(*p)) 839c80476e4SDavid E. O'Brien p++; 840c80476e4SDavid E. O'Brien 84119d2e3deSDmitry Chagin /* if this was a non_whitespace word, we're ready */ 84219d2e3deSDmitry Chagin if (c_class != C_CLASS_WHITE) 84319d2e3deSDmitry Chagin continue; 84419d2e3deSDmitry Chagin 84519d2e3deSDmitry Chagin /* otherwise, move to the end of the word just found */ 84619d2e3deSDmitry Chagin c_class = c_to_class(*p); 84719d2e3deSDmitry Chagin while ((p < high) && c_class == c_to_class(*p)) 848c80476e4SDavid E. O'Brien p++; 849c80476e4SDavid E. O'Brien } 850c80476e4SDavid E. O'Brien 851c80476e4SDavid E. O'Brien p--; 852c80476e4SDavid E. O'Brien return(p); 853c80476e4SDavid E. O'Brien } 854c80476e4SDavid E. O'Brien 8556767bd61SMark Peek /* Set the max length of the kill ring */ 8566767bd61SMark Peek void 85745e5710bSMark Peek SetKillRing(int max) 8586767bd61SMark Peek { 8596767bd61SMark Peek CStr *new; 8606767bd61SMark Peek int count, i, j; 8616767bd61SMark Peek 8626767bd61SMark Peek if (max < 1) 8636767bd61SMark Peek max = 1; /* no ring, but always one buffer */ 8646767bd61SMark Peek if (max == KillRingMax) 8656767bd61SMark Peek return; 86645e5710bSMark Peek new = xcalloc(max, sizeof(CStr)); 8676767bd61SMark Peek if (KillRing != NULL) { 8686767bd61SMark Peek if (KillRingLen != 0) { 8696767bd61SMark Peek if (max >= KillRingLen) { 8706767bd61SMark Peek count = KillRingLen; 8716767bd61SMark Peek j = KillPos; 8726767bd61SMark Peek } else { 8736767bd61SMark Peek count = max; 8746767bd61SMark Peek j = (KillPos - count + KillRingLen) % KillRingLen; 8756767bd61SMark Peek } 8766767bd61SMark Peek for (i = 0; i < KillRingLen; i++) { 8776767bd61SMark Peek if (i < count) /* copy latest */ 8786767bd61SMark Peek new[i] = KillRing[j]; 8796767bd61SMark Peek else /* free the others */ 8806767bd61SMark Peek xfree(KillRing[j].buf); 8816767bd61SMark Peek j = (j + 1) % KillRingLen; 8826767bd61SMark Peek } 8836767bd61SMark Peek KillRingLen = count; 8846767bd61SMark Peek KillPos = count % max; 8856767bd61SMark Peek YankPos = count - 1; 8866767bd61SMark Peek } 8876767bd61SMark Peek xfree(KillRing); 8886767bd61SMark Peek } 8896767bd61SMark Peek KillRing = new; 8906767bd61SMark Peek KillRingMax = max; 8916767bd61SMark Peek } 8926767bd61SMark Peek 8936767bd61SMark Peek /* Push string from start upto (but not including) end onto kill ring */ 8946767bd61SMark Peek static void 89545e5710bSMark Peek c_push_kill(Char *start, Char *end) 8966767bd61SMark Peek { 8976767bd61SMark Peek CStr save, *pos; 8986767bd61SMark Peek Char *dp, *cp, *kp; 8996767bd61SMark Peek int len = end - start, i, j, k; 9006767bd61SMark Peek 9016767bd61SMark Peek /* Check for duplicates? */ 9026767bd61SMark Peek if (KillRingLen > 0 && (dp = varval(STRkilldup)) != STRNULL) { 9036767bd61SMark Peek YankPos = (KillPos - 1 + KillRingLen) % KillRingLen; 9046767bd61SMark Peek if (eq(dp, STRerase)) { /* erase earlier one (actually move up) */ 9056767bd61SMark Peek j = YankPos; 9066767bd61SMark Peek for (i = 0; i < KillRingLen; i++) { 9076767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 && 9086767bd61SMark Peek KillRing[j].buf[len] == '\0') { 9096767bd61SMark Peek save = KillRing[j]; 9106767bd61SMark Peek for ( ; i > 0; i--) { 9116767bd61SMark Peek k = j; 9126767bd61SMark Peek j = (j + 1) % KillRingLen; 9136767bd61SMark Peek KillRing[k] = KillRing[j]; 9146767bd61SMark Peek } 9156767bd61SMark Peek KillRing[j] = save; 9166767bd61SMark Peek return; 9176767bd61SMark Peek } 9186767bd61SMark Peek j = (j - 1 + KillRingLen) % KillRingLen; 9196767bd61SMark Peek } 9206767bd61SMark Peek } else if (eq(dp, STRall)) { /* skip if any earlier */ 9216767bd61SMark Peek for (i = 0; i < KillRingLen; i++) 9226767bd61SMark Peek if (Strncmp(KillRing[i].buf, start, (size_t) len) == 0 && 9236767bd61SMark Peek KillRing[i].buf[len] == '\0') 9246767bd61SMark Peek return; 9256767bd61SMark Peek } else if (eq(dp, STRprev)) { /* skip if immediately previous */ 9266767bd61SMark Peek j = YankPos; 9276767bd61SMark Peek if (Strncmp(KillRing[j].buf, start, (size_t) len) == 0 && 9286767bd61SMark Peek KillRing[j].buf[len] == '\0') 9296767bd61SMark Peek return; 9306767bd61SMark Peek } 9316767bd61SMark Peek } 9326767bd61SMark Peek 9336767bd61SMark Peek /* No duplicate, go ahead and push */ 9346767bd61SMark Peek len++; /* need space for '\0' */ 9356767bd61SMark Peek YankPos = KillPos; 9366767bd61SMark Peek if (KillRingLen < KillRingMax) 9376767bd61SMark Peek KillRingLen++; 9386767bd61SMark Peek pos = &KillRing[KillPos]; 9396767bd61SMark Peek KillPos = (KillPos + 1) % KillRingMax; 9406767bd61SMark Peek if (pos->len < len) { 94145e5710bSMark Peek pos->buf = xrealloc(pos->buf, len * sizeof(Char)); 9426767bd61SMark Peek pos->len = len; 9436767bd61SMark Peek } 9446767bd61SMark Peek cp = start; 9456767bd61SMark Peek kp = pos->buf; 9466767bd61SMark Peek while (cp < end) 9476767bd61SMark Peek *kp++ = *cp++; 9486767bd61SMark Peek *kp = '\0'; 9496767bd61SMark Peek } 9506767bd61SMark Peek 95145e5710bSMark Peek /* Save InputBuf etc in SavedBuf etc for restore after cmd exec */ 95245e5710bSMark Peek static void 95319d2e3deSDmitry Chagin c_save_inputbuf(void) 95445e5710bSMark Peek { 95545e5710bSMark Peek SavedBuf.len = 0; 95645e5710bSMark Peek Strbuf_append(&SavedBuf, InputBuf); 95745e5710bSMark Peek Strbuf_terminate(&SavedBuf); 95845e5710bSMark Peek LastSaved = LastChar - InputBuf; 95945e5710bSMark Peek CursSaved = Cursor - InputBuf; 96045e5710bSMark Peek HistSaved = Hist_num; 96145e5710bSMark Peek RestoreSaved = 1; 96245e5710bSMark Peek } 96345e5710bSMark Peek 96445e5710bSMark Peek CCRETVAL 96519d2e3deSDmitry Chagin GetHistLine(void) 966c80476e4SDavid E. O'Brien { 967c80476e4SDavid E. O'Brien struct Hist *hp; 968c80476e4SDavid E. O'Brien int h; 969c80476e4SDavid E. O'Brien 970c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* if really the current line */ 97145e5710bSMark Peek if (HistBuf.s != NULL) 97245e5710bSMark Peek copyn(InputBuf, HistBuf.s, INBUFSIZE);/*FIXBUF*/ 97345e5710bSMark Peek else 97445e5710bSMark Peek *InputBuf = '\0'; 97545e5710bSMark Peek LastChar = InputBuf + HistBuf.len; 976c80476e4SDavid E. O'Brien 977c80476e4SDavid E. O'Brien #ifdef KSHVI 978c80476e4SDavid E. O'Brien if (VImode) 979c80476e4SDavid E. O'Brien Cursor = InputBuf; 980c80476e4SDavid E. O'Brien else 981c80476e4SDavid E. O'Brien #endif /* KSHVI */ 982c80476e4SDavid E. O'Brien Cursor = LastChar; 983c80476e4SDavid E. O'Brien 984c80476e4SDavid E. O'Brien return(CC_REFRESH); 985c80476e4SDavid E. O'Brien } 986c80476e4SDavid E. O'Brien 987c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 988c80476e4SDavid E. O'Brien if (hp == NULL) 989c80476e4SDavid E. O'Brien return(CC_ERROR); 990c80476e4SDavid E. O'Brien 991c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++) { 992c80476e4SDavid E. O'Brien if ((hp->Hnext) == NULL) { 993c80476e4SDavid E. O'Brien Hist_num = h; 994c80476e4SDavid E. O'Brien return(CC_ERROR); 995c80476e4SDavid E. O'Brien } 996c80476e4SDavid E. O'Brien hp = hp->Hnext; 997c80476e4SDavid E. O'Brien } 998c80476e4SDavid E. O'Brien 999c80476e4SDavid E. O'Brien if (HistLit && hp->histline) { 100045e5710bSMark Peek copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/ 1001c80476e4SDavid E. O'Brien CurrentHistLit = 1; 1002c80476e4SDavid E. O'Brien } 1003c80476e4SDavid E. O'Brien else { 100445e5710bSMark Peek Char *p; 100545e5710bSMark Peek 100645e5710bSMark Peek p = sprlex(&hp->Hlex); 100745e5710bSMark Peek copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/ 100845e5710bSMark Peek xfree(p); 1009c80476e4SDavid E. O'Brien CurrentHistLit = 0; 1010c80476e4SDavid E. O'Brien } 101145e5710bSMark Peek LastChar = Strend(InputBuf); 1012c80476e4SDavid E. O'Brien 1013c80476e4SDavid E. O'Brien if (LastChar > InputBuf) { 1014c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n') 1015c80476e4SDavid E. O'Brien LastChar--; 1016c80476e4SDavid E. O'Brien #if 0 1017c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ') 1018c80476e4SDavid E. O'Brien LastChar--; 1019c80476e4SDavid E. O'Brien #endif 1020c80476e4SDavid E. O'Brien if (LastChar < InputBuf) 1021c80476e4SDavid E. O'Brien LastChar = InputBuf; 1022c80476e4SDavid E. O'Brien } 1023c80476e4SDavid E. O'Brien 1024c80476e4SDavid E. O'Brien #ifdef KSHVI 1025c80476e4SDavid E. O'Brien if (VImode) 1026c80476e4SDavid E. O'Brien Cursor = InputBuf; 1027c80476e4SDavid E. O'Brien else 1028c80476e4SDavid E. O'Brien #endif /* KSHVI */ 1029c80476e4SDavid E. O'Brien Cursor = LastChar; 1030c80476e4SDavid E. O'Brien 1031c80476e4SDavid E. O'Brien return(CC_REFRESH); 1032c80476e4SDavid E. O'Brien } 1033c80476e4SDavid E. O'Brien 1034c80476e4SDavid E. O'Brien static CCRETVAL 103545e5710bSMark Peek c_search_line(Char *pattern, int dir) 1036c80476e4SDavid E. O'Brien { 1037c80476e4SDavid E. O'Brien Char *cp; 103845e5710bSMark Peek size_t len; 1039c80476e4SDavid E. O'Brien 104045e5710bSMark Peek len = Strlen(pattern); 1041c80476e4SDavid E. O'Brien 1042c80476e4SDavid E. O'Brien if (dir == F_UP_SEARCH_HIST) { 1043c80476e4SDavid E. O'Brien for (cp = Cursor; cp >= InputBuf; cp--) 104445e5710bSMark Peek if (Strncmp(cp, pattern, len) == 0 || 1045c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) { 1046c80476e4SDavid E. O'Brien Cursor = cp; 1047c80476e4SDavid E. O'Brien return(CC_NORM); 1048c80476e4SDavid E. O'Brien } 1049c80476e4SDavid E. O'Brien return(CC_ERROR); 1050c80476e4SDavid E. O'Brien } else { 1051c80476e4SDavid E. O'Brien for (cp = Cursor; *cp != '\0' && cp < InputLim; cp++) 105245e5710bSMark Peek if (Strncmp(cp, pattern, len) == 0 || 1053c80476e4SDavid E. O'Brien Gmatch(cp, pattern)) { 1054c80476e4SDavid E. O'Brien Cursor = cp; 1055c80476e4SDavid E. O'Brien return(CC_NORM); 1056c80476e4SDavid E. O'Brien } 1057c80476e4SDavid E. O'Brien return(CC_ERROR); 1058c80476e4SDavid E. O'Brien } 1059c80476e4SDavid E. O'Brien } 1060c80476e4SDavid E. O'Brien 1061c80476e4SDavid E. O'Brien static CCRETVAL 106245e5710bSMark Peek e_inc_search(int dir) 1063c80476e4SDavid E. O'Brien { 106445e5710bSMark Peek static const Char STRfwd[] = { 'f', 'w', 'd', '\0' }, 1065c80476e4SDavid E. O'Brien STRbck[] = { 'b', 'c', 'k', '\0' }; 1066c80476e4SDavid E. O'Brien static Char pchar = ':'; /* ':' = normal, '?' = failed */ 1067c80476e4SDavid E. O'Brien static Char endcmd[2]; 106845e5710bSMark Peek const Char *cp; 106945e5710bSMark Peek Char ch, 1070c80476e4SDavid E. O'Brien *oldCursor = Cursor, 1071c80476e4SDavid E. O'Brien oldpchar = pchar; 1072c80476e4SDavid E. O'Brien CCRETVAL ret = CC_NORM; 1073c80476e4SDavid E. O'Brien int oldHist_num = Hist_num, 107445e5710bSMark Peek oldpatlen = patbuf.len, 1075c80476e4SDavid E. O'Brien newdir = dir, 1076c80476e4SDavid E. O'Brien done, redo; 1077c80476e4SDavid E. O'Brien 107845e5710bSMark Peek if (LastChar + sizeof(STRfwd)/sizeof(Char) + 2 + patbuf.len >= InputLim) 1079c80476e4SDavid E. O'Brien return(CC_ERROR); 1080c80476e4SDavid E. O'Brien 1081c80476e4SDavid E. O'Brien for (;;) { 1082c80476e4SDavid E. O'Brien 108345e5710bSMark Peek if (patbuf.len == 0) { /* first round */ 1084c80476e4SDavid E. O'Brien pchar = ':'; 108545e5710bSMark Peek Strbuf_append1(&patbuf, '*'); 1086c80476e4SDavid E. O'Brien } 1087c80476e4SDavid E. O'Brien done = redo = 0; 1088c80476e4SDavid E. O'Brien *LastChar++ = '\n'; 1089c80476e4SDavid E. O'Brien for (cp = newdir == F_UP_SEARCH_HIST ? STRbck : STRfwd; 1090c80476e4SDavid E. O'Brien *cp; *LastChar++ = *cp++) 1091c80476e4SDavid E. O'Brien continue; 1092c80476e4SDavid E. O'Brien *LastChar++ = pchar; 109345e5710bSMark Peek for (cp = &patbuf.s[1]; cp < &patbuf.s[patbuf.len]; 109445e5710bSMark Peek *LastChar++ = *cp++) 1095c80476e4SDavid E. O'Brien continue; 1096c80476e4SDavid E. O'Brien *LastChar = '\0'; 109745e5710bSMark Peek if (adrof(STRhighlight) && pchar == ':') { 109845e5710bSMark Peek /* if the no-glob-search patch is applied, remove the - 1 below */ 109945e5710bSMark Peek IncMatchLen = patbuf.len - 1; 110045e5710bSMark Peek ClearLines(); 110145e5710bSMark Peek ClearDisp(); 110245e5710bSMark Peek } 1103c80476e4SDavid E. O'Brien Refresh(); 1104c80476e4SDavid E. O'Brien 1105c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 1106c80476e4SDavid E. O'Brien return(e_send_eof(0)); 1107c80476e4SDavid E. O'Brien 110823338178SMark Peek switch (ch > NT_NUM_KEYS 110923338178SMark Peek ? F_INSERT : CurrentKeyMap[(unsigned char) ch]) { 1110c80476e4SDavid E. O'Brien case F_INSERT: 1111c80476e4SDavid E. O'Brien case F_DIGIT: 1112c80476e4SDavid E. O'Brien case F_MAGIC_SPACE: 111345e5710bSMark Peek if (LastChar + 1 >= InputLim) /*FIXBUF*/ 1114c80476e4SDavid E. O'Brien SoundBeep(); 1115c80476e4SDavid E. O'Brien else { 111645e5710bSMark Peek Strbuf_append1(&patbuf, ch); 1117c80476e4SDavid E. O'Brien *LastChar++ = ch; 1118c80476e4SDavid E. O'Brien *LastChar = '\0'; 1119c80476e4SDavid E. O'Brien Refresh(); 1120c80476e4SDavid E. O'Brien } 1121c80476e4SDavid E. O'Brien break; 1122c80476e4SDavid E. O'Brien 1123c80476e4SDavid E. O'Brien case F_INC_FWD: 1124c80476e4SDavid E. O'Brien newdir = F_DOWN_SEARCH_HIST; 1125c80476e4SDavid E. O'Brien redo++; 1126c80476e4SDavid E. O'Brien break; 1127c80476e4SDavid E. O'Brien 1128c80476e4SDavid E. O'Brien case F_INC_BACK: 1129c80476e4SDavid E. O'Brien newdir = F_UP_SEARCH_HIST; 1130c80476e4SDavid E. O'Brien redo++; 1131c80476e4SDavid E. O'Brien break; 1132c80476e4SDavid E. O'Brien 1133c80476e4SDavid E. O'Brien case F_DELPREV: 113445e5710bSMark Peek if (patbuf.len > 1) 1135c80476e4SDavid E. O'Brien done++; 1136c80476e4SDavid E. O'Brien else 1137c80476e4SDavid E. O'Brien SoundBeep(); 1138c80476e4SDavid E. O'Brien break; 1139c80476e4SDavid E. O'Brien 1140c80476e4SDavid E. O'Brien default: 114145e5710bSMark Peek switch (ASC(ch)) { 1142c80476e4SDavid E. O'Brien case 0007: /* ^G: Abort */ 1143c80476e4SDavid E. O'Brien ret = CC_ERROR; 1144c80476e4SDavid E. O'Brien done++; 1145c80476e4SDavid E. O'Brien break; 1146c80476e4SDavid E. O'Brien 1147c80476e4SDavid E. O'Brien case 0027: /* ^W: Append word */ 1148c80476e4SDavid E. O'Brien /* No can do if globbing characters in pattern */ 114945e5710bSMark Peek for (cp = &patbuf.s[1]; ; cp++) 115045e5710bSMark Peek if (cp >= &patbuf.s[patbuf.len]) { 115145e5710bSMark Peek Cursor += patbuf.len - 1; 1152c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, 1); 1153c80476e4SDavid E. O'Brien while (Cursor < cp && *Cursor != '\n') { 115445e5710bSMark Peek if (LastChar + 1 >= InputLim) {/*FIXBUF*/ 1155c80476e4SDavid E. O'Brien SoundBeep(); 1156c80476e4SDavid E. O'Brien break; 1157c80476e4SDavid E. O'Brien } 115845e5710bSMark Peek Strbuf_append1(&patbuf, *Cursor); 1159c80476e4SDavid E. O'Brien *LastChar++ = *Cursor++; 1160c80476e4SDavid E. O'Brien } 1161c80476e4SDavid E. O'Brien Cursor = oldCursor; 1162c80476e4SDavid E. O'Brien *LastChar = '\0'; 1163c80476e4SDavid E. O'Brien Refresh(); 1164c80476e4SDavid E. O'Brien break; 1165c80476e4SDavid E. O'Brien } else if (isglob(*cp)) { 1166c80476e4SDavid E. O'Brien SoundBeep(); 1167c80476e4SDavid E. O'Brien break; 1168c80476e4SDavid E. O'Brien } 1169c80476e4SDavid E. O'Brien break; 1170c80476e4SDavid E. O'Brien 1171c80476e4SDavid E. O'Brien default: /* Terminate and execute cmd */ 1172c80476e4SDavid E. O'Brien endcmd[0] = ch; 1173c80476e4SDavid E. O'Brien PushMacro(endcmd); 1174c80476e4SDavid E. O'Brien /*FALLTHROUGH*/ 1175c80476e4SDavid E. O'Brien 1176c80476e4SDavid E. O'Brien case 0033: /* ESC: Terminate */ 1177c80476e4SDavid E. O'Brien ret = CC_REFRESH; 1178c80476e4SDavid E. O'Brien done++; 1179c80476e4SDavid E. O'Brien break; 1180c80476e4SDavid E. O'Brien } 1181c80476e4SDavid E. O'Brien break; 1182c80476e4SDavid E. O'Brien } 1183c80476e4SDavid E. O'Brien 1184c80476e4SDavid E. O'Brien while (LastChar > InputBuf && *LastChar != '\n') 1185c80476e4SDavid E. O'Brien *LastChar-- = '\0'; 1186c80476e4SDavid E. O'Brien *LastChar = '\0'; 1187c80476e4SDavid E. O'Brien 1188c80476e4SDavid E. O'Brien if (!done) { 1189c80476e4SDavid E. O'Brien 1190c80476e4SDavid E. O'Brien /* Can't search if unmatched '[' */ 119145e5710bSMark Peek for (cp = &patbuf.s[patbuf.len - 1], ch = ']'; cp > patbuf.s; cp--) 1192c80476e4SDavid E. O'Brien if (*cp == '[' || *cp == ']') { 1193c80476e4SDavid E. O'Brien ch = *cp; 1194c80476e4SDavid E. O'Brien break; 1195c80476e4SDavid E. O'Brien } 1196c80476e4SDavid E. O'Brien 119745e5710bSMark Peek if (patbuf.len > 1 && ch != '[') { 1198c80476e4SDavid E. O'Brien if (redo && newdir == dir) { 1199c80476e4SDavid E. O'Brien if (pchar == '?') { /* wrap around */ 120045e5710bSMark Peek Hist_num = newdir == F_UP_SEARCH_HIST ? 0 : INT_MAX; 120145e5710bSMark Peek if (GetHistLine() == CC_ERROR) 1202c80476e4SDavid E. O'Brien /* Hist_num was fixed by first call */ 120345e5710bSMark Peek (void) GetHistLine(); 1204c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ? 1205c80476e4SDavid E. O'Brien LastChar : InputBuf; 1206c80476e4SDavid E. O'Brien } else 1207c80476e4SDavid E. O'Brien Cursor += newdir == F_UP_SEARCH_HIST ? -1 : 1; 1208c80476e4SDavid E. O'Brien } 120945e5710bSMark Peek Strbuf_append1(&patbuf, '*'); 121045e5710bSMark Peek Strbuf_terminate(&patbuf); 1211c80476e4SDavid E. O'Brien if (Cursor < InputBuf || Cursor > LastChar || 121245e5710bSMark Peek (ret = c_search_line(&patbuf.s[1], newdir)) == CC_ERROR) { 1213c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) newdir; /* avoid c_hsetpat */ 1214c80476e4SDavid E. O'Brien ret = newdir == F_UP_SEARCH_HIST ? 1215c80476e4SDavid E. O'Brien e_up_search_hist(0) : e_down_search_hist(0); 1216c80476e4SDavid E. O'Brien if (ret != CC_ERROR) { 1217c80476e4SDavid E. O'Brien Cursor = newdir == F_UP_SEARCH_HIST ? 1218c80476e4SDavid E. O'Brien LastChar : InputBuf; 121945e5710bSMark Peek (void) c_search_line(&patbuf.s[1], newdir); 1220c80476e4SDavid E. O'Brien } 1221c80476e4SDavid E. O'Brien } 122245e5710bSMark Peek patbuf.s[--patbuf.len] = '\0'; 1223c80476e4SDavid E. O'Brien if (ret == CC_ERROR) { 1224c80476e4SDavid E. O'Brien SoundBeep(); 1225c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) { 1226c80476e4SDavid E. O'Brien Hist_num = oldHist_num; 122745e5710bSMark Peek if (GetHistLine() == CC_ERROR) 1228c80476e4SDavid E. O'Brien return(CC_ERROR); 1229c80476e4SDavid E. O'Brien } 1230c80476e4SDavid E. O'Brien Cursor = oldCursor; 1231c80476e4SDavid E. O'Brien pchar = '?'; 1232c80476e4SDavid E. O'Brien } else { 1233c80476e4SDavid E. O'Brien pchar = ':'; 1234c80476e4SDavid E. O'Brien } 1235c80476e4SDavid E. O'Brien } 1236c80476e4SDavid E. O'Brien 1237c80476e4SDavid E. O'Brien ret = e_inc_search(newdir); 1238c80476e4SDavid E. O'Brien 1239c80476e4SDavid E. O'Brien if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') { 1240c80476e4SDavid E. O'Brien /* break abort of failed search at last non-failed */ 1241c80476e4SDavid E. O'Brien ret = CC_NORM; 1242c80476e4SDavid E. O'Brien } 1243c80476e4SDavid E. O'Brien 1244c80476e4SDavid E. O'Brien } 1245c80476e4SDavid E. O'Brien 1246c80476e4SDavid E. O'Brien if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { 1247c80476e4SDavid E. O'Brien /* restore on normal return or error exit */ 1248c80476e4SDavid E. O'Brien pchar = oldpchar; 124945e5710bSMark Peek patbuf.len = oldpatlen; 1250c80476e4SDavid E. O'Brien if (Hist_num != oldHist_num) { 1251c80476e4SDavid E. O'Brien Hist_num = oldHist_num; 125245e5710bSMark Peek if (GetHistLine() == CC_ERROR) 1253c80476e4SDavid E. O'Brien return(CC_ERROR); 1254c80476e4SDavid E. O'Brien } 1255c80476e4SDavid E. O'Brien Cursor = oldCursor; 1256c80476e4SDavid E. O'Brien if (ret == CC_ERROR) 1257c80476e4SDavid E. O'Brien Refresh(); 1258c80476e4SDavid E. O'Brien } 1259c80476e4SDavid E. O'Brien if (done || ret != CC_NORM) 1260c80476e4SDavid E. O'Brien return(ret); 1261c80476e4SDavid E. O'Brien 1262c80476e4SDavid E. O'Brien } 1263c80476e4SDavid E. O'Brien 1264c80476e4SDavid E. O'Brien } 1265c80476e4SDavid E. O'Brien 1266c80476e4SDavid E. O'Brien static CCRETVAL 126745e5710bSMark Peek v_search(int dir) 1268c80476e4SDavid E. O'Brien { 126945e5710bSMark Peek struct Strbuf tmpbuf = Strbuf_INIT; 1270c80476e4SDavid E. O'Brien Char ch; 127145e5710bSMark Peek Char *oldbuf; 1272c80476e4SDavid E. O'Brien Char *oldlc, *oldc; 1273c80476e4SDavid E. O'Brien 127445e5710bSMark Peek cleanup_push(&tmpbuf, Strbuf_cleanup); 127545e5710bSMark Peek oldbuf = Strsave(InputBuf); 127645e5710bSMark Peek cleanup_push(oldbuf, xfree); 1277c80476e4SDavid E. O'Brien oldlc = LastChar; 1278c80476e4SDavid E. O'Brien oldc = Cursor; 127945e5710bSMark Peek Strbuf_append1(&tmpbuf, '*'); 1280c80476e4SDavid E. O'Brien 1281c80476e4SDavid E. O'Brien InputBuf[0] = '\0'; 1282c80476e4SDavid E. O'Brien LastChar = InputBuf; 1283c80476e4SDavid E. O'Brien Cursor = InputBuf; 1284c80476e4SDavid E. O'Brien searchdir = dir; 1285c80476e4SDavid E. O'Brien 1286c80476e4SDavid E. O'Brien c_insert(2); /* prompt + '\n' */ 1287c80476e4SDavid E. O'Brien *Cursor++ = '\n'; 1288c80476e4SDavid E. O'Brien *Cursor++ = dir == F_UP_SEARCH_HIST ? '?' : '/'; 1289c80476e4SDavid E. O'Brien Refresh(); 1290c80476e4SDavid E. O'Brien for (ch = 0;ch == 0;) { 129145e5710bSMark Peek if (GetNextChar(&ch) != 1) { 129245e5710bSMark Peek cleanup_until(&tmpbuf); 1293c80476e4SDavid E. O'Brien return(e_send_eof(0)); 129445e5710bSMark Peek } 1295c80476e4SDavid E. O'Brien switch (ASC(ch)) { 1296c80476e4SDavid E. O'Brien case 0010: /* Delete and backspace */ 1297c80476e4SDavid E. O'Brien case 0177: 129845e5710bSMark Peek if (tmpbuf.len > 1) { 1299c80476e4SDavid E. O'Brien *Cursor-- = '\0'; 1300c80476e4SDavid E. O'Brien LastChar = Cursor; 130145e5710bSMark Peek tmpbuf.len--; 1302c80476e4SDavid E. O'Brien } 1303c80476e4SDavid E. O'Brien else { 130445e5710bSMark Peek copyn(InputBuf, oldbuf, INBUFSIZE);/*FIXBUF*/ 1305c80476e4SDavid E. O'Brien LastChar = oldlc; 1306c80476e4SDavid E. O'Brien Cursor = oldc; 130745e5710bSMark Peek cleanup_until(&tmpbuf); 1308c80476e4SDavid E. O'Brien return(CC_REFRESH); 1309c80476e4SDavid E. O'Brien } 1310c80476e4SDavid E. O'Brien Refresh(); 1311c80476e4SDavid E. O'Brien ch = 0; 1312c80476e4SDavid E. O'Brien break; 1313c80476e4SDavid E. O'Brien 1314c80476e4SDavid E. O'Brien case 0033: /* ESC */ 13153b6eaa7bSAndrey A. Chernov #ifdef IS_ASCII 1316c80476e4SDavid E. O'Brien case '\r': /* Newline */ 1317c80476e4SDavid E. O'Brien case '\n': 1318c80476e4SDavid E. O'Brien #else 13193b6eaa7bSAndrey A. Chernov case '\012': /* ASCII Line feed */ 13203b6eaa7bSAndrey A. Chernov case '\015': /* ASCII (or EBCDIC) Return */ 1321c80476e4SDavid E. O'Brien #endif 1322c80476e4SDavid E. O'Brien break; 1323c80476e4SDavid E. O'Brien 1324c80476e4SDavid E. O'Brien default: 132545e5710bSMark Peek Strbuf_append1(&tmpbuf, ch); 1326c80476e4SDavid E. O'Brien *Cursor++ = ch; 1327c80476e4SDavid E. O'Brien LastChar = Cursor; 1328c80476e4SDavid E. O'Brien Refresh(); 1329c80476e4SDavid E. O'Brien ch = 0; 1330c80476e4SDavid E. O'Brien break; 1331c80476e4SDavid E. O'Brien } 1332c80476e4SDavid E. O'Brien } 133345e5710bSMark Peek cleanup_until(oldbuf); 1334c80476e4SDavid E. O'Brien 133545e5710bSMark Peek if (tmpbuf.len == 1) { 1336c80476e4SDavid E. O'Brien /* 1337c80476e4SDavid E. O'Brien * Use the old pattern, but wild-card it. 1338c80476e4SDavid E. O'Brien */ 133945e5710bSMark Peek if (patbuf.len == 0) { 1340c80476e4SDavid E. O'Brien InputBuf[0] = '\0'; 1341c80476e4SDavid E. O'Brien LastChar = InputBuf; 1342c80476e4SDavid E. O'Brien Cursor = InputBuf; 1343c80476e4SDavid E. O'Brien Refresh(); 134445e5710bSMark Peek cleanup_until(&tmpbuf); 1345c80476e4SDavid E. O'Brien return(CC_ERROR); 1346c80476e4SDavid E. O'Brien } 134745e5710bSMark Peek if (patbuf.s[0] != '*') { 134845e5710bSMark Peek oldbuf = Strsave(patbuf.s); 134945e5710bSMark Peek patbuf.len = 0; 135045e5710bSMark Peek Strbuf_append1(&patbuf, '*'); 135145e5710bSMark Peek Strbuf_append(&patbuf, oldbuf); 135245e5710bSMark Peek xfree(oldbuf); 135345e5710bSMark Peek Strbuf_append1(&patbuf, '*'); 135445e5710bSMark Peek Strbuf_terminate(&patbuf); 1355c80476e4SDavid E. O'Brien } 1356c80476e4SDavid E. O'Brien } 1357c80476e4SDavid E. O'Brien else { 135845e5710bSMark Peek Strbuf_append1(&tmpbuf, '*'); 135945e5710bSMark Peek Strbuf_terminate(&tmpbuf); 136045e5710bSMark Peek patbuf.len = 0; 136145e5710bSMark Peek Strbuf_append(&patbuf, tmpbuf.s); 136245e5710bSMark Peek Strbuf_terminate(&patbuf); 1363c80476e4SDavid E. O'Brien } 136445e5710bSMark Peek cleanup_until(&tmpbuf); 1365c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) dir; /* avoid c_hsetpat */ 1366c80476e4SDavid E. O'Brien Cursor = LastChar = InputBuf; 1367c80476e4SDavid E. O'Brien if ((dir == F_UP_SEARCH_HIST ? e_up_search_hist(0) : 1368c80476e4SDavid E. O'Brien e_down_search_hist(0)) == CC_ERROR) { 1369c80476e4SDavid E. O'Brien Refresh(); 1370c80476e4SDavid E. O'Brien return(CC_ERROR); 1371c80476e4SDavid E. O'Brien } 1372c80476e4SDavid E. O'Brien else { 137345e5710bSMark Peek if (ASC(ch) == 0033) { 1374c80476e4SDavid E. O'Brien Refresh(); 1375c80476e4SDavid E. O'Brien *LastChar++ = '\n'; 1376c80476e4SDavid E. O'Brien *LastChar = '\0'; 1377c80476e4SDavid E. O'Brien PastBottom(); 1378c80476e4SDavid E. O'Brien return(CC_NEWLINE); 1379c80476e4SDavid E. O'Brien } 1380c80476e4SDavid E. O'Brien else 1381c80476e4SDavid E. O'Brien return(CC_REFRESH); 1382c80476e4SDavid E. O'Brien } 1383c80476e4SDavid E. O'Brien } 1384c80476e4SDavid E. O'Brien 1385c80476e4SDavid E. O'Brien /* 1386c80476e4SDavid E. O'Brien * semi-PUBLIC routines. Any routine that is of type CCRETVAL is an 1387c80476e4SDavid E. O'Brien * entry point, called from the CcKeyMap indirected into the 1388c80476e4SDavid E. O'Brien * CcFuncTbl array. 1389c80476e4SDavid E. O'Brien */ 1390c80476e4SDavid E. O'Brien 1391c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1392c80476e4SDavid E. O'Brien CCRETVAL 139345e5710bSMark Peek v_cmd_mode(Char c) 1394c80476e4SDavid E. O'Brien { 1395c80476e4SDavid E. O'Brien USE(c); 1396c80476e4SDavid E. O'Brien InsertPos = 0; 1397c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; /* [Esc] cancels pending action */ 1398c80476e4SDavid E. O'Brien ActionPos = 0; 1399c80476e4SDavid E. O'Brien DoingArg = 0; 1400c80476e4SDavid E. O'Brien if (UndoPtr > Cursor) 1401c80476e4SDavid E. O'Brien UndoSize = (int)(UndoPtr - Cursor); 1402c80476e4SDavid E. O'Brien else 1403c80476e4SDavid E. O'Brien UndoSize = (int)(Cursor - UndoPtr); 1404c80476e4SDavid E. O'Brien 1405c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 1406c80476e4SDavid E. O'Brien c_alternativ_key_map(1); 1407c80476e4SDavid E. O'Brien #ifdef notdef 1408c80476e4SDavid E. O'Brien /* 1409c80476e4SDavid E. O'Brien * We don't want to move the cursor, because all the editing 1410c80476e4SDavid E. O'Brien * commands don't include the character under the cursor. 1411c80476e4SDavid E. O'Brien */ 1412c80476e4SDavid E. O'Brien if (Cursor > InputBuf) 1413c80476e4SDavid E. O'Brien Cursor--; 1414c80476e4SDavid E. O'Brien #endif 1415c80476e4SDavid E. O'Brien RefCursor(); 1416c80476e4SDavid E. O'Brien return(CC_NORM); 1417c80476e4SDavid E. O'Brien } 1418c80476e4SDavid E. O'Brien 1419c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1420c80476e4SDavid E. O'Brien CCRETVAL 142145e5710bSMark Peek e_unassigned(Char c) 1422c80476e4SDavid E. O'Brien { /* bound to keys that arn't really assigned */ 1423c80476e4SDavid E. O'Brien USE(c); 1424c80476e4SDavid E. O'Brien SoundBeep(); 1425c80476e4SDavid E. O'Brien flush(); 1426c80476e4SDavid E. O'Brien return(CC_NORM); 1427c80476e4SDavid E. O'Brien } 1428c80476e4SDavid E. O'Brien 142945e5710bSMark Peek #ifdef notyet 143023338178SMark Peek static CCRETVAL 143145e5710bSMark Peek e_insert_str(Char *c) 143223338178SMark Peek { 143323338178SMark Peek int i, n; 143423338178SMark Peek 143523338178SMark Peek n = Strlen(c); 143623338178SMark Peek if (LastChar + Argument * n >= InputLim) 143723338178SMark Peek return(CC_ERROR); /* end of buffer space */ 143823338178SMark Peek if (inputmode != MODE_INSERT) { 143945e5710bSMark Peek c_delafter(Argument * Strlen(c)); 144023338178SMark Peek } 144123338178SMark Peek c_insert(Argument * n); 144223338178SMark Peek while (Argument--) { 144323338178SMark Peek for (i = 0; i < n; i++) 144423338178SMark Peek *Cursor++ = c[i]; 144523338178SMark Peek } 144623338178SMark Peek Refresh(); 144723338178SMark Peek return(CC_NORM); 144823338178SMark Peek } 144945e5710bSMark Peek #endif 145023338178SMark Peek 1451c80476e4SDavid E. O'Brien CCRETVAL 145245e5710bSMark Peek e_insert(Char c) 1453c80476e4SDavid E. O'Brien { 1454c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS 1455c80476e4SDavid E. O'Brien c &= ASCII; /* no meta chars ever */ 1456c80476e4SDavid E. O'Brien #endif 1457c80476e4SDavid E. O'Brien 1458c80476e4SDavid E. O'Brien if (!c) 1459c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1460c80476e4SDavid E. O'Brien 1461c80476e4SDavid E. O'Brien if (LastChar + Argument >= InputLim) 1462c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */ 1463c80476e4SDavid E. O'Brien 1464c80476e4SDavid E. O'Brien if (Argument == 1) { /* How was this optimized ???? */ 1465c80476e4SDavid E. O'Brien 1466c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 1467c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor; 1468c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1469c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */ 1470c80476e4SDavid E. O'Brien } 1471c80476e4SDavid E. O'Brien 1472c80476e4SDavid E. O'Brien c_insert(1); 1473c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1474c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */ 147523338178SMark Peek RefPlusOne(1); /* fast refresh for one char. */ 1476c80476e4SDavid E. O'Brien } 1477c80476e4SDavid E. O'Brien else { 1478c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 147923338178SMark Peek int i; 1480c80476e4SDavid E. O'Brien for(i = 0; i < Argument; i++) 1481c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *(Cursor + i); 1482c80476e4SDavid E. O'Brien 1483c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1484c80476e4SDavid E. O'Brien c_delafter(Argument); /* Do NOT use the saving ONE */ 1485c80476e4SDavid E. O'Brien } 1486c80476e4SDavid E. O'Brien 1487c80476e4SDavid E. O'Brien c_insert(Argument); 1488c80476e4SDavid E. O'Brien 1489c80476e4SDavid E. O'Brien while (Argument--) 1490c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1491c80476e4SDavid E. O'Brien Refresh(); 1492c80476e4SDavid E. O'Brien } 1493c80476e4SDavid E. O'Brien 1494c80476e4SDavid E. O'Brien if (inputmode == MODE_REPLACE_1) 1495c80476e4SDavid E. O'Brien (void) v_cmd_mode(0); 1496c80476e4SDavid E. O'Brien 1497c80476e4SDavid E. O'Brien return(CC_NORM); 1498c80476e4SDavid E. O'Brien } 1499c80476e4SDavid E. O'Brien 1500c80476e4SDavid E. O'Brien int 150145e5710bSMark Peek InsertStr(Char *s) /* insert ASCIZ s at cursor (for complete) */ 1502c80476e4SDavid E. O'Brien { 15036767bd61SMark Peek int len; 1504c80476e4SDavid E. O'Brien 1505c80476e4SDavid E. O'Brien if ((len = (int) Strlen(s)) <= 0) 1506c80476e4SDavid E. O'Brien return -1; 1507c80476e4SDavid E. O'Brien if (LastChar + len >= InputLim) 1508c80476e4SDavid E. O'Brien return -1; /* end of buffer space */ 1509c80476e4SDavid E. O'Brien 1510c80476e4SDavid E. O'Brien c_insert(len); 1511c80476e4SDavid E. O'Brien while (len--) 1512c80476e4SDavid E. O'Brien *Cursor++ = *s++; 1513c80476e4SDavid E. O'Brien return 0; 1514c80476e4SDavid E. O'Brien } 1515c80476e4SDavid E. O'Brien 1516c80476e4SDavid E. O'Brien void 151745e5710bSMark Peek DeleteBack(int n) /* delete the n characters before . */ 1518c80476e4SDavid E. O'Brien { 1519c80476e4SDavid E. O'Brien if (n <= 0) 1520c80476e4SDavid E. O'Brien return; 1521c80476e4SDavid E. O'Brien if (Cursor >= &InputBuf[n]) { 1522c80476e4SDavid E. O'Brien c_delbefore(n); /* delete before dot */ 1523c80476e4SDavid E. O'Brien } 1524c80476e4SDavid E. O'Brien } 1525c80476e4SDavid E. O'Brien 1526c80476e4SDavid E. O'Brien CCRETVAL 152745e5710bSMark Peek e_digit(Char c) /* gray magic here */ 1528c80476e4SDavid E. O'Brien { 1529c80476e4SDavid E. O'Brien if (!Isdigit(c)) 1530c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1531c80476e4SDavid E. O'Brien 1532c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1533c80476e4SDavid E. O'Brien if (LastCmd == F_ARGFOUR) /* if last command was ^U */ 1534c80476e4SDavid E. O'Brien Argument = c - '0'; 1535c80476e4SDavid E. O'Brien else { 1536c80476e4SDavid E. O'Brien if (Argument > 1000000) 1537c80476e4SDavid E. O'Brien return CC_ERROR; 1538c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1539c80476e4SDavid E. O'Brien } 1540c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1541c80476e4SDavid E. O'Brien } 1542c80476e4SDavid E. O'Brien else { 1543c80476e4SDavid E. O'Brien if (LastChar + 1 >= InputLim) 1544c80476e4SDavid E. O'Brien return CC_ERROR; /* end of buffer space */ 1545c80476e4SDavid E. O'Brien 1546c80476e4SDavid E. O'Brien if (inputmode != MODE_INSERT) { 1547c80476e4SDavid E. O'Brien UndoBuf[UndoSize++] = *Cursor; 1548c80476e4SDavid E. O'Brien UndoBuf[UndoSize] = '\0'; 1549c80476e4SDavid E. O'Brien c_delafter(1); /* Do NOT use the saving ONE */ 1550c80476e4SDavid E. O'Brien } 1551c80476e4SDavid E. O'Brien c_insert(1); 1552c80476e4SDavid E. O'Brien *Cursor++ = (Char) c; 1553c80476e4SDavid E. O'Brien DoingArg = 0; /* just in case */ 155423338178SMark Peek RefPlusOne(1); /* fast refresh for one char. */ 1555c80476e4SDavid E. O'Brien } 1556c80476e4SDavid E. O'Brien return(CC_NORM); 1557c80476e4SDavid E. O'Brien } 1558c80476e4SDavid E. O'Brien 1559c80476e4SDavid E. O'Brien CCRETVAL 156045e5710bSMark Peek e_argdigit(Char c) /* for ESC-n */ 1561c80476e4SDavid E. O'Brien { 156245e5710bSMark Peek #ifdef IS_ASCII 1563c80476e4SDavid E. O'Brien c &= ASCII; 156445e5710bSMark Peek #else 156545e5710bSMark Peek c = CTL_ESC(ASC(c) & ASCII); /* stripping for EBCDIC done the ASCII way */ 156645e5710bSMark Peek #endif 1567c80476e4SDavid E. O'Brien 1568c80476e4SDavid E. O'Brien if (!Isdigit(c)) 1569c80476e4SDavid E. O'Brien return(CC_ERROR); /* no NULs in the input ever!! */ 1570c80476e4SDavid E. O'Brien 1571c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1572c80476e4SDavid E. O'Brien if (Argument > 1000000) 1573c80476e4SDavid E. O'Brien return CC_ERROR; 1574c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1575c80476e4SDavid E. O'Brien } 1576c80476e4SDavid E. O'Brien else { /* else starting an argument */ 1577c80476e4SDavid E. O'Brien Argument = c - '0'; 1578c80476e4SDavid E. O'Brien DoingArg = 1; 1579c80476e4SDavid E. O'Brien } 1580c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1581c80476e4SDavid E. O'Brien } 1582c80476e4SDavid E. O'Brien 1583c80476e4SDavid E. O'Brien CCRETVAL 158445e5710bSMark Peek v_zero(Char c) /* command mode 0 for vi */ 1585c80476e4SDavid E. O'Brien { 1586c80476e4SDavid E. O'Brien if (DoingArg) { /* if doing an arg, add this in... */ 1587c80476e4SDavid E. O'Brien if (Argument > 1000000) 1588c80476e4SDavid E. O'Brien return CC_ERROR; 1589c80476e4SDavid E. O'Brien Argument = (Argument * 10) + (c - '0'); 1590c80476e4SDavid E. O'Brien return(CC_ARGHACK); 1591c80476e4SDavid E. O'Brien } 1592c80476e4SDavid E. O'Brien else { /* else starting an argument */ 1593c80476e4SDavid E. O'Brien Cursor = InputBuf; 1594c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 1595c80476e4SDavid E. O'Brien c_delfini(); 1596c80476e4SDavid E. O'Brien return(CC_REFRESH); 1597c80476e4SDavid E. O'Brien } 1598c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 1599c80476e4SDavid E. O'Brien return(CC_NORM); 1600c80476e4SDavid E. O'Brien } 1601c80476e4SDavid E. O'Brien } 1602c80476e4SDavid E. O'Brien 1603c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1604c80476e4SDavid E. O'Brien CCRETVAL 160545e5710bSMark Peek e_newline(Char c) 1606c80476e4SDavid E. O'Brien { /* always ignore argument */ 1607c80476e4SDavid E. O'Brien USE(c); 160845e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) { 160945e5710bSMark Peek MarkIsSet = 0; 161045e5710bSMark Peek ClearLines(); 161145e5710bSMark Peek ClearDisp(); 161245e5710bSMark Peek Refresh(); 161345e5710bSMark Peek } 161445e5710bSMark Peek MarkIsSet = 0; 161545e5710bSMark Peek 1616c80476e4SDavid E. O'Brien /* PastBottom(); NOW done in ed.inputl.c */ 1617c80476e4SDavid E. O'Brien *LastChar++ = '\n'; /* for the benefit of CSH */ 1618c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1619c80476e4SDavid E. O'Brien if (VImode) 1620c80476e4SDavid E. O'Brien InsertPos = InputBuf; /* Reset editing position */ 1621c80476e4SDavid E. O'Brien return(CC_NEWLINE); 1622c80476e4SDavid E. O'Brien } 1623c80476e4SDavid E. O'Brien 1624c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1625c80476e4SDavid E. O'Brien CCRETVAL 162645e5710bSMark Peek e_newline_hold(Char c) 162745e5710bSMark Peek { 162845e5710bSMark Peek USE(c); 162945e5710bSMark Peek c_save_inputbuf(); 163045e5710bSMark Peek HistSaved = 0; 163145e5710bSMark Peek *LastChar++ = '\n'; /* for the benefit of CSH */ 163245e5710bSMark Peek *LastChar = '\0'; /* just in case */ 163345e5710bSMark Peek return(CC_NEWLINE); 163445e5710bSMark Peek } 163545e5710bSMark Peek 163645e5710bSMark Peek /*ARGSUSED*/ 163745e5710bSMark Peek CCRETVAL 163845e5710bSMark Peek e_newline_down_hist(Char c) 163945e5710bSMark Peek { 164045e5710bSMark Peek USE(c); 164145e5710bSMark Peek if (Hist_num > 1) { 164245e5710bSMark Peek HistSaved = Hist_num; 164345e5710bSMark Peek } 164445e5710bSMark Peek *LastChar++ = '\n'; /* for the benefit of CSH */ 164545e5710bSMark Peek *LastChar = '\0'; /* just in case */ 164645e5710bSMark Peek return(CC_NEWLINE); 164745e5710bSMark Peek } 164845e5710bSMark Peek 164945e5710bSMark Peek /*ARGSUSED*/ 165045e5710bSMark Peek CCRETVAL 165145e5710bSMark Peek e_send_eof(Char c) 1652c80476e4SDavid E. O'Brien { /* for when ^D is ONLY send-eof */ 1653c80476e4SDavid E. O'Brien USE(c); 1654c80476e4SDavid E. O'Brien PastBottom(); 1655c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1656c80476e4SDavid E. O'Brien return(CC_EOF); 1657c80476e4SDavid E. O'Brien } 1658c80476e4SDavid E. O'Brien 1659c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1660c80476e4SDavid E. O'Brien CCRETVAL 166145e5710bSMark Peek e_complete(Char c) 1662c80476e4SDavid E. O'Brien { 1663c80476e4SDavid E. O'Brien USE(c); 1664c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1665c80476e4SDavid E. O'Brien return(CC_COMPLETE); 1666c80476e4SDavid E. O'Brien } 1667c80476e4SDavid E. O'Brien 1668c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1669c80476e4SDavid E. O'Brien CCRETVAL 167045e5710bSMark Peek e_complete_back(Char c) 1671c80476e4SDavid E. O'Brien { 1672c80476e4SDavid E. O'Brien USE(c); 1673c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1674c80476e4SDavid E. O'Brien return(CC_COMPLETE_BACK); 1675c80476e4SDavid E. O'Brien } 1676c80476e4SDavid E. O'Brien 1677c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1678c80476e4SDavid E. O'Brien CCRETVAL 167945e5710bSMark Peek e_complete_fwd(Char c) 1680c80476e4SDavid E. O'Brien { 1681c80476e4SDavid E. O'Brien USE(c); 1682c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1683c80476e4SDavid E. O'Brien return(CC_COMPLETE_FWD); 1684c80476e4SDavid E. O'Brien } 1685c80476e4SDavid E. O'Brien 1686c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1687c80476e4SDavid E. O'Brien CCRETVAL 168845e5710bSMark Peek e_complete_all(Char c) 1689c80476e4SDavid E. O'Brien { 1690c80476e4SDavid E. O'Brien USE(c); 1691c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1692c80476e4SDavid E. O'Brien return(CC_COMPLETE_ALL); 1693c80476e4SDavid E. O'Brien } 1694c80476e4SDavid E. O'Brien 1695c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1696c80476e4SDavid E. O'Brien CCRETVAL 169745e5710bSMark Peek v_cm_complete(Char c) 1698c80476e4SDavid E. O'Brien { 1699c80476e4SDavid E. O'Brien USE(c); 1700c80476e4SDavid E. O'Brien if (Cursor < LastChar) 1701c80476e4SDavid E. O'Brien Cursor++; 1702c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1703c80476e4SDavid E. O'Brien return(CC_COMPLETE); 1704c80476e4SDavid E. O'Brien } 1705c80476e4SDavid E. O'Brien 1706c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1707c80476e4SDavid E. O'Brien CCRETVAL 170845e5710bSMark Peek e_toggle_hist(Char c) 1709c80476e4SDavid E. O'Brien { 1710c80476e4SDavid E. O'Brien struct Hist *hp; 1711c80476e4SDavid E. O'Brien int h; 1712c80476e4SDavid E. O'Brien 1713c80476e4SDavid E. O'Brien USE(c); 1714c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1715c80476e4SDavid E. O'Brien 1716c80476e4SDavid E. O'Brien if (Hist_num <= 0) { 1717c80476e4SDavid E. O'Brien return CC_ERROR; 1718c80476e4SDavid E. O'Brien } 1719c80476e4SDavid E. O'Brien 1720c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1721c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */ 1722c80476e4SDavid E. O'Brien return(CC_ERROR); 1723c80476e4SDavid E. O'Brien } 1724c80476e4SDavid E. O'Brien 1725c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num; h++) 1726c80476e4SDavid E. O'Brien hp = hp->Hnext; 1727c80476e4SDavid E. O'Brien 1728c80476e4SDavid E. O'Brien if (!CurrentHistLit) { 1729c80476e4SDavid E. O'Brien if (hp->histline) { 173045e5710bSMark Peek copyn(InputBuf, hp->histline, INBUFSIZE);/*FIXBUF*/ 1731c80476e4SDavid E. O'Brien CurrentHistLit = 1; 1732c80476e4SDavid E. O'Brien } 1733c80476e4SDavid E. O'Brien else { 1734c80476e4SDavid E. O'Brien return CC_ERROR; 1735c80476e4SDavid E. O'Brien } 1736c80476e4SDavid E. O'Brien } 1737c80476e4SDavid E. O'Brien else { 173845e5710bSMark Peek Char *p; 173945e5710bSMark Peek 174045e5710bSMark Peek p = sprlex(&hp->Hlex); 174145e5710bSMark Peek copyn(InputBuf, p, sizeof(InputBuf) / sizeof(Char));/*FIXBUF*/ 174245e5710bSMark Peek xfree(p); 1743c80476e4SDavid E. O'Brien CurrentHistLit = 0; 1744c80476e4SDavid E. O'Brien } 1745c80476e4SDavid E. O'Brien 174645e5710bSMark Peek LastChar = Strend(InputBuf); 1747c80476e4SDavid E. O'Brien if (LastChar > InputBuf) { 1748c80476e4SDavid E. O'Brien if (LastChar[-1] == '\n') 1749c80476e4SDavid E. O'Brien LastChar--; 1750c80476e4SDavid E. O'Brien if (LastChar[-1] == ' ') 1751c80476e4SDavid E. O'Brien LastChar--; 1752c80476e4SDavid E. O'Brien if (LastChar < InputBuf) 1753c80476e4SDavid E. O'Brien LastChar = InputBuf; 1754c80476e4SDavid E. O'Brien } 1755c80476e4SDavid E. O'Brien 1756c80476e4SDavid E. O'Brien #ifdef KSHVI 1757c80476e4SDavid E. O'Brien if (VImode) 1758c80476e4SDavid E. O'Brien Cursor = InputBuf; 1759c80476e4SDavid E. O'Brien else 1760c80476e4SDavid E. O'Brien #endif /* KSHVI */ 1761c80476e4SDavid E. O'Brien Cursor = LastChar; 1762c80476e4SDavid E. O'Brien 1763c80476e4SDavid E. O'Brien return(CC_REFRESH); 1764c80476e4SDavid E. O'Brien } 1765c80476e4SDavid E. O'Brien 1766c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1767c80476e4SDavid E. O'Brien CCRETVAL 176845e5710bSMark Peek e_up_hist(Char c) 1769c80476e4SDavid E. O'Brien { 1770c80476e4SDavid E. O'Brien Char beep = 0; 1771c80476e4SDavid E. O'Brien 1772c80476e4SDavid E. O'Brien USE(c); 1773c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1774c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1775c80476e4SDavid E. O'Brien 1776c80476e4SDavid E. O'Brien if (Hist_num == 0) { /* save the current buffer away */ 177745e5710bSMark Peek HistBuf.len = 0; 177845e5710bSMark Peek Strbuf_append(&HistBuf, InputBuf); 177945e5710bSMark Peek Strbuf_terminate(&HistBuf); 1780c80476e4SDavid E. O'Brien } 1781c80476e4SDavid E. O'Brien 1782c80476e4SDavid E. O'Brien Hist_num += Argument; 1783c80476e4SDavid E. O'Brien 178445e5710bSMark Peek if (GetHistLine() == CC_ERROR) { 1785c80476e4SDavid E. O'Brien beep = 1; 178645e5710bSMark Peek (void) GetHistLine(); /* Hist_num was fixed by first call */ 1787c80476e4SDavid E. O'Brien } 1788c80476e4SDavid E. O'Brien 1789c80476e4SDavid E. O'Brien Refresh(); 1790c80476e4SDavid E. O'Brien if (beep) 1791c80476e4SDavid E. O'Brien return(CC_ERROR); 1792c80476e4SDavid E. O'Brien else 1793c80476e4SDavid E. O'Brien return(CC_NORM); /* was CC_UP_HIST */ 1794c80476e4SDavid E. O'Brien } 1795c80476e4SDavid E. O'Brien 1796c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1797c80476e4SDavid E. O'Brien CCRETVAL 179845e5710bSMark Peek e_down_hist(Char c) 1799c80476e4SDavid E. O'Brien { 1800c80476e4SDavid E. O'Brien USE(c); 1801c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1802c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1803c80476e4SDavid E. O'Brien 1804c80476e4SDavid E. O'Brien Hist_num -= Argument; 1805c80476e4SDavid E. O'Brien 1806c80476e4SDavid E. O'Brien if (Hist_num < 0) { 1807c80476e4SDavid E. O'Brien Hist_num = 0; 1808c80476e4SDavid E. O'Brien return(CC_ERROR); /* make it beep */ 1809c80476e4SDavid E. O'Brien } 1810c80476e4SDavid E. O'Brien 181145e5710bSMark Peek return(GetHistLine()); 1812c80476e4SDavid E. O'Brien } 1813c80476e4SDavid E. O'Brien 1814c80476e4SDavid E. O'Brien 1815c80476e4SDavid E. O'Brien 1816c80476e4SDavid E. O'Brien /* 1817c80476e4SDavid E. O'Brien * c_hmatch() return True if the pattern matches the prefix 1818c80476e4SDavid E. O'Brien */ 1819c80476e4SDavid E. O'Brien static int 182045e5710bSMark Peek c_hmatch(Char *str) 1821c80476e4SDavid E. O'Brien { 182245e5710bSMark Peek if (Strncmp(patbuf.s, str, patbuf.len) == 0) 1823c80476e4SDavid E. O'Brien return 1; 182445e5710bSMark Peek return Gmatch(str, patbuf.s); 1825c80476e4SDavid E. O'Brien } 1826c80476e4SDavid E. O'Brien 1827c80476e4SDavid E. O'Brien /* 1828c80476e4SDavid E. O'Brien * c_hsetpat(): Set the history seatch pattern 1829c80476e4SDavid E. O'Brien */ 1830c80476e4SDavid E. O'Brien static void 183145e5710bSMark Peek c_hsetpat(void) 1832c80476e4SDavid E. O'Brien { 1833c80476e4SDavid E. O'Brien if (LastCmd != F_UP_SEARCH_HIST && LastCmd != F_DOWN_SEARCH_HIST) { 183445e5710bSMark Peek patbuf.len = 0; 183545e5710bSMark Peek Strbuf_appendn(&patbuf, InputBuf, Cursor - InputBuf); 183645e5710bSMark Peek Strbuf_terminate(&patbuf); 1837c80476e4SDavid E. O'Brien } 1838c80476e4SDavid E. O'Brien #ifdef SDEBUG 1839c80476e4SDavid E. O'Brien xprintf("\nHist_num = %d\n", Hist_num); 184045e5710bSMark Peek xprintf("patlen = %d\n", (int)patbuf.len); 184145e5710bSMark Peek xprintf("patbuf = \"%S\"\n", patbuf.s); 1842c80476e4SDavid E. O'Brien xprintf("Cursor %d LastChar %d\n", Cursor - InputBuf, LastChar - InputBuf); 1843c80476e4SDavid E. O'Brien #endif 1844c80476e4SDavid E. O'Brien } 1845c80476e4SDavid E. O'Brien 1846c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1847c80476e4SDavid E. O'Brien CCRETVAL 184845e5710bSMark Peek e_up_search_hist(Char c) 1849c80476e4SDavid E. O'Brien { 1850c80476e4SDavid E. O'Brien struct Hist *hp; 1851c80476e4SDavid E. O'Brien int h; 185223338178SMark Peek int found = 0; 1853c80476e4SDavid E. O'Brien 1854c80476e4SDavid E. O'Brien USE(c); 1855c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 1856c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1857c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1858c80476e4SDavid E. O'Brien if (Hist_num < 0) { 1859c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT 1860c80476e4SDavid E. O'Brien xprintf("%s: e_up_search_hist(): Hist_num < 0; resetting.\n", progname); 1861c80476e4SDavid E. O'Brien #endif 1862c80476e4SDavid E. O'Brien Hist_num = 0; 1863c80476e4SDavid E. O'Brien return(CC_ERROR); 1864c80476e4SDavid E. O'Brien } 1865c80476e4SDavid E. O'Brien 186645e5710bSMark Peek if (Hist_num == 0) { 186745e5710bSMark Peek HistBuf.len = 0; 186845e5710bSMark Peek Strbuf_append(&HistBuf, InputBuf); 186945e5710bSMark Peek Strbuf_terminate(&HistBuf); 1870c80476e4SDavid E. O'Brien } 1871c80476e4SDavid E. O'Brien 1872c80476e4SDavid E. O'Brien 1873c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1874c80476e4SDavid E. O'Brien if (hp == NULL) 1875c80476e4SDavid E. O'Brien return(CC_ERROR); 1876c80476e4SDavid E. O'Brien 1877c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */ 1878c80476e4SDavid E. O'Brien 1879c80476e4SDavid E. O'Brien for (h = 1; h <= Hist_num; h++) 1880c80476e4SDavid E. O'Brien hp = hp->Hnext; 1881c80476e4SDavid E. O'Brien 1882c80476e4SDavid E. O'Brien while (hp != NULL) { 188345e5710bSMark Peek Char *hl; 188445e5710bSMark Peek int matched; 188545e5710bSMark Peek 188645e5710bSMark Peek if (hp->histline == NULL) 188745e5710bSMark Peek hp->histline = sprlex(&hp->Hlex); 188845e5710bSMark Peek if (HistLit) 188945e5710bSMark Peek hl = hp->histline; 189045e5710bSMark Peek else { 189145e5710bSMark Peek hl = sprlex(&hp->Hlex); 189245e5710bSMark Peek cleanup_push(hl, xfree); 1893c80476e4SDavid E. O'Brien } 1894c80476e4SDavid E. O'Brien #ifdef SDEBUG 1895c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl); 1896c80476e4SDavid E. O'Brien #endif 189745e5710bSMark Peek matched = (Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) || 189845e5710bSMark Peek hl[LastChar-InputBuf]) && c_hmatch(hl); 189945e5710bSMark Peek if (!HistLit) 190045e5710bSMark Peek cleanup_until(hl); 190145e5710bSMark Peek if (matched) { 1902c80476e4SDavid E. O'Brien found++; 1903c80476e4SDavid E. O'Brien break; 1904c80476e4SDavid E. O'Brien } 1905c80476e4SDavid E. O'Brien h++; 1906c80476e4SDavid E. O'Brien hp = hp->Hnext; 1907c80476e4SDavid E. O'Brien } 1908c80476e4SDavid E. O'Brien 1909c80476e4SDavid E. O'Brien if (!found) { 1910c80476e4SDavid E. O'Brien #ifdef SDEBUG 1911c80476e4SDavid E. O'Brien xprintf("not found\n"); 1912c80476e4SDavid E. O'Brien #endif 1913c80476e4SDavid E. O'Brien return(CC_ERROR); 1914c80476e4SDavid E. O'Brien } 1915c80476e4SDavid E. O'Brien 1916c80476e4SDavid E. O'Brien Hist_num = h; 1917c80476e4SDavid E. O'Brien 191845e5710bSMark Peek return(GetHistLine()); 1919c80476e4SDavid E. O'Brien } 1920c80476e4SDavid E. O'Brien 1921c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1922c80476e4SDavid E. O'Brien CCRETVAL 192345e5710bSMark Peek e_down_search_hist(Char c) 1924c80476e4SDavid E. O'Brien { 1925c80476e4SDavid E. O'Brien struct Hist *hp; 1926c80476e4SDavid E. O'Brien int h; 192723338178SMark Peek int found = 0; 1928c80476e4SDavid E. O'Brien 1929c80476e4SDavid E. O'Brien USE(c); 1930c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 1931c80476e4SDavid E. O'Brien UndoAction = TCSHOP_NOP; 1932c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1933c80476e4SDavid E. O'Brien 1934c80476e4SDavid E. O'Brien if (Hist_num == 0) 1935c80476e4SDavid E. O'Brien return(CC_ERROR); 1936c80476e4SDavid E. O'Brien 1937c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 1938c80476e4SDavid E. O'Brien if (hp == 0) 1939c80476e4SDavid E. O'Brien return(CC_ERROR); 1940c80476e4SDavid E. O'Brien 1941c80476e4SDavid E. O'Brien c_hsetpat(); /* Set search pattern !! */ 1942c80476e4SDavid E. O'Brien 1943c80476e4SDavid E. O'Brien for (h = 1; h < Hist_num && hp; h++) { 194445e5710bSMark Peek Char *hl; 194545e5710bSMark Peek if (hp->histline == NULL) 194645e5710bSMark Peek hp->histline = sprlex(&hp->Hlex); 194745e5710bSMark Peek if (HistLit) 194845e5710bSMark Peek hl = hp->histline; 194945e5710bSMark Peek else { 195045e5710bSMark Peek hl = sprlex(&hp->Hlex); 195145e5710bSMark Peek cleanup_push(hl, xfree); 1952c80476e4SDavid E. O'Brien } 1953c80476e4SDavid E. O'Brien #ifdef SDEBUG 1954c80476e4SDavid E. O'Brien xprintf("Comparing with \"%S\"\n", hl); 1955c80476e4SDavid E. O'Brien #endif 1956c80476e4SDavid E. O'Brien if ((Strncmp(hl, InputBuf, (size_t) (LastChar - InputBuf)) || 1957c80476e4SDavid E. O'Brien hl[LastChar-InputBuf]) && c_hmatch(hl)) 1958c80476e4SDavid E. O'Brien found = h; 195945e5710bSMark Peek if (!HistLit) 196045e5710bSMark Peek cleanup_until(hl); 1961c80476e4SDavid E. O'Brien hp = hp->Hnext; 1962c80476e4SDavid E. O'Brien } 1963c80476e4SDavid E. O'Brien 1964c80476e4SDavid E. O'Brien if (!found) { /* is it the current history number? */ 196545e5710bSMark Peek if (!c_hmatch(HistBuf.s)) { 1966c80476e4SDavid E. O'Brien #ifdef SDEBUG 1967c80476e4SDavid E. O'Brien xprintf("not found\n"); 1968c80476e4SDavid E. O'Brien #endif 1969c80476e4SDavid E. O'Brien return(CC_ERROR); 1970c80476e4SDavid E. O'Brien } 1971c80476e4SDavid E. O'Brien } 1972c80476e4SDavid E. O'Brien 1973c80476e4SDavid E. O'Brien Hist_num = found; 1974c80476e4SDavid E. O'Brien 197545e5710bSMark Peek return(GetHistLine()); 1976c80476e4SDavid E. O'Brien } 1977c80476e4SDavid E. O'Brien 1978c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1979c80476e4SDavid E. O'Brien CCRETVAL 198045e5710bSMark Peek e_helpme(Char c) 1981c80476e4SDavid E. O'Brien { 1982c80476e4SDavid E. O'Brien USE(c); 1983c80476e4SDavid E. O'Brien PastBottom(); 1984c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1985c80476e4SDavid E. O'Brien return(CC_HELPME); 1986c80476e4SDavid E. O'Brien } 1987c80476e4SDavid E. O'Brien 1988c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1989c80476e4SDavid E. O'Brien CCRETVAL 199045e5710bSMark Peek e_correct(Char c) 1991c80476e4SDavid E. O'Brien { 1992c80476e4SDavid E. O'Brien USE(c); 1993c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 1994c80476e4SDavid E. O'Brien return(CC_CORRECT); 1995c80476e4SDavid E. O'Brien } 1996c80476e4SDavid E. O'Brien 1997c80476e4SDavid E. O'Brien /*ARGSUSED*/ 1998c80476e4SDavid E. O'Brien CCRETVAL 199945e5710bSMark Peek e_correctl(Char c) 2000c80476e4SDavid E. O'Brien { 2001c80476e4SDavid E. O'Brien USE(c); 2002c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2003c80476e4SDavid E. O'Brien return(CC_CORRECT_L); 2004c80476e4SDavid E. O'Brien } 2005c80476e4SDavid E. O'Brien 2006c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2007c80476e4SDavid E. O'Brien CCRETVAL 200845e5710bSMark Peek e_run_fg_editor(Char c) 2009c80476e4SDavid E. O'Brien { 20106767bd61SMark Peek struct process *pp; 2011c80476e4SDavid E. O'Brien 2012c80476e4SDavid E. O'Brien USE(c); 2013c80476e4SDavid E. O'Brien if ((pp = find_stop_ed()) != NULL) { 2014c80476e4SDavid E. O'Brien /* save our editor state so we can restore it */ 201545e5710bSMark Peek c_save_inputbuf(); 2016c80476e4SDavid E. O'Brien Hist_num = 0; /* for the history commands */ 2017c80476e4SDavid E. O'Brien 2018c80476e4SDavid E. O'Brien /* put the tty in a sane mode */ 2019c80476e4SDavid E. O'Brien PastBottom(); 2020c80476e4SDavid E. O'Brien (void) Cookedmode(); /* make sure the tty is set up correctly */ 2021c80476e4SDavid E. O'Brien 2022c80476e4SDavid E. O'Brien /* do it! */ 2023c80476e4SDavid E. O'Brien fg_proc_entry(pp); 2024c80476e4SDavid E. O'Brien 2025c80476e4SDavid E. O'Brien (void) Rawmode(); /* go on */ 2026c80476e4SDavid E. O'Brien Refresh(); 202745e5710bSMark Peek RestoreSaved = 0; 202845e5710bSMark Peek HistSaved = 0; 2029c80476e4SDavid E. O'Brien } 2030c80476e4SDavid E. O'Brien return(CC_NORM); 2031c80476e4SDavid E. O'Brien } 2032c80476e4SDavid E. O'Brien 2033c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2034c80476e4SDavid E. O'Brien CCRETVAL 203545e5710bSMark Peek e_list_choices(Char c) 2036c80476e4SDavid E. O'Brien { 2037c80476e4SDavid E. O'Brien USE(c); 2038c80476e4SDavid E. O'Brien PastBottom(); 2039c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2040c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2041c80476e4SDavid E. O'Brien } 2042c80476e4SDavid E. O'Brien 2043c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2044c80476e4SDavid E. O'Brien CCRETVAL 204545e5710bSMark Peek e_list_all(Char c) 2046c80476e4SDavid E. O'Brien { 2047c80476e4SDavid E. O'Brien USE(c); 2048c80476e4SDavid E. O'Brien PastBottom(); 2049c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2050c80476e4SDavid E. O'Brien return(CC_LIST_ALL); 2051c80476e4SDavid E. O'Brien } 2052c80476e4SDavid E. O'Brien 2053c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2054c80476e4SDavid E. O'Brien CCRETVAL 205545e5710bSMark Peek e_list_glob(Char c) 2056c80476e4SDavid E. O'Brien { 2057c80476e4SDavid E. O'Brien USE(c); 2058c80476e4SDavid E. O'Brien PastBottom(); 2059c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2060c80476e4SDavid E. O'Brien return(CC_LIST_GLOB); 2061c80476e4SDavid E. O'Brien } 2062c80476e4SDavid E. O'Brien 2063c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2064c80476e4SDavid E. O'Brien CCRETVAL 206545e5710bSMark Peek e_expand_glob(Char c) 2066c80476e4SDavid E. O'Brien { 2067c80476e4SDavid E. O'Brien USE(c); 2068c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2069c80476e4SDavid E. O'Brien return(CC_EXPAND_GLOB); 2070c80476e4SDavid E. O'Brien } 2071c80476e4SDavid E. O'Brien 2072c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2073c80476e4SDavid E. O'Brien CCRETVAL 207445e5710bSMark Peek e_normalize_path(Char c) 2075c80476e4SDavid E. O'Brien { 2076c80476e4SDavid E. O'Brien USE(c); 2077c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2078c80476e4SDavid E. O'Brien return(CC_NORMALIZE_PATH); 2079c80476e4SDavid E. O'Brien } 2080c80476e4SDavid E. O'Brien 2081c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2082c80476e4SDavid E. O'Brien CCRETVAL 208345e5710bSMark Peek e_normalize_command(Char c) 2084c80476e4SDavid E. O'Brien { 2085c80476e4SDavid E. O'Brien USE(c); 2086c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2087c80476e4SDavid E. O'Brien return(CC_NORMALIZE_COMMAND); 2088c80476e4SDavid E. O'Brien } 2089c80476e4SDavid E. O'Brien 2090c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2091c80476e4SDavid E. O'Brien CCRETVAL 209245e5710bSMark Peek e_expand_vars(Char c) 2093c80476e4SDavid E. O'Brien { 2094c80476e4SDavid E. O'Brien USE(c); 2095c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2096c80476e4SDavid E. O'Brien return(CC_EXPAND_VARS); 2097c80476e4SDavid E. O'Brien } 2098c80476e4SDavid E. O'Brien 2099c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2100c80476e4SDavid E. O'Brien CCRETVAL 210145e5710bSMark Peek e_which(Char c) 2102c80476e4SDavid E. O'Brien { /* do a fast command line which(1) */ 2103c80476e4SDavid E. O'Brien USE(c); 210445e5710bSMark Peek c_save_inputbuf(); 210545e5710bSMark Peek Hist_num = 0; /* for the history commands */ 2106c80476e4SDavid E. O'Brien PastBottom(); 2107c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2108c80476e4SDavid E. O'Brien return(CC_WHICH); 2109c80476e4SDavid E. O'Brien } 2110c80476e4SDavid E. O'Brien 2111c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2112c80476e4SDavid E. O'Brien CCRETVAL 211345e5710bSMark Peek e_last_item(Char c) 2114c80476e4SDavid E. O'Brien { /* insert the last element of the prev. cmd */ 21156767bd61SMark Peek struct Hist *hp; 21166767bd61SMark Peek struct wordent *wp, *firstp; 21176767bd61SMark Peek int i; 211845e5710bSMark Peek Char *expanded; 2119c80476e4SDavid E. O'Brien 2120c80476e4SDavid E. O'Brien USE(c); 2121c80476e4SDavid E. O'Brien if (Argument <= 0) 2122c80476e4SDavid E. O'Brien return(CC_ERROR); 2123c80476e4SDavid E. O'Brien 2124c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 2125c80476e4SDavid E. O'Brien if (hp == NULL) { /* this is only if no history */ 2126c80476e4SDavid E. O'Brien return(CC_ERROR); 2127c80476e4SDavid E. O'Brien } 2128c80476e4SDavid E. O'Brien 2129c80476e4SDavid E. O'Brien wp = (hp->Hlex).prev; 2130c80476e4SDavid E. O'Brien 2131c80476e4SDavid E. O'Brien if (wp->prev == (struct wordent *) NULL) 2132c80476e4SDavid E. O'Brien return(CC_ERROR); /* an empty history entry */ 2133c80476e4SDavid E. O'Brien 2134c80476e4SDavid E. O'Brien firstp = (hp->Hlex).next; 2135c80476e4SDavid E. O'Brien 2136c80476e4SDavid E. O'Brien /* back up arg words in lex */ 2137c80476e4SDavid E. O'Brien for (i = 0; i < Argument && wp != firstp; i++) { 2138c80476e4SDavid E. O'Brien wp = wp->prev; 2139c80476e4SDavid E. O'Brien } 2140c80476e4SDavid E. O'Brien 214145e5710bSMark Peek expanded = expand_lex(wp->prev, 0, i - 1); 214245e5710bSMark Peek if (InsertStr(expanded)) { 214345e5710bSMark Peek xfree(expanded); 2144c80476e4SDavid E. O'Brien return(CC_ERROR); 214545e5710bSMark Peek } 2146c80476e4SDavid E. O'Brien 214745e5710bSMark Peek xfree(expanded); 2148c80476e4SDavid E. O'Brien return(CC_REFRESH); 2149c80476e4SDavid E. O'Brien } 2150c80476e4SDavid E. O'Brien 2151c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2152c80476e4SDavid E. O'Brien CCRETVAL 215345e5710bSMark Peek e_dabbrev_expand(Char c) 2154c80476e4SDavid E. O'Brien { /* expand to preceding word matching prefix */ 21556767bd61SMark Peek Char *cp, *ncp, *bp; 21566767bd61SMark Peek struct Hist *hp; 215745e5710bSMark Peek int arg = 0, i; 215845e5710bSMark Peek size_t len = 0; 215923338178SMark Peek int found = 0; 216045e5710bSMark Peek Char *hbuf; 2161c80476e4SDavid E. O'Brien static int oldevent, hist, word; 2162c80476e4SDavid E. O'Brien static Char *start, *oldcursor; 2163c80476e4SDavid E. O'Brien 2164c80476e4SDavid E. O'Brien USE(c); 2165c80476e4SDavid E. O'Brien if (Argument <= 0) 2166c80476e4SDavid E. O'Brien return(CC_ERROR); 2167c80476e4SDavid E. O'Brien 21686767bd61SMark Peek cp = c_preword(Cursor, InputBuf, 1, STRshwordsep); 2169c80476e4SDavid E. O'Brien if (cp == Cursor || Isspace(*cp)) 2170c80476e4SDavid E. O'Brien return(CC_ERROR); 2171c80476e4SDavid E. O'Brien 217245e5710bSMark Peek hbuf = NULL; 2173c80476e4SDavid E. O'Brien hp = Histlist.Hnext; 2174c80476e4SDavid E. O'Brien bp = InputBuf; 2175c80476e4SDavid E. O'Brien if (Argument == 1 && eventno == oldevent && cp == start && 217645e5710bSMark Peek Cursor == oldcursor && patbuf.len > 0 217745e5710bSMark Peek && Strncmp(patbuf.s, cp, patbuf.len) == 0){ 2178c80476e4SDavid E. O'Brien /* continue previous search - go to last match (hist/word) */ 2179c80476e4SDavid E. O'Brien if (hist != 0) { /* need to move up history */ 2180c80476e4SDavid E. O'Brien for (i = 1; i < hist && hp != NULL; i++) 2181c80476e4SDavid E. O'Brien hp = hp->Hnext; 2182c80476e4SDavid E. O'Brien if (hp == NULL) /* "can't happen" */ 218345e5710bSMark Peek goto err_hbuf; 218445e5710bSMark Peek hbuf = expand_lex(&hp->Hlex, 0, INT_MAX); 218545e5710bSMark Peek cp = Strend(hbuf); 2186c80476e4SDavid E. O'Brien bp = hbuf; 2187c80476e4SDavid E. O'Brien hp = hp->Hnext; 2188c80476e4SDavid E. O'Brien } 21896767bd61SMark Peek cp = c_preword(cp, bp, word, STRshwordsep); 2190c80476e4SDavid E. O'Brien } else { /* starting new search */ 2191c80476e4SDavid E. O'Brien oldevent = eventno; 2192c80476e4SDavid E. O'Brien start = cp; 219345e5710bSMark Peek patbuf.len = 0; 219445e5710bSMark Peek Strbuf_appendn(&patbuf, cp, Cursor - cp); 2195c80476e4SDavid E. O'Brien hist = 0; 2196c80476e4SDavid E. O'Brien word = 0; 2197c80476e4SDavid E. O'Brien } 2198c80476e4SDavid E. O'Brien 2199c80476e4SDavid E. O'Brien while (!found) { 22006767bd61SMark Peek ncp = c_preword(cp, bp, 1, STRshwordsep); 2201c80476e4SDavid E. O'Brien if (ncp == cp || Isspace(*ncp)) { /* beginning of line */ 2202c80476e4SDavid E. O'Brien hist++; 2203c80476e4SDavid E. O'Brien word = 0; 2204c80476e4SDavid E. O'Brien if (hp == NULL) 220545e5710bSMark Peek goto err_hbuf; 220645e5710bSMark Peek hbuf = expand_lex(&hp->Hlex, 0, INT_MAX); 220745e5710bSMark Peek cp = Strend(hbuf); 2208c80476e4SDavid E. O'Brien bp = hbuf; 2209c80476e4SDavid E. O'Brien hp = hp->Hnext; 2210c80476e4SDavid E. O'Brien continue; 2211c80476e4SDavid E. O'Brien } else { 2212c80476e4SDavid E. O'Brien word++; 221345e5710bSMark Peek len = c_endword(ncp-1, cp, 1, STRshwordsep) - ncp + 1; 2214c80476e4SDavid E. O'Brien cp = ncp; 2215c80476e4SDavid E. O'Brien } 221645e5710bSMark Peek if (len > patbuf.len && Strncmp(cp, patbuf.s, patbuf.len) == 0) { 2217c80476e4SDavid E. O'Brien /* We don't fully check distinct matches as Gnuemacs does: */ 2218c80476e4SDavid E. O'Brien if (Argument > 1) { /* just count matches */ 2219c80476e4SDavid E. O'Brien if (++arg >= Argument) 2220c80476e4SDavid E. O'Brien found++; 2221c80476e4SDavid E. O'Brien } else { /* match if distinct from previous */ 222245e5710bSMark Peek if (len != (size_t)(Cursor - start) 222345e5710bSMark Peek || Strncmp(cp, start, len) != 0) 2224c80476e4SDavid E. O'Brien found++; 2225c80476e4SDavid E. O'Brien } 2226c80476e4SDavid E. O'Brien } 2227c80476e4SDavid E. O'Brien } 2228c80476e4SDavid E. O'Brien 2229c80476e4SDavid E. O'Brien if (LastChar + len - (Cursor - start) >= InputLim) 223045e5710bSMark Peek goto err_hbuf; /* no room */ 2231c80476e4SDavid E. O'Brien DeleteBack(Cursor - start); 2232c80476e4SDavid E. O'Brien c_insert(len); 2233c80476e4SDavid E. O'Brien while (len--) 2234c80476e4SDavid E. O'Brien *Cursor++ = *cp++; 2235c80476e4SDavid E. O'Brien oldcursor = Cursor; 223645e5710bSMark Peek xfree(hbuf); 2237c80476e4SDavid E. O'Brien return(CC_REFRESH); 223845e5710bSMark Peek 223945e5710bSMark Peek err_hbuf: 224045e5710bSMark Peek xfree(hbuf); 224145e5710bSMark Peek return CC_ERROR; 2242c80476e4SDavid E. O'Brien } 2243c80476e4SDavid E. O'Brien 2244c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2245c80476e4SDavid E. O'Brien CCRETVAL 224645e5710bSMark Peek e_yank_kill(Char c) 2247c80476e4SDavid E. O'Brien { /* almost like GnuEmacs */ 22486767bd61SMark Peek int len; 22496767bd61SMark Peek Char *kp, *cp; 2250c80476e4SDavid E. O'Brien 2251c80476e4SDavid E. O'Brien USE(c); 22526767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */ 2253c80476e4SDavid E. O'Brien return(CC_ERROR); 22546767bd61SMark Peek len = Strlen(KillRing[YankPos].buf); 22556767bd61SMark Peek if (LastChar + len >= InputLim) 2256c80476e4SDavid E. O'Brien return(CC_ERROR); /* end of buffer space */ 2257c80476e4SDavid E. O'Brien 2258c80476e4SDavid E. O'Brien /* else */ 2259c80476e4SDavid E. O'Brien cp = Cursor; /* for speed */ 2260c80476e4SDavid E. O'Brien 22616767bd61SMark Peek c_insert(len); /* open the space, */ 22626767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */ 2263c80476e4SDavid E. O'Brien *cp++ = *kp; 2264c80476e4SDavid E. O'Brien 22656767bd61SMark Peek if (Argument == 1) { /* if no arg */ 22666767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */ 22676767bd61SMark Peek Cursor = cp; 22686767bd61SMark Peek } else { 22696767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */ 22706767bd61SMark Peek } 22716767bd61SMark Peek 227245e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) { 227345e5710bSMark Peek ClearLines(); 227445e5710bSMark Peek ClearDisp(); 227545e5710bSMark Peek } 227645e5710bSMark Peek MarkIsSet = 0; 22776767bd61SMark Peek return(CC_REFRESH); 22786767bd61SMark Peek } 22796767bd61SMark Peek 22806767bd61SMark Peek /*ARGSUSED*/ 22816767bd61SMark Peek CCRETVAL 228245e5710bSMark Peek e_yank_pop(Char c) 22836767bd61SMark Peek { /* almost like GnuEmacs */ 22846767bd61SMark Peek int m_bef_c, del_len, ins_len; 22856767bd61SMark Peek Char *kp, *cp; 22866767bd61SMark Peek 22876767bd61SMark Peek USE(c); 22886767bd61SMark Peek 22896767bd61SMark Peek #if 0 22906767bd61SMark Peek /* XXX This "should" be here, but doesn't work, since LastCmd 22916767bd61SMark Peek gets set on CC_ERROR and CC_ARGHACK, which it shouldn't(?). 22926767bd61SMark Peek (But what about F_ARGFOUR?) I.e. if you hit M-y twice the 22936767bd61SMark Peek second one will "succeed" even if the first one wasn't preceded 22946767bd61SMark Peek by a yank, and giving an argument is impossible. Now we "succeed" 22956767bd61SMark Peek regardless of previous command, which is wrong too of course. */ 22966767bd61SMark Peek if (LastCmd != F_YANK_KILL && LastCmd != F_YANK_POP) 22976767bd61SMark Peek return(CC_ERROR); 22986767bd61SMark Peek #endif 22996767bd61SMark Peek 23006767bd61SMark Peek if (KillRingLen == 0) /* nothing killed */ 23016767bd61SMark Peek return(CC_ERROR); 23026767bd61SMark Peek YankPos -= Argument; 23036767bd61SMark Peek while (YankPos < 0) 23046767bd61SMark Peek YankPos += KillRingLen; 23056767bd61SMark Peek YankPos %= KillRingLen; 23066767bd61SMark Peek 23076767bd61SMark Peek if (Cursor > Mark) { 23086767bd61SMark Peek del_len = Cursor - Mark; 23096767bd61SMark Peek m_bef_c = 1; 23106767bd61SMark Peek } else { 23116767bd61SMark Peek del_len = Mark - Cursor; 23126767bd61SMark Peek m_bef_c = 0; 23136767bd61SMark Peek } 23146767bd61SMark Peek ins_len = Strlen(KillRing[YankPos].buf); 23156767bd61SMark Peek if (LastChar + ins_len - del_len >= InputLim) 23166767bd61SMark Peek return(CC_ERROR); /* end of buffer space */ 23176767bd61SMark Peek 23186767bd61SMark Peek if (m_bef_c) { 23196767bd61SMark Peek c_delbefore(del_len); 23206767bd61SMark Peek } else { 23216767bd61SMark Peek c_delafter(del_len); 23226767bd61SMark Peek } 23236767bd61SMark Peek cp = Cursor; /* for speed */ 23246767bd61SMark Peek 23256767bd61SMark Peek c_insert(ins_len); /* open the space, */ 23266767bd61SMark Peek for (kp = KillRing[YankPos].buf; *kp; kp++) /* copy the chars */ 23276767bd61SMark Peek *cp++ = *kp; 23286767bd61SMark Peek 23296767bd61SMark Peek if (m_bef_c) { 23306767bd61SMark Peek Mark = Cursor; /* mark at beginning, cursor at end */ 23316767bd61SMark Peek Cursor = cp; 23326767bd61SMark Peek } else { 23336767bd61SMark Peek Mark = cp; /* else cursor at beginning, mark at end */ 23346767bd61SMark Peek } 2335c80476e4SDavid E. O'Brien 233645e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) { 233745e5710bSMark Peek ClearLines(); 233845e5710bSMark Peek ClearDisp(); 233945e5710bSMark Peek } 234045e5710bSMark Peek MarkIsSet = 0; 2341c80476e4SDavid E. O'Brien return(CC_REFRESH); 2342c80476e4SDavid E. O'Brien } 2343c80476e4SDavid E. O'Brien 2344c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2345c80476e4SDavid E. O'Brien CCRETVAL 234645e5710bSMark Peek v_delprev(Char c) /* Backspace key in insert mode */ 2347c80476e4SDavid E. O'Brien { 2348c80476e4SDavid E. O'Brien int rc; 2349c80476e4SDavid E. O'Brien 2350c80476e4SDavid E. O'Brien USE(c); 2351c80476e4SDavid E. O'Brien rc = CC_ERROR; 2352c80476e4SDavid E. O'Brien 2353c80476e4SDavid E. O'Brien if (InsertPos != 0) { 2354c80476e4SDavid E. O'Brien if (Argument <= Cursor - InsertPos) { 2355c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before */ 2356c80476e4SDavid E. O'Brien rc = CC_REFRESH; 2357c80476e4SDavid E. O'Brien } 2358c80476e4SDavid E. O'Brien } 2359c80476e4SDavid E. O'Brien return(rc); 2360c80476e4SDavid E. O'Brien } /* v_delprev */ 2361c80476e4SDavid E. O'Brien 2362c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2363c80476e4SDavid E. O'Brien CCRETVAL 236445e5710bSMark Peek e_delprev(Char c) 2365c80476e4SDavid E. O'Brien { 2366c80476e4SDavid E. O'Brien USE(c); 2367c80476e4SDavid E. O'Brien if (Cursor > InputBuf) { 2368c80476e4SDavid E. O'Brien c_delbefore(Argument); /* delete before dot */ 2369c80476e4SDavid E. O'Brien return(CC_REFRESH); 2370c80476e4SDavid E. O'Brien } 2371c80476e4SDavid E. O'Brien else { 2372c80476e4SDavid E. O'Brien return(CC_ERROR); 2373c80476e4SDavid E. O'Brien } 2374c80476e4SDavid E. O'Brien } 2375c80476e4SDavid E. O'Brien 2376c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2377c80476e4SDavid E. O'Brien CCRETVAL 237845e5710bSMark Peek e_delwordprev(Char c) 2379c80476e4SDavid E. O'Brien { 23806767bd61SMark Peek Char *cp; 2381c80476e4SDavid E. O'Brien 2382c80476e4SDavid E. O'Brien USE(c); 2383c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 2384c80476e4SDavid E. O'Brien return(CC_ERROR); 2385c80476e4SDavid E. O'Brien /* else */ 2386c80476e4SDavid E. O'Brien 2387c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument); 2388c80476e4SDavid E. O'Brien 23896767bd61SMark Peek c_push_kill(cp, Cursor); /* save the text */ 2390c80476e4SDavid E. O'Brien 2391c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - cp)); /* delete before dot */ 2392c80476e4SDavid E. O'Brien return(CC_REFRESH); 2393c80476e4SDavid E. O'Brien } 2394c80476e4SDavid E. O'Brien 2395c80476e4SDavid E. O'Brien /* DCS <dcs@neutron.chem.yale.edu>, 9 Oct 93 2396c80476e4SDavid E. O'Brien * 2397c80476e4SDavid E. O'Brien * Changed the names of some of the ^D family of editor functions to 2398c80476e4SDavid E. O'Brien * correspond to what they actually do and created new e_delnext_list 2399c80476e4SDavid E. O'Brien * for completeness. 2400c80476e4SDavid E. O'Brien * 2401c80476e4SDavid E. O'Brien * Old names: New names: 2402c80476e4SDavid E. O'Brien * 2403c80476e4SDavid E. O'Brien * delete-char delete-char-or-eof 2404c80476e4SDavid E. O'Brien * F_DELNEXT F_DELNEXT_EOF 2405c80476e4SDavid E. O'Brien * e_delnext e_delnext_eof 2406c80476e4SDavid E. O'Brien * edelnxt edelnxteof 2407c80476e4SDavid E. O'Brien * delete-char-or-eof delete-char 2408c80476e4SDavid E. O'Brien * F_DELNEXT_EOF F_DELNEXT 2409c80476e4SDavid E. O'Brien * e_delnext_eof e_delnext 2410c80476e4SDavid E. O'Brien * edelnxteof edelnxt 2411c80476e4SDavid E. O'Brien * delete-char-or-list delete-char-or-list-or-eof 2412c80476e4SDavid E. O'Brien * F_LIST_DELNEXT F_DELNEXT_LIST_EOF 2413c80476e4SDavid E. O'Brien * e_list_delnext e_delnext_list_eof 2414c80476e4SDavid E. O'Brien * edellsteof 2415c80476e4SDavid E. O'Brien * (no old equivalent) delete-char-or-list 2416c80476e4SDavid E. O'Brien * F_DELNEXT_LIST 2417c80476e4SDavid E. O'Brien * e_delnext_list 2418c80476e4SDavid E. O'Brien * e_delnxtlst 2419c80476e4SDavid E. O'Brien */ 2420c80476e4SDavid E. O'Brien 2421c80476e4SDavid E. O'Brien /* added by mtk@ari.ncl.omron.co.jp (920818) */ 2422c80476e4SDavid E. O'Brien /* rename e_delnext() -> e_delnext_eof() */ 2423c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2424c80476e4SDavid E. O'Brien CCRETVAL 242545e5710bSMark Peek e_delnext(Char c) 2426c80476e4SDavid E. O'Brien { 2427c80476e4SDavid E. O'Brien USE(c); 2428c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */ 2429c80476e4SDavid E. O'Brien if (!VImode) { 2430c80476e4SDavid E. O'Brien return(CC_ERROR); 2431c80476e4SDavid E. O'Brien } 2432c80476e4SDavid E. O'Brien else { 2433c80476e4SDavid E. O'Brien if (Cursor != InputBuf) 2434c80476e4SDavid E. O'Brien Cursor--; 2435c80476e4SDavid E. O'Brien else 2436c80476e4SDavid E. O'Brien return(CC_ERROR); 2437c80476e4SDavid E. O'Brien } 2438c80476e4SDavid E. O'Brien } 2439c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2440c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2441c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2442c80476e4SDavid E. O'Brien return(CC_REFRESH); 2443c80476e4SDavid E. O'Brien } 2444c80476e4SDavid E. O'Brien 2445c80476e4SDavid E. O'Brien 2446c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2447c80476e4SDavid E. O'Brien CCRETVAL 244845e5710bSMark Peek e_delnext_eof(Char c) 2449c80476e4SDavid E. O'Brien { 2450c80476e4SDavid E. O'Brien USE(c); 2451c80476e4SDavid E. O'Brien if (Cursor == LastChar) {/* if I'm at the end */ 2452c80476e4SDavid E. O'Brien if (!VImode) { 2453c80476e4SDavid E. O'Brien if (Cursor == InputBuf) { 2454c80476e4SDavid E. O'Brien /* if I'm also at the beginning */ 2455c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */ 2456c80476e4SDavid E. O'Brien flush(); 2457c80476e4SDavid E. O'Brien return(CC_EOF); 2458c80476e4SDavid E. O'Brien } 2459c80476e4SDavid E. O'Brien else 2460c80476e4SDavid E. O'Brien return(CC_ERROR); 2461c80476e4SDavid E. O'Brien } 2462c80476e4SDavid E. O'Brien else { 2463c80476e4SDavid E. O'Brien if (Cursor != InputBuf) 2464c80476e4SDavid E. O'Brien Cursor--; 2465c80476e4SDavid E. O'Brien else 2466c80476e4SDavid E. O'Brien return(CC_ERROR); 2467c80476e4SDavid E. O'Brien } 2468c80476e4SDavid E. O'Brien } 2469c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2470c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2471c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2472c80476e4SDavid E. O'Brien return(CC_REFRESH); 2473c80476e4SDavid E. O'Brien } 2474c80476e4SDavid E. O'Brien 2475c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2476c80476e4SDavid E. O'Brien CCRETVAL 247745e5710bSMark Peek e_delnext_list(Char c) 2478c80476e4SDavid E. O'Brien { 2479c80476e4SDavid E. O'Brien USE(c); 2480c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */ 2481c80476e4SDavid E. O'Brien PastBottom(); 2482c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2483c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2484c80476e4SDavid E. O'Brien } 2485c80476e4SDavid E. O'Brien else { 2486c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2487c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2488c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2489c80476e4SDavid E. O'Brien return(CC_REFRESH); 2490c80476e4SDavid E. O'Brien } 2491c80476e4SDavid E. O'Brien } 2492c80476e4SDavid E. O'Brien 2493c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2494c80476e4SDavid E. O'Brien CCRETVAL 249545e5710bSMark Peek e_delnext_list_eof(Char c) 2496c80476e4SDavid E. O'Brien { 2497c80476e4SDavid E. O'Brien USE(c); 2498c80476e4SDavid E. O'Brien if (Cursor == LastChar) { /* if I'm at the end */ 2499c80476e4SDavid E. O'Brien if (Cursor == InputBuf) { /* if I'm also at the beginning */ 2500c80476e4SDavid E. O'Brien so_write(STReof, 4);/* then do a EOF */ 2501c80476e4SDavid E. O'Brien flush(); 2502c80476e4SDavid E. O'Brien return(CC_EOF); 2503c80476e4SDavid E. O'Brien } 2504c80476e4SDavid E. O'Brien else { 2505c80476e4SDavid E. O'Brien PastBottom(); 2506c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2507c80476e4SDavid E. O'Brien return(CC_LIST_CHOICES); 2508c80476e4SDavid E. O'Brien } 2509c80476e4SDavid E. O'Brien } 2510c80476e4SDavid E. O'Brien else { 2511c80476e4SDavid E. O'Brien c_delafter(Argument); /* delete after dot */ 2512c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2513c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2514c80476e4SDavid E. O'Brien return(CC_REFRESH); 2515c80476e4SDavid E. O'Brien } 2516c80476e4SDavid E. O'Brien } 2517c80476e4SDavid E. O'Brien 2518c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2519c80476e4SDavid E. O'Brien CCRETVAL 252045e5710bSMark Peek e_list_eof(Char c) 2521c80476e4SDavid E. O'Brien { 2522c80476e4SDavid E. O'Brien CCRETVAL rv; 2523c80476e4SDavid E. O'Brien 2524c80476e4SDavid E. O'Brien USE(c); 2525c80476e4SDavid E. O'Brien if (Cursor == LastChar && Cursor == InputBuf) { 2526c80476e4SDavid E. O'Brien so_write(STReof, 4); /* then do a EOF */ 2527c80476e4SDavid E. O'Brien flush(); 2528c80476e4SDavid E. O'Brien rv = CC_EOF; 2529c80476e4SDavid E. O'Brien } 2530c80476e4SDavid E. O'Brien else { 2531c80476e4SDavid E. O'Brien PastBottom(); 2532c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 2533c80476e4SDavid E. O'Brien rv = CC_LIST_CHOICES; 2534c80476e4SDavid E. O'Brien } 2535c80476e4SDavid E. O'Brien return rv; 2536c80476e4SDavid E. O'Brien } 2537c80476e4SDavid E. O'Brien 2538c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2539c80476e4SDavid E. O'Brien CCRETVAL 254045e5710bSMark Peek e_delwordnext(Char c) 2541c80476e4SDavid E. O'Brien { 25426767bd61SMark Peek Char *cp; 2543c80476e4SDavid E. O'Brien 2544c80476e4SDavid E. O'Brien USE(c); 2545c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2546c80476e4SDavid E. O'Brien return(CC_ERROR); 2547c80476e4SDavid E. O'Brien /* else */ 2548c80476e4SDavid E. O'Brien 2549c80476e4SDavid E. O'Brien cp = c_next_word(Cursor, LastChar, Argument); 2550c80476e4SDavid E. O'Brien 25516767bd61SMark Peek c_push_kill(Cursor, cp); /* save the text */ 2552c80476e4SDavid E. O'Brien 2553c80476e4SDavid E. O'Brien c_delafter((int)(cp - Cursor)); /* delete after dot */ 2554c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2555c80476e4SDavid E. O'Brien Cursor = LastChar; /* bounds check */ 2556c80476e4SDavid E. O'Brien return(CC_REFRESH); 2557c80476e4SDavid E. O'Brien } 2558c80476e4SDavid E. O'Brien 2559c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2560c80476e4SDavid E. O'Brien CCRETVAL 256145e5710bSMark Peek e_toend(Char c) 2562c80476e4SDavid E. O'Brien { 2563c80476e4SDavid E. O'Brien USE(c); 2564c80476e4SDavid E. O'Brien Cursor = LastChar; 2565c80476e4SDavid E. O'Brien if (VImode) 2566c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2567c80476e4SDavid E. O'Brien c_delfini(); 2568c80476e4SDavid E. O'Brien return(CC_REFRESH); 2569c80476e4SDavid E. O'Brien } 2570c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 2571c80476e4SDavid E. O'Brien return(CC_NORM); 2572c80476e4SDavid E. O'Brien } 2573c80476e4SDavid E. O'Brien 2574c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2575c80476e4SDavid E. O'Brien CCRETVAL 257645e5710bSMark Peek e_tobeg(Char c) 2577c80476e4SDavid E. O'Brien { 2578c80476e4SDavid E. O'Brien USE(c); 2579c80476e4SDavid E. O'Brien Cursor = InputBuf; 2580c80476e4SDavid E. O'Brien 2581c80476e4SDavid E. O'Brien if (VImode) { 2582c80476e4SDavid E. O'Brien while (Isspace(*Cursor)) /* We want FIRST non space character */ 2583c80476e4SDavid E. O'Brien Cursor++; 2584c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2585c80476e4SDavid E. O'Brien c_delfini(); 2586c80476e4SDavid E. O'Brien return(CC_REFRESH); 2587c80476e4SDavid E. O'Brien } 2588c80476e4SDavid E. O'Brien } 2589c80476e4SDavid E. O'Brien 2590c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 2591c80476e4SDavid E. O'Brien return(CC_NORM); 2592c80476e4SDavid E. O'Brien } 2593c80476e4SDavid E. O'Brien 2594c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2595c80476e4SDavid E. O'Brien CCRETVAL 259645e5710bSMark Peek e_killend(Char c) 2597c80476e4SDavid E. O'Brien { 2598c80476e4SDavid E. O'Brien USE(c); 25996767bd61SMark Peek c_push_kill(Cursor, LastChar); /* copy it */ 260045e5710bSMark Peek LastChar = Cursor; /* zap! -- delete to end */ 260145e5710bSMark Peek if (Mark > Cursor) 260245e5710bSMark Peek Mark = Cursor; 260345e5710bSMark Peek MarkIsSet = 0; 2604c80476e4SDavid E. O'Brien return(CC_REFRESH); 2605c80476e4SDavid E. O'Brien } 2606c80476e4SDavid E. O'Brien 2607c80476e4SDavid E. O'Brien 2608c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2609c80476e4SDavid E. O'Brien CCRETVAL 261045e5710bSMark Peek e_killbeg(Char c) 2611c80476e4SDavid E. O'Brien { 2612c80476e4SDavid E. O'Brien USE(c); 26136767bd61SMark Peek c_push_kill(InputBuf, Cursor); /* copy it */ 2614c80476e4SDavid E. O'Brien c_delbefore((int)(Cursor - InputBuf)); 261523338178SMark Peek if (Mark && Mark > Cursor) 261623338178SMark Peek Mark -= Cursor-InputBuf; 2617c80476e4SDavid E. O'Brien return(CC_REFRESH); 2618c80476e4SDavid E. O'Brien } 2619c80476e4SDavid E. O'Brien 2620c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2621c80476e4SDavid E. O'Brien CCRETVAL 262245e5710bSMark Peek e_killall(Char c) 2623c80476e4SDavid E. O'Brien { 2624c80476e4SDavid E. O'Brien USE(c); 26256767bd61SMark Peek c_push_kill(InputBuf, LastChar); /* copy it */ 262623338178SMark Peek Cursor = Mark = LastChar = InputBuf; /* zap! -- delete all of it */ 262745e5710bSMark Peek MarkIsSet = 0; 2628c80476e4SDavid E. O'Brien return(CC_REFRESH); 2629c80476e4SDavid E. O'Brien } 2630c80476e4SDavid E. O'Brien 2631c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2632c80476e4SDavid E. O'Brien CCRETVAL 263345e5710bSMark Peek e_killregion(Char c) 2634c80476e4SDavid E. O'Brien { 2635c80476e4SDavid E. O'Brien USE(c); 2636c80476e4SDavid E. O'Brien if (!Mark) 2637c80476e4SDavid E. O'Brien return(CC_ERROR); 2638c80476e4SDavid E. O'Brien 2639c80476e4SDavid E. O'Brien if (Mark > Cursor) { 26406767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */ 26416767bd61SMark Peek c_delafter((int)(Mark - Cursor)); /* delete it - UNUSED BY VI mode */ 26426767bd61SMark Peek Mark = Cursor; 2643c80476e4SDavid E. O'Brien } 2644c80476e4SDavid E. O'Brien else { /* mark is before cursor */ 26456767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */ 26466767bd61SMark Peek c_delbefore((int)(Cursor - Mark)); 2647c80476e4SDavid E. O'Brien } 264845e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet) { 264945e5710bSMark Peek ClearLines(); 265045e5710bSMark Peek ClearDisp(); 265145e5710bSMark Peek } 265245e5710bSMark Peek MarkIsSet = 0; 2653c80476e4SDavid E. O'Brien return(CC_REFRESH); 2654c80476e4SDavid E. O'Brien } 2655c80476e4SDavid E. O'Brien 2656c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2657c80476e4SDavid E. O'Brien CCRETVAL 265845e5710bSMark Peek e_copyregion(Char c) 2659c80476e4SDavid E. O'Brien { 2660c80476e4SDavid E. O'Brien USE(c); 2661c80476e4SDavid E. O'Brien if (!Mark) 2662c80476e4SDavid E. O'Brien return(CC_ERROR); 2663c80476e4SDavid E. O'Brien 2664c80476e4SDavid E. O'Brien if (Mark > Cursor) { 26656767bd61SMark Peek c_push_kill(Cursor, Mark); /* copy it */ 2666c80476e4SDavid E. O'Brien } 2667c80476e4SDavid E. O'Brien else { /* mark is before cursor */ 26686767bd61SMark Peek c_push_kill(Mark, Cursor); /* copy it */ 2669c80476e4SDavid E. O'Brien } 2670c80476e4SDavid E. O'Brien return(CC_NORM); /* don't even need to Refresh() */ 2671c80476e4SDavid E. O'Brien } 2672c80476e4SDavid E. O'Brien 2673c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2674c80476e4SDavid E. O'Brien CCRETVAL 267545e5710bSMark Peek e_charswitch(Char cc) 2676c80476e4SDavid E. O'Brien { 26776767bd61SMark Peek Char c; 2678c80476e4SDavid E. O'Brien 2679c80476e4SDavid E. O'Brien USE(cc); 2680c80476e4SDavid E. O'Brien 2681c80476e4SDavid E. O'Brien /* do nothing if we are at beginning of line or have only one char */ 2682c80476e4SDavid E. O'Brien if (Cursor == &InputBuf[0] || LastChar == &InputBuf[1]) { 2683c80476e4SDavid E. O'Brien return(CC_ERROR); 2684c80476e4SDavid E. O'Brien } 2685c80476e4SDavid E. O'Brien 2686c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 2687c80476e4SDavid E. O'Brien Cursor++; 2688c80476e4SDavid E. O'Brien } 2689c80476e4SDavid E. O'Brien c = Cursor[-2]; 2690c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1]; 2691c80476e4SDavid E. O'Brien Cursor[-1] = c; 2692c80476e4SDavid E. O'Brien return(CC_REFRESH); 2693c80476e4SDavid E. O'Brien } 2694c80476e4SDavid E. O'Brien 2695c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2696c80476e4SDavid E. O'Brien CCRETVAL 269745e5710bSMark Peek e_gcharswitch(Char cc) 2698c80476e4SDavid E. O'Brien { /* gosmacs style ^T */ 26996767bd61SMark Peek Char c; 2700c80476e4SDavid E. O'Brien 2701c80476e4SDavid E. O'Brien USE(cc); 2702c80476e4SDavid E. O'Brien if (Cursor > &InputBuf[1]) {/* must have at least two chars entered */ 2703c80476e4SDavid E. O'Brien c = Cursor[-2]; 2704c80476e4SDavid E. O'Brien Cursor[-2] = Cursor[-1]; 2705c80476e4SDavid E. O'Brien Cursor[-1] = c; 2706c80476e4SDavid E. O'Brien return(CC_REFRESH); 2707c80476e4SDavid E. O'Brien } 2708c80476e4SDavid E. O'Brien else { 2709c80476e4SDavid E. O'Brien return(CC_ERROR); 2710c80476e4SDavid E. O'Brien } 2711c80476e4SDavid E. O'Brien } 2712c80476e4SDavid E. O'Brien 2713c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2714c80476e4SDavid E. O'Brien CCRETVAL 271545e5710bSMark Peek e_charback(Char c) 2716c80476e4SDavid E. O'Brien { 2717c80476e4SDavid E. O'Brien USE(c); 2718c80476e4SDavid E. O'Brien if (Cursor > InputBuf) { 271945e5710bSMark Peek if (Argument > Cursor - InputBuf) 2720c80476e4SDavid E. O'Brien Cursor = InputBuf; 2721c80476e4SDavid E. O'Brien else 272245e5710bSMark Peek Cursor -= Argument; 2723c80476e4SDavid E. O'Brien 2724c80476e4SDavid E. O'Brien if (VImode) 2725c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2726c80476e4SDavid E. O'Brien c_delfini(); 2727c80476e4SDavid E. O'Brien return(CC_REFRESH); 2728c80476e4SDavid E. O'Brien } 2729c80476e4SDavid E. O'Brien 2730c80476e4SDavid E. O'Brien RefCursor(); 2731c80476e4SDavid E. O'Brien return(CC_NORM); 2732c80476e4SDavid E. O'Brien } 2733c80476e4SDavid E. O'Brien else { 2734c80476e4SDavid E. O'Brien return(CC_ERROR); 2735c80476e4SDavid E. O'Brien } 2736c80476e4SDavid E. O'Brien } 2737c80476e4SDavid E. O'Brien 2738c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2739c80476e4SDavid E. O'Brien CCRETVAL 274045e5710bSMark Peek v_wordback(Char c) 2741c80476e4SDavid E. O'Brien { 2742c80476e4SDavid E. O'Brien USE(c); 2743c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 2744c80476e4SDavid E. O'Brien return(CC_ERROR); 2745c80476e4SDavid E. O'Brien /* else */ 2746c80476e4SDavid E. O'Brien 27476767bd61SMark Peek Cursor = c_preword(Cursor, InputBuf, Argument, STRshwspace); /* bounds check */ 2748c80476e4SDavid E. O'Brien 2749c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2750c80476e4SDavid E. O'Brien c_delfini(); 2751c80476e4SDavid E. O'Brien return(CC_REFRESH); 2752c80476e4SDavid E. O'Brien } 2753c80476e4SDavid E. O'Brien 2754c80476e4SDavid E. O'Brien RefCursor(); 2755c80476e4SDavid E. O'Brien return(CC_NORM); 2756c80476e4SDavid E. O'Brien } 2757c80476e4SDavid E. O'Brien 2758c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2759c80476e4SDavid E. O'Brien CCRETVAL 276045e5710bSMark Peek e_wordback(Char 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 /*ARGSUSED*/ 2780c80476e4SDavid E. O'Brien CCRETVAL 278145e5710bSMark Peek e_charfwd(Char c) 2782c80476e4SDavid E. O'Brien { 2783c80476e4SDavid E. O'Brien USE(c); 2784c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 278545e5710bSMark Peek Cursor += Argument; 2786c80476e4SDavid E. O'Brien if (Cursor > LastChar) 2787c80476e4SDavid E. O'Brien Cursor = LastChar; 2788c80476e4SDavid E. O'Brien 2789c80476e4SDavid E. O'Brien if (VImode) 2790c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2791c80476e4SDavid E. O'Brien c_delfini(); 2792c80476e4SDavid E. O'Brien return(CC_REFRESH); 2793c80476e4SDavid E. O'Brien } 2794c80476e4SDavid E. O'Brien 2795c80476e4SDavid E. O'Brien RefCursor(); 2796c80476e4SDavid E. O'Brien return(CC_NORM); 2797c80476e4SDavid E. O'Brien } 2798c80476e4SDavid E. O'Brien else { 2799c80476e4SDavid E. O'Brien return(CC_ERROR); 2800c80476e4SDavid E. O'Brien } 2801c80476e4SDavid E. O'Brien } 2802c80476e4SDavid E. O'Brien 2803c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2804c80476e4SDavid E. O'Brien CCRETVAL 280545e5710bSMark Peek e_wordfwd(Char c) 2806c80476e4SDavid E. O'Brien { 2807c80476e4SDavid E. O'Brien USE(c); 2808c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2809c80476e4SDavid E. O'Brien return(CC_ERROR); 2810c80476e4SDavid E. O'Brien /* else */ 2811c80476e4SDavid E. O'Brien 2812c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument); 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 2824c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2825c80476e4SDavid E. O'Brien CCRETVAL 282645e5710bSMark Peek v_wordfwd(Char c) 2827c80476e4SDavid E. O'Brien { 2828c80476e4SDavid E. O'Brien USE(c); 2829c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2830c80476e4SDavid E. O'Brien return(CC_ERROR); 2831c80476e4SDavid E. O'Brien /* else */ 2832c80476e4SDavid E. O'Brien 2833c80476e4SDavid E. O'Brien Cursor = c_nexword(Cursor, LastChar, Argument); 2834c80476e4SDavid E. O'Brien 2835c80476e4SDavid E. O'Brien if (VImode) 2836c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2837c80476e4SDavid E. O'Brien c_delfini(); 2838c80476e4SDavid E. O'Brien return(CC_REFRESH); 2839c80476e4SDavid E. O'Brien } 2840c80476e4SDavid E. O'Brien 2841c80476e4SDavid E. O'Brien RefCursor(); 2842c80476e4SDavid E. O'Brien return(CC_NORM); 2843c80476e4SDavid E. O'Brien } 2844c80476e4SDavid E. O'Brien 2845c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2846c80476e4SDavid E. O'Brien CCRETVAL 284745e5710bSMark Peek v_wordbegnext(Char c) 2848c80476e4SDavid E. O'Brien { 2849c80476e4SDavid E. O'Brien USE(c); 2850c80476e4SDavid E. O'Brien if (Cursor == LastChar) 2851c80476e4SDavid E. O'Brien return(CC_ERROR); 2852c80476e4SDavid E. O'Brien /* else */ 2853c80476e4SDavid E. O'Brien 2854c80476e4SDavid E. O'Brien Cursor = c_next_word(Cursor, LastChar, Argument); 2855c80476e4SDavid E. O'Brien if (Cursor < LastChar) 2856c80476e4SDavid E. O'Brien Cursor++; 2857c80476e4SDavid E. O'Brien 2858c80476e4SDavid E. O'Brien if (VImode) 2859c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2860c80476e4SDavid E. O'Brien c_delfini(); 2861c80476e4SDavid E. O'Brien return(CC_REFRESH); 2862c80476e4SDavid E. O'Brien } 2863c80476e4SDavid E. O'Brien 2864c80476e4SDavid E. O'Brien RefCursor(); 2865c80476e4SDavid E. O'Brien return(CC_NORM); 2866c80476e4SDavid E. O'Brien } 2867c80476e4SDavid E. O'Brien 2868c80476e4SDavid E. O'Brien /*ARGSUSED*/ 2869c80476e4SDavid E. O'Brien static CCRETVAL 287045e5710bSMark Peek v_repeat_srch(int c) 2871c80476e4SDavid E. O'Brien { 2872c80476e4SDavid E. O'Brien CCRETVAL rv = CC_ERROR; 2873c80476e4SDavid E. O'Brien #ifdef SDEBUG 2874c80476e4SDavid E. O'Brien xprintf("dir %d patlen %d patbuf %S\n", 287545e5710bSMark Peek c, (int)patbuf.len, patbuf.s); 2876c80476e4SDavid E. O'Brien #endif 2877c80476e4SDavid E. O'Brien 2878c80476e4SDavid E. O'Brien LastCmd = (KEYCMD) c; /* Hack to stop c_hsetpat */ 2879c80476e4SDavid E. O'Brien LastChar = InputBuf; 2880c80476e4SDavid E. O'Brien switch (c) { 2881c80476e4SDavid E. O'Brien case F_DOWN_SEARCH_HIST: 2882c80476e4SDavid E. O'Brien rv = e_down_search_hist(0); 2883c80476e4SDavid E. O'Brien break; 2884c80476e4SDavid E. O'Brien case F_UP_SEARCH_HIST: 2885c80476e4SDavid E. O'Brien rv = e_up_search_hist(0); 2886c80476e4SDavid E. O'Brien break; 2887c80476e4SDavid E. O'Brien default: 2888c80476e4SDavid E. O'Brien break; 2889c80476e4SDavid E. O'Brien } 2890c80476e4SDavid E. O'Brien return rv; 2891c80476e4SDavid E. O'Brien } 2892c80476e4SDavid E. O'Brien 2893c80476e4SDavid E. O'Brien static CCRETVAL 289445e5710bSMark Peek v_csearch_back(Char ch, int count, int tflag) 2895c80476e4SDavid E. O'Brien { 2896c80476e4SDavid E. O'Brien Char *cp; 2897c80476e4SDavid E. O'Brien 2898c80476e4SDavid E. O'Brien cp = Cursor; 2899c80476e4SDavid E. O'Brien while (count--) { 2900c80476e4SDavid E. O'Brien if (*cp == ch) 2901c80476e4SDavid E. O'Brien cp--; 2902c80476e4SDavid E. O'Brien while (cp > InputBuf && *cp != ch) 2903c80476e4SDavid E. O'Brien cp--; 2904c80476e4SDavid E. O'Brien } 2905c80476e4SDavid E. O'Brien 2906c80476e4SDavid E. O'Brien if (cp < InputBuf || (cp == InputBuf && *cp != ch)) 2907c80476e4SDavid E. O'Brien return(CC_ERROR); 2908c80476e4SDavid E. O'Brien 2909c80476e4SDavid E. O'Brien if (*cp == ch && tflag) 2910c80476e4SDavid E. O'Brien cp++; 2911c80476e4SDavid E. O'Brien 2912c80476e4SDavid E. O'Brien Cursor = cp; 2913c80476e4SDavid E. O'Brien 2914c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2915c80476e4SDavid E. O'Brien Cursor++; 2916c80476e4SDavid E. O'Brien c_delfini(); 2917c80476e4SDavid E. O'Brien return(CC_REFRESH); 2918c80476e4SDavid E. O'Brien } 2919c80476e4SDavid E. O'Brien 2920c80476e4SDavid E. O'Brien RefCursor(); 2921c80476e4SDavid E. O'Brien return(CC_NORM); 2922c80476e4SDavid E. O'Brien } 2923c80476e4SDavid E. O'Brien 2924c80476e4SDavid E. O'Brien static CCRETVAL 292545e5710bSMark Peek v_csearch_fwd(Char ch, int count, int tflag) 2926c80476e4SDavid E. O'Brien { 2927c80476e4SDavid E. O'Brien Char *cp; 2928c80476e4SDavid E. O'Brien 2929c80476e4SDavid E. O'Brien cp = Cursor; 2930c80476e4SDavid E. O'Brien while (count--) { 2931c80476e4SDavid E. O'Brien if(*cp == ch) 2932c80476e4SDavid E. O'Brien cp++; 2933c80476e4SDavid E. O'Brien while (cp < LastChar && *cp != ch) 2934c80476e4SDavid E. O'Brien cp++; 2935c80476e4SDavid E. O'Brien } 2936c80476e4SDavid E. O'Brien 2937c80476e4SDavid E. O'Brien if (cp >= LastChar) 2938c80476e4SDavid E. O'Brien return(CC_ERROR); 2939c80476e4SDavid E. O'Brien 2940c80476e4SDavid E. O'Brien if (*cp == ch && tflag) 2941c80476e4SDavid E. O'Brien cp--; 2942c80476e4SDavid E. O'Brien 2943c80476e4SDavid E. O'Brien Cursor = cp; 2944c80476e4SDavid E. O'Brien 2945c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 2946c80476e4SDavid E. O'Brien Cursor++; 2947c80476e4SDavid E. O'Brien c_delfini(); 2948c80476e4SDavid E. O'Brien return(CC_REFRESH); 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 /*ARGSUSED*/ 2955c80476e4SDavid E. O'Brien static CCRETVAL 295645e5710bSMark Peek v_action(int c) 2957c80476e4SDavid E. O'Brien { 29586767bd61SMark Peek Char *cp, *kp; 2959c80476e4SDavid E. O'Brien 2960c80476e4SDavid E. O'Brien if (ActionFlag == TCSHOP_DELETE) { 2961c80476e4SDavid E. O'Brien ActionFlag = TCSHOP_NOP; 2962c80476e4SDavid E. O'Brien ActionPos = 0; 2963c80476e4SDavid E. O'Brien 2964c80476e4SDavid E. O'Brien UndoSize = 0; 2965c80476e4SDavid E. O'Brien kp = UndoBuf; 2966c80476e4SDavid E. O'Brien for (cp = InputBuf; cp < LastChar; cp++) { 2967c80476e4SDavid E. O'Brien *kp++ = *cp; 2968c80476e4SDavid E. O'Brien UndoSize++; 2969c80476e4SDavid E. O'Brien } 2970c80476e4SDavid E. O'Brien 2971c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 2972c80476e4SDavid E. O'Brien UndoPtr = InputBuf; 2973c80476e4SDavid E. O'Brien LastChar = InputBuf; 2974c80476e4SDavid E. O'Brien Cursor = InputBuf; 2975c80476e4SDavid E. O'Brien if (c & TCSHOP_INSERT) 2976c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 2977c80476e4SDavid E. O'Brien 2978c80476e4SDavid E. O'Brien return(CC_REFRESH); 2979c80476e4SDavid E. O'Brien } 2980c80476e4SDavid E. O'Brien #ifdef notdef 2981c80476e4SDavid E. O'Brien else if (ActionFlag == TCSHOP_NOP) { 2982c80476e4SDavid E. O'Brien #endif 2983c80476e4SDavid E. O'Brien ActionPos = Cursor; 2984c80476e4SDavid E. O'Brien ActionFlag = c; 2985c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* Do NOT clear out argument */ 2986c80476e4SDavid E. O'Brien #ifdef notdef 2987c80476e4SDavid E. O'Brien } 2988c80476e4SDavid E. O'Brien else { 2989c80476e4SDavid E. O'Brien ActionFlag = 0; 2990c80476e4SDavid E. O'Brien ActionPos = 0; 2991c80476e4SDavid E. O'Brien return(CC_ERROR); 2992c80476e4SDavid E. O'Brien } 2993c80476e4SDavid E. O'Brien #endif 2994c80476e4SDavid E. O'Brien } 2995c80476e4SDavid E. O'Brien 2996c80476e4SDavid E. O'Brien #ifdef COMMENT 2997c80476e4SDavid E. O'Brien /* by: Brian Allison <uiucdcs!convex!allison@RUTGERS.EDU> */ 2998c80476e4SDavid E. O'Brien static void 299945e5710bSMark Peek c_get_word(Char **begin, Char **end) 3000c80476e4SDavid E. O'Brien { 3001c80476e4SDavid E. O'Brien Char *cp; 3002c80476e4SDavid E. O'Brien 3003c80476e4SDavid E. O'Brien cp = &Cursor[0]; 3004c80476e4SDavid E. O'Brien while (Argument--) { 3005c80476e4SDavid E. O'Brien while ((cp <= LastChar) && (isword(*cp))) 3006c80476e4SDavid E. O'Brien cp++; 3007c80476e4SDavid E. O'Brien *end = --cp; 3008c80476e4SDavid E. O'Brien while ((cp >= InputBuf) && (isword(*cp))) 3009c80476e4SDavid E. O'Brien cp--; 3010c80476e4SDavid E. O'Brien *begin = ++cp; 3011c80476e4SDavid E. O'Brien } 3012c80476e4SDavid E. O'Brien } 3013c80476e4SDavid E. O'Brien #endif /* COMMENT */ 3014c80476e4SDavid E. O'Brien 3015c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3016c80476e4SDavid E. O'Brien CCRETVAL 301745e5710bSMark Peek e_uppercase(Char c) 3018c80476e4SDavid E. O'Brien { 3019c80476e4SDavid E. O'Brien Char *cp, *end; 3020c80476e4SDavid E. O'Brien 3021c80476e4SDavid E. O'Brien USE(c); 3022c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3023c80476e4SDavid E. O'Brien 3024c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++) /* PWP: was cp=begin */ 3025c80476e4SDavid E. O'Brien if (Islower(*cp)) 3026c80476e4SDavid E. O'Brien *cp = Toupper(*cp); 3027c80476e4SDavid E. O'Brien 3028c80476e4SDavid E. O'Brien Cursor = end; 3029c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3030c80476e4SDavid E. O'Brien Cursor = LastChar; 3031c80476e4SDavid E. O'Brien return(CC_REFRESH); 3032c80476e4SDavid E. O'Brien } 3033c80476e4SDavid E. O'Brien 3034c80476e4SDavid E. O'Brien 3035c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3036c80476e4SDavid E. O'Brien CCRETVAL 303719d2e3deSDmitry Chagin e_capitalcase(Char c) 3038c80476e4SDavid E. O'Brien { 3039c80476e4SDavid E. O'Brien Char *cp, *end; 3040c80476e4SDavid E. O'Brien 3041c80476e4SDavid E. O'Brien USE(c); 3042c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3043c80476e4SDavid E. O'Brien 3044c80476e4SDavid E. O'Brien cp = Cursor; 3045c80476e4SDavid E. O'Brien for (; cp < end; cp++) { 3046c80476e4SDavid E. O'Brien if (Isalpha(*cp)) { 3047c80476e4SDavid E. O'Brien if (Islower(*cp)) 3048c80476e4SDavid E. O'Brien *cp = Toupper(*cp); 3049c80476e4SDavid E. O'Brien cp++; 3050c80476e4SDavid E. O'Brien break; 3051c80476e4SDavid E. O'Brien } 3052c80476e4SDavid E. O'Brien } 3053c80476e4SDavid E. O'Brien for (; cp < end; cp++) 3054c80476e4SDavid E. O'Brien if (Isupper(*cp)) 3055c80476e4SDavid E. O'Brien *cp = Tolower(*cp); 3056c80476e4SDavid E. O'Brien 3057c80476e4SDavid E. O'Brien Cursor = end; 3058c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3059c80476e4SDavid E. O'Brien Cursor = LastChar; 3060c80476e4SDavid E. O'Brien return(CC_REFRESH); 3061c80476e4SDavid E. O'Brien } 3062c80476e4SDavid E. O'Brien 3063c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3064c80476e4SDavid E. O'Brien CCRETVAL 306545e5710bSMark Peek e_lowercase(Char c) 3066c80476e4SDavid E. O'Brien { 3067c80476e4SDavid E. O'Brien Char *cp, *end; 3068c80476e4SDavid E. O'Brien 3069c80476e4SDavid E. O'Brien USE(c); 3070c80476e4SDavid E. O'Brien end = c_next_word(Cursor, LastChar, Argument); 3071c80476e4SDavid E. O'Brien 3072c80476e4SDavid E. O'Brien for (cp = Cursor; cp < end; cp++) 3073c80476e4SDavid E. O'Brien if (Isupper(*cp)) 3074c80476e4SDavid E. O'Brien *cp = Tolower(*cp); 3075c80476e4SDavid E. O'Brien 3076c80476e4SDavid E. O'Brien Cursor = end; 3077c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3078c80476e4SDavid E. O'Brien Cursor = LastChar; 3079c80476e4SDavid E. O'Brien return(CC_REFRESH); 3080c80476e4SDavid E. O'Brien } 3081c80476e4SDavid E. O'Brien 3082c80476e4SDavid E. O'Brien 3083c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3084c80476e4SDavid E. O'Brien CCRETVAL 308545e5710bSMark Peek e_set_mark(Char c) 3086c80476e4SDavid E. O'Brien { 3087c80476e4SDavid E. O'Brien USE(c); 308845e5710bSMark Peek if (adrof(STRhighlight) && MarkIsSet && Mark != Cursor) { 308945e5710bSMark Peek ClearLines(); 309045e5710bSMark Peek ClearDisp(); 309145e5710bSMark Peek Refresh(); 309245e5710bSMark Peek } 3093c80476e4SDavid E. O'Brien Mark = Cursor; 309445e5710bSMark Peek MarkIsSet = 1; 3095c80476e4SDavid E. O'Brien return(CC_NORM); 3096c80476e4SDavid E. O'Brien } 3097c80476e4SDavid E. O'Brien 3098c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3099c80476e4SDavid E. O'Brien CCRETVAL 310045e5710bSMark Peek e_exchange_mark(Char c) 3101c80476e4SDavid E. O'Brien { 31026767bd61SMark Peek Char *cp; 3103c80476e4SDavid E. O'Brien 3104c80476e4SDavid E. O'Brien USE(c); 3105c80476e4SDavid E. O'Brien cp = Cursor; 3106c80476e4SDavid E. O'Brien Cursor = Mark; 3107c80476e4SDavid E. O'Brien Mark = cp; 3108c80476e4SDavid E. O'Brien RefCursor(); 3109c80476e4SDavid E. O'Brien return(CC_NORM); 3110c80476e4SDavid E. O'Brien } 3111c80476e4SDavid E. O'Brien 3112c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3113c80476e4SDavid E. O'Brien CCRETVAL 311445e5710bSMark Peek e_argfour(Char c) 3115c80476e4SDavid E. O'Brien { /* multiply current argument by 4 */ 3116c80476e4SDavid E. O'Brien USE(c); 3117c80476e4SDavid E. O'Brien if (Argument > 1000000) 3118c80476e4SDavid E. O'Brien return CC_ERROR; 3119c80476e4SDavid E. O'Brien DoingArg = 1; 3120c80476e4SDavid E. O'Brien Argument *= 4; 3121c80476e4SDavid E. O'Brien return(CC_ARGHACK); 3122c80476e4SDavid E. O'Brien } 3123c80476e4SDavid E. O'Brien 312445e5710bSMark Peek static void 312545e5710bSMark Peek quote_mode_cleanup(void *unused) 312645e5710bSMark Peek { 312745e5710bSMark Peek USE(unused); 312845e5710bSMark Peek QuoteModeOff(); 312945e5710bSMark Peek } 313045e5710bSMark Peek 3131c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3132c80476e4SDavid E. O'Brien CCRETVAL 313345e5710bSMark Peek e_quote(Char c) 3134c80476e4SDavid E. O'Brien { 3135c80476e4SDavid E. O'Brien Char ch; 3136c80476e4SDavid E. O'Brien int num; 3137c80476e4SDavid E. O'Brien 3138c80476e4SDavid E. O'Brien USE(c); 3139c80476e4SDavid E. O'Brien QuoteModeOn(); 314045e5710bSMark Peek cleanup_push(&c, quote_mode_cleanup); /* Using &c just as a mark */ 3141c80476e4SDavid E. O'Brien num = GetNextChar(&ch); 314245e5710bSMark Peek cleanup_until(&c); 3143c80476e4SDavid E. O'Brien if (num == 1) 3144c80476e4SDavid E. O'Brien return e_insert(ch); 3145c80476e4SDavid E. O'Brien else 3146c80476e4SDavid E. O'Brien return e_send_eof(0); 3147c80476e4SDavid E. O'Brien } 3148c80476e4SDavid E. O'Brien 3149c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3150c80476e4SDavid E. O'Brien CCRETVAL 315145e5710bSMark Peek e_metanext(Char c) 3152c80476e4SDavid E. O'Brien { 3153c80476e4SDavid E. O'Brien USE(c); 3154c80476e4SDavid E. O'Brien MetaNext = 1; 3155c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */ 3156c80476e4SDavid E. O'Brien } 3157c80476e4SDavid E. O'Brien 3158c80476e4SDavid E. O'Brien #ifdef notdef 3159c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3160c80476e4SDavid E. O'Brien CCRETVAL 316145e5710bSMark Peek e_extendnext(Char c) 3162c80476e4SDavid E. O'Brien { 3163c80476e4SDavid E. O'Brien CurrentKeyMap = CcAltMap; 3164c80476e4SDavid E. O'Brien return(CC_ARGHACK); /* preserve argument */ 3165c80476e4SDavid E. O'Brien } 3166c80476e4SDavid E. O'Brien 3167c80476e4SDavid E. O'Brien #endif 3168c80476e4SDavid E. O'Brien 3169c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3170c80476e4SDavid E. O'Brien CCRETVAL 317145e5710bSMark Peek v_insbeg(Char c) 3172c80476e4SDavid E. O'Brien { /* move to beginning of line and start vi 3173c80476e4SDavid E. O'Brien * insert mode */ 3174c80476e4SDavid E. O'Brien USE(c); 3175c80476e4SDavid E. O'Brien Cursor = InputBuf; 3176c80476e4SDavid E. O'Brien InsertPos = Cursor; 3177c80476e4SDavid E. O'Brien 3178c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3179c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3180c80476e4SDavid E. O'Brien 3181c80476e4SDavid E. O'Brien RefCursor(); /* move the cursor */ 3182c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3183c80476e4SDavid E. O'Brien return(CC_NORM); 3184c80476e4SDavid E. O'Brien } 3185c80476e4SDavid E. O'Brien 3186c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3187c80476e4SDavid E. O'Brien CCRETVAL 318845e5710bSMark Peek v_replone(Char c) 3189c80476e4SDavid E. O'Brien { /* vi mode overwrite one character */ 3190c80476e4SDavid E. O'Brien USE(c); 3191c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3192c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE_1; 3193c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */ 3194c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3195c80476e4SDavid E. O'Brien UndoSize = 0; 3196c80476e4SDavid E. O'Brien return(CC_NORM); 3197c80476e4SDavid E. O'Brien } 3198c80476e4SDavid E. O'Brien 3199c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3200c80476e4SDavid E. O'Brien CCRETVAL 320145e5710bSMark Peek v_replmode(Char c) 3202c80476e4SDavid E. O'Brien { /* vi mode start overwriting */ 3203c80476e4SDavid E. O'Brien USE(c); 3204c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3205c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE; 3206c80476e4SDavid E. O'Brien UndoAction = TCSHOP_CHANGE; /* Set Up for VI undo command */ 3207c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3208c80476e4SDavid E. O'Brien UndoSize = 0; 3209c80476e4SDavid E. O'Brien return(CC_NORM); 3210c80476e4SDavid E. O'Brien } 3211c80476e4SDavid E. O'Brien 3212c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3213c80476e4SDavid E. O'Brien CCRETVAL 321445e5710bSMark Peek v_substchar(Char c) 3215c80476e4SDavid E. O'Brien { /* vi mode substitute for one char */ 3216c80476e4SDavid E. O'Brien USE(c); 3217c80476e4SDavid E. O'Brien c_delafter(Argument); 3218c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3219c80476e4SDavid E. O'Brien return(CC_REFRESH); 3220c80476e4SDavid E. O'Brien } 3221c80476e4SDavid E. O'Brien 3222c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3223c80476e4SDavid E. O'Brien CCRETVAL 322445e5710bSMark Peek v_substline(Char c) 3225c80476e4SDavid E. O'Brien { /* vi mode replace whole line */ 3226c80476e4SDavid E. O'Brien USE(c); 3227c80476e4SDavid E. O'Brien (void) e_killall(0); 3228c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3229c80476e4SDavid E. O'Brien return(CC_REFRESH); 3230c80476e4SDavid E. O'Brien } 3231c80476e4SDavid E. O'Brien 3232c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3233c80476e4SDavid E. O'Brien CCRETVAL 323445e5710bSMark Peek v_chgtoend(Char c) 3235c80476e4SDavid E. O'Brien { /* vi mode change to end of line */ 3236c80476e4SDavid E. O'Brien USE(c); 3237c80476e4SDavid E. O'Brien (void) e_killend(0); 3238c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3239c80476e4SDavid E. O'Brien return(CC_REFRESH); 3240c80476e4SDavid E. O'Brien } 3241c80476e4SDavid E. O'Brien 3242c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3243c80476e4SDavid E. O'Brien CCRETVAL 324445e5710bSMark Peek v_insert(Char c) 3245c80476e4SDavid E. O'Brien { /* vi mode start inserting */ 3246c80476e4SDavid E. O'Brien USE(c); 3247c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3248c80476e4SDavid E. O'Brien 3249c80476e4SDavid E. O'Brien InsertPos = Cursor; 3250c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3251c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3252c80476e4SDavid E. O'Brien 3253c80476e4SDavid E. O'Brien return(CC_NORM); 3254c80476e4SDavid E. O'Brien } 3255c80476e4SDavid E. O'Brien 3256c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3257c80476e4SDavid E. O'Brien CCRETVAL 325845e5710bSMark Peek v_add(Char c) 3259c80476e4SDavid E. O'Brien { /* vi mode start adding */ 3260c80476e4SDavid E. O'Brien USE(c); 3261c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3262c80476e4SDavid E. O'Brien if (Cursor < LastChar) 3263c80476e4SDavid E. O'Brien { 3264c80476e4SDavid E. O'Brien Cursor++; 3265c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3266c80476e4SDavid E. O'Brien Cursor = LastChar; 3267c80476e4SDavid E. O'Brien RefCursor(); 3268c80476e4SDavid E. O'Brien } 3269c80476e4SDavid E. O'Brien 3270c80476e4SDavid E. O'Brien InsertPos = Cursor; 3271c80476e4SDavid E. O'Brien UndoPtr = Cursor; 3272c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3273c80476e4SDavid E. O'Brien 3274c80476e4SDavid E. O'Brien return(CC_NORM); 3275c80476e4SDavid E. O'Brien } 3276c80476e4SDavid E. O'Brien 3277c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3278c80476e4SDavid E. O'Brien CCRETVAL 327945e5710bSMark Peek v_addend(Char c) 3280c80476e4SDavid E. O'Brien { /* vi mode to add at end of line */ 3281c80476e4SDavid E. O'Brien USE(c); 3282c80476e4SDavid E. O'Brien c_alternativ_key_map(0); 3283c80476e4SDavid E. O'Brien Cursor = LastChar; 3284c80476e4SDavid E. O'Brien 3285c80476e4SDavid E. O'Brien InsertPos = LastChar; /* Mark where insertion begins */ 3286c80476e4SDavid E. O'Brien UndoPtr = LastChar; 3287c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3288c80476e4SDavid E. O'Brien 3289c80476e4SDavid E. O'Brien RefCursor(); 3290c80476e4SDavid E. O'Brien return(CC_NORM); 3291c80476e4SDavid E. O'Brien } 3292c80476e4SDavid E. O'Brien 3293c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3294c80476e4SDavid E. O'Brien CCRETVAL 329545e5710bSMark Peek v_change_case(Char cc) 3296c80476e4SDavid E. O'Brien { 329723338178SMark Peek Char c; 3298c80476e4SDavid E. O'Brien 3299c80476e4SDavid E. O'Brien USE(cc); 3300c80476e4SDavid E. O'Brien if (Cursor < LastChar) { 33013b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 3302c80476e4SDavid E. O'Brien c = *Cursor; 3303c80476e4SDavid E. O'Brien #else 3304c80476e4SDavid E. O'Brien c = CHAR & *Cursor; 33053b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 3306c80476e4SDavid E. O'Brien if (Isupper(c)) 3307c80476e4SDavid E. O'Brien *Cursor++ = Tolower(c); 3308c80476e4SDavid E. O'Brien else if (Islower(c)) 3309c80476e4SDavid E. O'Brien *Cursor++ = Toupper(c); 3310c80476e4SDavid E. O'Brien else 3311c80476e4SDavid E. O'Brien Cursor++; 331223338178SMark Peek RefPlusOne(1); /* fast refresh for one char */ 3313c80476e4SDavid E. O'Brien return(CC_NORM); 3314c80476e4SDavid E. O'Brien } 3315c80476e4SDavid E. O'Brien return(CC_ERROR); 3316c80476e4SDavid E. O'Brien } 3317c80476e4SDavid E. O'Brien 3318c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3319c80476e4SDavid E. O'Brien CCRETVAL 332045e5710bSMark Peek e_expand(Char c) 3321c80476e4SDavid E. O'Brien { 33226767bd61SMark Peek Char *p; 3323c80476e4SDavid E. O'Brien 3324c80476e4SDavid E. O'Brien USE(c); 3325c80476e4SDavid E. O'Brien for (p = InputBuf; Isspace(*p); p++) 3326c80476e4SDavid E. O'Brien continue; 3327c80476e4SDavid E. O'Brien if (p == LastChar) 3328c80476e4SDavid E. O'Brien return(CC_ERROR); 3329c80476e4SDavid E. O'Brien 3330c80476e4SDavid E. O'Brien justpr++; 3331c80476e4SDavid E. O'Brien Expand++; 3332c80476e4SDavid E. O'Brien return(e_newline(0)); 3333c80476e4SDavid E. O'Brien } 3334c80476e4SDavid E. O'Brien 3335c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3336c80476e4SDavid E. O'Brien CCRETVAL 333745e5710bSMark Peek e_startover(Char c) 3338c80476e4SDavid E. O'Brien { /* erase all of current line, start again */ 3339c80476e4SDavid E. O'Brien USE(c); 3340c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */ 3341c80476e4SDavid E. O'Brien return(CC_REFRESH); 3342c80476e4SDavid E. O'Brien } 3343c80476e4SDavid E. O'Brien 3344c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3345c80476e4SDavid E. O'Brien CCRETVAL 334645e5710bSMark Peek e_redisp(Char c) 3347c80476e4SDavid E. O'Brien { 3348c80476e4SDavid E. O'Brien USE(c); 3349c80476e4SDavid E. O'Brien ClearLines(); 3350c80476e4SDavid E. O'Brien ClearDisp(); 3351c80476e4SDavid E. O'Brien return(CC_REFRESH); 3352c80476e4SDavid E. O'Brien } 3353c80476e4SDavid E. O'Brien 3354c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3355c80476e4SDavid E. O'Brien CCRETVAL 335645e5710bSMark Peek e_cleardisp(Char c) 3357c80476e4SDavid E. O'Brien { 3358c80476e4SDavid E. O'Brien USE(c); 3359c80476e4SDavid E. O'Brien ClearScreen(); /* clear the whole real screen */ 3360c80476e4SDavid E. O'Brien ClearDisp(); /* reset everything */ 3361c80476e4SDavid E. O'Brien return(CC_REFRESH); 3362c80476e4SDavid E. O'Brien } 3363c80476e4SDavid E. O'Brien 3364c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3365c80476e4SDavid E. O'Brien CCRETVAL 336645e5710bSMark Peek e_tty_int(Char c) 3367c80476e4SDavid E. O'Brien { 3368c80476e4SDavid E. O'Brien USE(c); 33693b6eaa7bSAndrey A. Chernov #if defined(_MINIX) || defined(WINNT_NATIVE) 3370c80476e4SDavid E. O'Brien /* SAK PATCH: erase all of current line, start again */ 3371c80476e4SDavid E. O'Brien ResetInLine(0); /* reset the input pointers */ 3372c80476e4SDavid E. O'Brien xputchar('\n'); 3373c80476e4SDavid E. O'Brien ClearDisp(); 3374c80476e4SDavid E. O'Brien return (CC_REFRESH); 33753b6eaa7bSAndrey A. Chernov #else /* !_MINIX && !WINNT_NATIVE */ 3376c80476e4SDavid E. O'Brien /* do no editing */ 3377c80476e4SDavid E. O'Brien return (CC_NORM); 33783b6eaa7bSAndrey A. Chernov #endif /* _MINIX || WINNT_NATIVE */ 3379c80476e4SDavid E. O'Brien } 3380c80476e4SDavid E. O'Brien 3381c80476e4SDavid E. O'Brien /* 3382c80476e4SDavid E. O'Brien * From: ghazi@cesl.rutgers.edu (Kaveh R. Ghazi) 3383c80476e4SDavid E. O'Brien * Function to send a character back to the input stream in cooked 3384c80476e4SDavid E. O'Brien * mode. Only works if we have TIOCSTI 3385c80476e4SDavid E. O'Brien */ 3386c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3387c80476e4SDavid E. O'Brien CCRETVAL 338845e5710bSMark Peek e_stuff_char(Char c) 3389c80476e4SDavid E. O'Brien { 3390c80476e4SDavid E. O'Brien #ifdef TIOCSTI 3391c80476e4SDavid E. O'Brien int was_raw = Tty_raw_mode; 339223338178SMark Peek char buf[MB_LEN_MAX]; 339323338178SMark Peek size_t i, len; 3394c80476e4SDavid E. O'Brien 3395c80476e4SDavid E. O'Brien if (was_raw) 3396c80476e4SDavid E. O'Brien (void) Cookedmode(); 3397c80476e4SDavid E. O'Brien 339845e5710bSMark Peek (void) xwrite(SHIN, "\n", 1); 339919d2e3deSDmitry Chagin len = one_wctomb(buf, c); 340023338178SMark Peek for (i = 0; i < len; i++) 340123338178SMark Peek (void) ioctl(SHIN, TIOCSTI, (ioctl_t) &buf[i]); 3402c80476e4SDavid E. O'Brien 3403c80476e4SDavid E. O'Brien if (was_raw) 3404c80476e4SDavid E. O'Brien (void) Rawmode(); 3405c80476e4SDavid E. O'Brien return(e_redisp(c)); 3406c80476e4SDavid E. O'Brien #else /* !TIOCSTI */ 3407c80476e4SDavid E. O'Brien return(CC_ERROR); 3408c80476e4SDavid E. O'Brien #endif /* !TIOCSTI */ 3409c80476e4SDavid E. O'Brien } 3410c80476e4SDavid E. O'Brien 3411c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3412c80476e4SDavid E. O'Brien CCRETVAL 341345e5710bSMark Peek e_insovr(Char c) 3414c80476e4SDavid E. O'Brien { 3415c80476e4SDavid E. O'Brien USE(c); 3416c80476e4SDavid E. O'Brien inputmode = (inputmode == MODE_INSERT ? MODE_REPLACE : MODE_INSERT); 3417c80476e4SDavid E. O'Brien return(CC_NORM); 3418c80476e4SDavid E. O'Brien } 3419c80476e4SDavid E. O'Brien 3420c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3421c80476e4SDavid E. O'Brien CCRETVAL 342245e5710bSMark Peek e_tty_dsusp(Char c) 3423c80476e4SDavid E. O'Brien { 3424c80476e4SDavid E. O'Brien USE(c); 3425c80476e4SDavid E. O'Brien /* do no editing */ 3426c80476e4SDavid E. O'Brien return(CC_NORM); 3427c80476e4SDavid E. O'Brien } 3428c80476e4SDavid E. O'Brien 3429c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3430c80476e4SDavid E. O'Brien CCRETVAL 343145e5710bSMark Peek e_tty_flusho(Char c) 3432c80476e4SDavid E. O'Brien { 3433c80476e4SDavid E. O'Brien USE(c); 3434c80476e4SDavid E. O'Brien /* do no editing */ 3435c80476e4SDavid E. O'Brien return(CC_NORM); 3436c80476e4SDavid E. O'Brien } 3437c80476e4SDavid E. O'Brien 3438c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3439c80476e4SDavid E. O'Brien CCRETVAL 344045e5710bSMark Peek e_tty_quit(Char c) 3441c80476e4SDavid E. O'Brien { 3442c80476e4SDavid E. O'Brien USE(c); 3443c80476e4SDavid E. O'Brien /* do no editing */ 3444c80476e4SDavid E. O'Brien return(CC_NORM); 3445c80476e4SDavid E. O'Brien } 3446c80476e4SDavid E. O'Brien 3447c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3448c80476e4SDavid E. O'Brien CCRETVAL 344945e5710bSMark Peek e_tty_tsusp(Char c) 3450c80476e4SDavid E. O'Brien { 3451c80476e4SDavid E. O'Brien USE(c); 3452c80476e4SDavid E. O'Brien /* do no editing */ 3453c80476e4SDavid E. O'Brien return(CC_NORM); 3454c80476e4SDavid E. O'Brien } 3455c80476e4SDavid E. O'Brien 3456c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3457c80476e4SDavid E. O'Brien CCRETVAL 345845e5710bSMark Peek e_tty_stopo(Char c) 3459c80476e4SDavid E. O'Brien { 3460c80476e4SDavid E. O'Brien USE(c); 3461c80476e4SDavid E. O'Brien /* do no editing */ 3462c80476e4SDavid E. O'Brien return(CC_NORM); 3463c80476e4SDavid E. O'Brien } 3464c80476e4SDavid E. O'Brien 3465a15e6f9aSMark Peek /* returns the number of (attempted) expansions */ 3466a15e6f9aSMark Peek int 3467a15e6f9aSMark Peek ExpandHistory(void) 3468a15e6f9aSMark Peek { 3469a15e6f9aSMark Peek *LastChar = '\0'; /* just in case */ 3470a15e6f9aSMark Peek return c_substitute(); 3471a15e6f9aSMark Peek } 3472a15e6f9aSMark Peek 3473c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3474c80476e4SDavid E. O'Brien CCRETVAL 347545e5710bSMark Peek e_expand_history(Char c) 3476c80476e4SDavid E. O'Brien { 3477c80476e4SDavid E. O'Brien USE(c); 3478a15e6f9aSMark Peek (void)ExpandHistory(); 3479c80476e4SDavid E. O'Brien return(CC_NORM); 3480c80476e4SDavid E. O'Brien } 3481c80476e4SDavid E. O'Brien 3482c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3483c80476e4SDavid E. O'Brien CCRETVAL 348445e5710bSMark Peek e_magic_space(Char c) 3485c80476e4SDavid E. O'Brien { 3486c80476e4SDavid E. O'Brien USE(c); 3487c80476e4SDavid E. O'Brien *LastChar = '\0'; /* just in case */ 3488a15e6f9aSMark Peek (void)c_substitute(); 3489c80476e4SDavid E. O'Brien return(e_insert(' ')); 3490c80476e4SDavid E. O'Brien } 3491c80476e4SDavid E. O'Brien 3492c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3493c80476e4SDavid E. O'Brien CCRETVAL 349445e5710bSMark Peek e_inc_fwd(Char c) 3495c80476e4SDavid E. O'Brien { 349645e5710bSMark Peek CCRETVAL ret; 349745e5710bSMark Peek 3498c80476e4SDavid E. O'Brien USE(c); 349945e5710bSMark Peek patbuf.len = 0; 350045e5710bSMark Peek MarkIsSet = 0; 350145e5710bSMark Peek ret = e_inc_search(F_DOWN_SEARCH_HIST); 350245e5710bSMark Peek if (adrof(STRhighlight) && IncMatchLen) { 350345e5710bSMark Peek IncMatchLen = 0; 350445e5710bSMark Peek ClearLines(); 350545e5710bSMark Peek ClearDisp(); 350645e5710bSMark Peek Refresh(); 350745e5710bSMark Peek } 350845e5710bSMark Peek IncMatchLen = 0; 350945e5710bSMark Peek return ret; 3510c80476e4SDavid E. O'Brien } 3511c80476e4SDavid E. O'Brien 3512c80476e4SDavid E. O'Brien 3513c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3514c80476e4SDavid E. O'Brien CCRETVAL 351545e5710bSMark Peek e_inc_back(Char c) 3516c80476e4SDavid E. O'Brien { 351745e5710bSMark Peek CCRETVAL ret; 351845e5710bSMark Peek 3519c80476e4SDavid E. O'Brien USE(c); 352045e5710bSMark Peek patbuf.len = 0; 352145e5710bSMark Peek MarkIsSet = 0; 352245e5710bSMark Peek ret = e_inc_search(F_UP_SEARCH_HIST); 352345e5710bSMark Peek if (adrof(STRhighlight) && IncMatchLen) { 352445e5710bSMark Peek IncMatchLen = 0; 352545e5710bSMark Peek ClearLines(); 352645e5710bSMark Peek ClearDisp(); 352745e5710bSMark Peek Refresh(); 352845e5710bSMark Peek } 352945e5710bSMark Peek IncMatchLen = 0; 353045e5710bSMark Peek return ret; 3531c80476e4SDavid E. O'Brien } 3532c80476e4SDavid E. O'Brien 3533c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3534c80476e4SDavid E. O'Brien CCRETVAL 353545e5710bSMark Peek e_copyprev(Char c) 3536c80476e4SDavid E. O'Brien { 35376767bd61SMark Peek Char *cp, *oldc, *dp; 3538c80476e4SDavid E. O'Brien 3539c80476e4SDavid E. O'Brien USE(c); 3540c80476e4SDavid E. O'Brien if (Cursor == InputBuf) 3541c80476e4SDavid E. O'Brien return(CC_ERROR); 3542c80476e4SDavid E. O'Brien /* else */ 3543c80476e4SDavid E. O'Brien 3544c80476e4SDavid E. O'Brien oldc = Cursor; 3545c80476e4SDavid E. O'Brien /* does a bounds check */ 3546c80476e4SDavid E. O'Brien cp = c_prev_word(Cursor, InputBuf, Argument); 3547c80476e4SDavid E. O'Brien 3548c80476e4SDavid E. O'Brien c_insert((int)(oldc - cp)); 3549c80476e4SDavid E. O'Brien for (dp = oldc; cp < oldc && dp < LastChar; cp++) 3550c80476e4SDavid E. O'Brien *dp++ = *cp; 3551c80476e4SDavid E. O'Brien 3552c80476e4SDavid E. O'Brien Cursor = dp; /* put cursor at end */ 3553c80476e4SDavid E. O'Brien 3554c80476e4SDavid E. O'Brien return(CC_REFRESH); 3555c80476e4SDavid E. O'Brien } 3556c80476e4SDavid E. O'Brien 3557c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3558c80476e4SDavid E. O'Brien CCRETVAL 355945e5710bSMark Peek e_tty_starto(Char c) 3560c80476e4SDavid E. O'Brien { 3561c80476e4SDavid E. O'Brien USE(c); 3562c80476e4SDavid E. O'Brien /* do no editing */ 3563c80476e4SDavid E. O'Brien return(CC_NORM); 3564c80476e4SDavid E. O'Brien } 3565c80476e4SDavid E. O'Brien 3566c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3567c80476e4SDavid E. O'Brien CCRETVAL 356845e5710bSMark Peek e_load_average(Char c) 3569c80476e4SDavid E. O'Brien { 3570c80476e4SDavid E. O'Brien USE(c); 3571c80476e4SDavid E. O'Brien PastBottom(); 3572c80476e4SDavid E. O'Brien #ifdef TIOCSTAT 3573c80476e4SDavid E. O'Brien /* 3574c80476e4SDavid E. O'Brien * Here we pass &c to the ioctl because some os's (NetBSD) expect it 3575c80476e4SDavid E. O'Brien * there even if they don't use it. (lukem@netbsd.org) 3576c80476e4SDavid E. O'Brien */ 3577c80476e4SDavid E. O'Brien if (ioctl(SHIN, TIOCSTAT, (ioctl_t) &c) < 0) 3578c80476e4SDavid E. O'Brien #endif 3579a15e6f9aSMark Peek xprintf("%s", CGETS(5, 1, "Load average unavailable\n")); 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 358545e5710bSMark Peek v_chgmeta(Char c) 3586c80476e4SDavid E. O'Brien { 3587c80476e4SDavid E. O'Brien USE(c); 3588c80476e4SDavid E. O'Brien /* 3589c80476e4SDavid E. O'Brien * Delete with insert == change: first we delete and then we leave in 3590c80476e4SDavid E. O'Brien * insert mode. 3591c80476e4SDavid E. O'Brien */ 3592c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE|TCSHOP_INSERT)); 3593c80476e4SDavid E. O'Brien } 3594c80476e4SDavid E. O'Brien 3595c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3596c80476e4SDavid E. O'Brien CCRETVAL 359745e5710bSMark Peek v_delmeta(Char c) 3598c80476e4SDavid E. O'Brien { 3599c80476e4SDavid E. O'Brien USE(c); 3600c80476e4SDavid E. O'Brien return(v_action(TCSHOP_DELETE)); 3601c80476e4SDavid E. O'Brien } 3602c80476e4SDavid E. O'Brien 3603c80476e4SDavid E. O'Brien 3604c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3605c80476e4SDavid E. O'Brien CCRETVAL 360645e5710bSMark Peek v_endword(Char c) 3607c80476e4SDavid E. O'Brien { 3608c80476e4SDavid E. O'Brien USE(c); 3609c80476e4SDavid E. O'Brien if (Cursor == LastChar) 3610c80476e4SDavid E. O'Brien return(CC_ERROR); 3611c80476e4SDavid E. O'Brien /* else */ 3612c80476e4SDavid E. O'Brien 36136767bd61SMark Peek Cursor = c_endword(Cursor, LastChar, Argument, STRshwspace); 3614c80476e4SDavid E. O'Brien 3615c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) 3616c80476e4SDavid E. O'Brien { 3617c80476e4SDavid E. O'Brien Cursor++; 3618c80476e4SDavid E. O'Brien c_delfini(); 3619c80476e4SDavid E. O'Brien return(CC_REFRESH); 3620c80476e4SDavid E. O'Brien } 3621c80476e4SDavid E. O'Brien 3622c80476e4SDavid E. O'Brien RefCursor(); 3623c80476e4SDavid E. O'Brien return(CC_NORM); 3624c80476e4SDavid E. O'Brien } 3625c80476e4SDavid E. O'Brien 3626c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3627c80476e4SDavid E. O'Brien CCRETVAL 362845e5710bSMark Peek v_eword(Char c) 3629c80476e4SDavid E. O'Brien { 3630c80476e4SDavid E. O'Brien USE(c); 3631c80476e4SDavid E. O'Brien if (Cursor == LastChar) 3632c80476e4SDavid E. O'Brien return(CC_ERROR); 3633c80476e4SDavid E. O'Brien /* else */ 3634c80476e4SDavid E. O'Brien 3635c80476e4SDavid E. O'Brien Cursor = c_eword(Cursor, LastChar, Argument); 3636c80476e4SDavid E. O'Brien 3637c80476e4SDavid E. O'Brien if (ActionFlag & TCSHOP_DELETE) { 3638c80476e4SDavid E. O'Brien Cursor++; 3639c80476e4SDavid E. O'Brien c_delfini(); 3640c80476e4SDavid E. O'Brien return(CC_REFRESH); 3641c80476e4SDavid E. O'Brien } 3642c80476e4SDavid E. O'Brien 3643c80476e4SDavid E. O'Brien RefCursor(); 3644c80476e4SDavid E. O'Brien return(CC_NORM); 3645c80476e4SDavid E. O'Brien } 3646c80476e4SDavid E. O'Brien 3647c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3648c80476e4SDavid E. O'Brien CCRETVAL 364945e5710bSMark Peek v_char_fwd(Char c) 3650c80476e4SDavid E. O'Brien { 3651c80476e4SDavid E. O'Brien Char ch; 3652c80476e4SDavid E. O'Brien 3653c80476e4SDavid E. O'Brien USE(c); 3654c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3655c80476e4SDavid E. O'Brien return e_send_eof(0); 3656c80476e4SDavid E. O'Brien 3657c80476e4SDavid E. O'Brien srch_dir = CHAR_FWD; 3658c80476e4SDavid E. O'Brien srch_char = ch; 3659c80476e4SDavid E. O'Brien 3660c80476e4SDavid E. O'Brien return v_csearch_fwd(ch, Argument, 0); 3661c80476e4SDavid E. O'Brien 3662c80476e4SDavid E. O'Brien } 3663c80476e4SDavid E. O'Brien 3664c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3665c80476e4SDavid E. O'Brien CCRETVAL 366645e5710bSMark Peek v_char_back(Char c) 3667c80476e4SDavid E. O'Brien { 3668c80476e4SDavid E. O'Brien Char ch; 3669c80476e4SDavid E. O'Brien 3670c80476e4SDavid E. O'Brien USE(c); 3671c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3672c80476e4SDavid E. O'Brien return e_send_eof(0); 3673c80476e4SDavid E. O'Brien 3674c80476e4SDavid E. O'Brien srch_dir = CHAR_BACK; 3675c80476e4SDavid E. O'Brien srch_char = ch; 3676c80476e4SDavid E. O'Brien 3677c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 0); 3678c80476e4SDavid E. O'Brien } 3679c80476e4SDavid E. O'Brien 3680c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3681c80476e4SDavid E. O'Brien CCRETVAL 368245e5710bSMark Peek v_charto_fwd(Char 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 return v_csearch_fwd(ch, Argument, 1); 3691c80476e4SDavid E. O'Brien 3692c80476e4SDavid E. O'Brien } 3693c80476e4SDavid E. O'Brien 3694c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3695c80476e4SDavid E. O'Brien CCRETVAL 369645e5710bSMark Peek v_charto_back(Char c) 3697c80476e4SDavid E. O'Brien { 3698c80476e4SDavid E. O'Brien Char ch; 3699c80476e4SDavid E. O'Brien 3700c80476e4SDavid E. O'Brien USE(c); 3701c80476e4SDavid E. O'Brien if (GetNextChar(&ch) != 1) 3702c80476e4SDavid E. O'Brien return e_send_eof(0); 3703c80476e4SDavid E. O'Brien 3704c80476e4SDavid E. O'Brien return v_csearch_back(ch, Argument, 1); 3705c80476e4SDavid E. O'Brien } 3706c80476e4SDavid E. O'Brien 3707c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3708c80476e4SDavid E. O'Brien CCRETVAL 370945e5710bSMark Peek v_rchar_fwd(Char c) 3710c80476e4SDavid E. O'Brien { 3711c80476e4SDavid E. O'Brien USE(c); 3712c80476e4SDavid E. O'Brien if (srch_char == 0) 3713c80476e4SDavid E. O'Brien return CC_ERROR; 3714c80476e4SDavid E. O'Brien 3715c80476e4SDavid E. O'Brien return srch_dir == CHAR_FWD ? v_csearch_fwd(srch_char, Argument, 0) : 3716c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0); 3717c80476e4SDavid E. O'Brien } 3718c80476e4SDavid E. O'Brien 3719c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3720c80476e4SDavid E. O'Brien CCRETVAL 372145e5710bSMark Peek v_rchar_back(Char c) 3722c80476e4SDavid E. O'Brien { 3723c80476e4SDavid E. O'Brien USE(c); 3724c80476e4SDavid E. O'Brien if (srch_char == 0) 3725c80476e4SDavid E. O'Brien return CC_ERROR; 3726c80476e4SDavid E. O'Brien 3727c80476e4SDavid E. O'Brien return srch_dir == CHAR_BACK ? v_csearch_fwd(srch_char, Argument, 0) : 3728c80476e4SDavid E. O'Brien v_csearch_back(srch_char, Argument, 0); 3729c80476e4SDavid E. O'Brien } 3730c80476e4SDavid E. O'Brien 3731c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3732c80476e4SDavid E. O'Brien CCRETVAL 373345e5710bSMark Peek v_undo(Char c) 3734c80476e4SDavid E. O'Brien { 37356767bd61SMark Peek int loop; 37366767bd61SMark Peek Char *kp, *cp; 3737c80476e4SDavid E. O'Brien Char temp; 3738c80476e4SDavid E. O'Brien int size; 3739c80476e4SDavid E. O'Brien 3740c80476e4SDavid E. O'Brien USE(c); 3741c80476e4SDavid E. O'Brien switch (UndoAction) { 3742c80476e4SDavid E. O'Brien case TCSHOP_DELETE|TCSHOP_INSERT: 3743c80476e4SDavid E. O'Brien case TCSHOP_DELETE: 3744c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3745c80476e4SDavid E. O'Brien cp = UndoPtr; 3746c80476e4SDavid E. O'Brien kp = UndoBuf; 3747c80476e4SDavid E. O'Brien for (loop=0; loop < UndoSize; loop++) /* copy the chars */ 3748c80476e4SDavid E. O'Brien *kp++ = *cp++; /* into UndoBuf */ 3749c80476e4SDavid E. O'Brien 3750c80476e4SDavid E. O'Brien for (cp = UndoPtr; cp <= LastChar; cp++) 3751c80476e4SDavid E. O'Brien *cp = cp[UndoSize]; 3752c80476e4SDavid E. O'Brien 3753c80476e4SDavid E. O'Brien LastChar -= UndoSize; 3754c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3755c80476e4SDavid E. O'Brien 3756c80476e4SDavid E. O'Brien UndoAction = TCSHOP_INSERT; 3757c80476e4SDavid E. O'Brien break; 3758c80476e4SDavid E. O'Brien 3759c80476e4SDavid E. O'Brien case TCSHOP_INSERT: 3760c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3761c80476e4SDavid E. O'Brien cp = UndoPtr; 3762c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3763c80476e4SDavid E. O'Brien kp = UndoBuf; 3764c80476e4SDavid E. O'Brien c_insert(UndoSize); /* open the space, */ 3765c80476e4SDavid E. O'Brien for (loop = 0; loop < UndoSize; loop++) /* copy the chars */ 3766c80476e4SDavid E. O'Brien *cp++ = *kp++; 3767c80476e4SDavid E. O'Brien 3768c80476e4SDavid E. O'Brien UndoAction = TCSHOP_DELETE; 3769c80476e4SDavid E. O'Brien break; 3770c80476e4SDavid E. O'Brien 3771c80476e4SDavid E. O'Brien case TCSHOP_CHANGE: 3772c80476e4SDavid E. O'Brien if (UndoSize == 0) return(CC_NORM); 3773c80476e4SDavid E. O'Brien cp = UndoPtr; 3774c80476e4SDavid E. O'Brien Cursor = UndoPtr; 3775c80476e4SDavid E. O'Brien kp = UndoBuf; 3776c80476e4SDavid E. O'Brien size = (int)(Cursor-LastChar); /* NOT NSL independant */ 3777c80476e4SDavid E. O'Brien if (size < UndoSize) 3778c80476e4SDavid E. O'Brien size = UndoSize; 3779c80476e4SDavid E. O'Brien for(loop = 0; loop < size; loop++) { 3780c80476e4SDavid E. O'Brien temp = *kp; 3781c80476e4SDavid E. O'Brien *kp++ = *cp; 3782c80476e4SDavid E. O'Brien *cp++ = temp; 3783c80476e4SDavid E. O'Brien } 3784c80476e4SDavid E. O'Brien break; 3785c80476e4SDavid E. O'Brien 3786c80476e4SDavid E. O'Brien default: 3787c80476e4SDavid E. O'Brien return(CC_ERROR); 3788c80476e4SDavid E. O'Brien } 3789c80476e4SDavid E. O'Brien 3790c80476e4SDavid E. O'Brien return(CC_REFRESH); 3791c80476e4SDavid E. O'Brien } 3792c80476e4SDavid E. O'Brien 3793c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3794c80476e4SDavid E. O'Brien CCRETVAL 379545e5710bSMark Peek v_ush_meta(Char c) 3796c80476e4SDavid E. O'Brien { 3797c80476e4SDavid E. O'Brien USE(c); 3798c80476e4SDavid E. O'Brien return v_search(F_UP_SEARCH_HIST); 3799c80476e4SDavid E. O'Brien } 3800c80476e4SDavid E. O'Brien 3801c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3802c80476e4SDavid E. O'Brien CCRETVAL 380345e5710bSMark Peek v_dsh_meta(Char c) 3804c80476e4SDavid E. O'Brien { 3805c80476e4SDavid E. O'Brien USE(c); 3806c80476e4SDavid E. O'Brien return v_search(F_DOWN_SEARCH_HIST); 3807c80476e4SDavid E. O'Brien } 3808c80476e4SDavid E. O'Brien 3809c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3810c80476e4SDavid E. O'Brien CCRETVAL 381145e5710bSMark Peek v_rsrch_fwd(Char c) 3812c80476e4SDavid E. O'Brien { 3813c80476e4SDavid E. O'Brien USE(c); 381445e5710bSMark Peek if (patbuf.len == 0) return(CC_ERROR); 3815c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir)); 3816c80476e4SDavid E. O'Brien } 3817c80476e4SDavid E. O'Brien 3818c80476e4SDavid E. O'Brien /*ARGSUSED*/ 3819c80476e4SDavid E. O'Brien CCRETVAL 382045e5710bSMark Peek v_rsrch_back(Char c) 3821c80476e4SDavid E. O'Brien { 3822c80476e4SDavid E. O'Brien USE(c); 382345e5710bSMark Peek if (patbuf.len == 0) return(CC_ERROR); 3824c80476e4SDavid E. O'Brien return(v_repeat_srch(searchdir == F_UP_SEARCH_HIST ? 3825c80476e4SDavid E. O'Brien F_DOWN_SEARCH_HIST : F_UP_SEARCH_HIST)); 3826c80476e4SDavid E. O'Brien } 3827c80476e4SDavid E. O'Brien 38283b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 3829c80476e4SDavid E. O'Brien /* Since ed.defns.h is generated from ed.defns.c, these empty 3830c80476e4SDavid E. O'Brien functions will keep the F_NUM_FNS consistent 3831c80476e4SDavid E. O'Brien */ 3832c80476e4SDavid E. O'Brien CCRETVAL 383345e5710bSMark Peek e_copy_to_clipboard(Char c) 3834c80476e4SDavid E. O'Brien { 3835c80476e4SDavid E. O'Brien USE(c); 3836c80476e4SDavid E. O'Brien return CC_ERROR; 3837c80476e4SDavid E. O'Brien } 3838c80476e4SDavid E. O'Brien 3839c80476e4SDavid E. O'Brien CCRETVAL 384045e5710bSMark Peek e_paste_from_clipboard(Char c) 3841c80476e4SDavid E. O'Brien { 3842c80476e4SDavid E. O'Brien USE(c); 3843c80476e4SDavid E. O'Brien return (CC_ERROR); 3844c80476e4SDavid E. O'Brien } 3845c80476e4SDavid E. O'Brien 3846c80476e4SDavid E. O'Brien CCRETVAL 384745e5710bSMark Peek e_dosify_next(Char c) 3848c80476e4SDavid E. O'Brien { 3849c80476e4SDavid E. O'Brien USE(c); 3850c80476e4SDavid E. O'Brien return (CC_ERROR); 3851c80476e4SDavid E. O'Brien } 3852c80476e4SDavid E. O'Brien CCRETVAL 385345e5710bSMark Peek e_dosify_prev(Char c) 3854c80476e4SDavid E. O'Brien { 3855c80476e4SDavid E. O'Brien USE(c); 3856c80476e4SDavid E. O'Brien return (CC_ERROR); 3857c80476e4SDavid E. O'Brien } 3858c80476e4SDavid E. O'Brien CCRETVAL 385945e5710bSMark Peek e_page_up(Char c) 3860c80476e4SDavid E. O'Brien { 3861c80476e4SDavid E. O'Brien USE(c); 3862c80476e4SDavid E. O'Brien return (CC_ERROR); 3863c80476e4SDavid E. O'Brien } 3864c80476e4SDavid E. O'Brien CCRETVAL 386545e5710bSMark Peek e_page_down(Char c) 3866c80476e4SDavid E. O'Brien { 3867c80476e4SDavid E. O'Brien USE(c); 3868c80476e4SDavid E. O'Brien return (CC_ERROR); 3869c80476e4SDavid E. O'Brien } 38703b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */ 3871c80476e4SDavid E. O'Brien 3872c80476e4SDavid E. O'Brien #ifdef notdef 3873c80476e4SDavid E. O'Brien void 387445e5710bSMark Peek MoveCursor(int n) /* move cursor + right - left char */ 3875c80476e4SDavid E. O'Brien { 3876c80476e4SDavid E. O'Brien Cursor = Cursor + n; 3877c80476e4SDavid E. O'Brien if (Cursor < InputBuf) 3878c80476e4SDavid E. O'Brien Cursor = InputBuf; 3879c80476e4SDavid E. O'Brien if (Cursor > LastChar) 3880c80476e4SDavid E. O'Brien Cursor = LastChar; 3881c80476e4SDavid E. O'Brien return; 3882c80476e4SDavid E. O'Brien } 3883c80476e4SDavid E. O'Brien 3884c80476e4SDavid E. O'Brien Char * 388545e5710bSMark Peek GetCursor(void) 3886c80476e4SDavid E. O'Brien { 3887c80476e4SDavid E. O'Brien return(Cursor); 3888c80476e4SDavid E. O'Brien } 3889c80476e4SDavid E. O'Brien 3890c80476e4SDavid E. O'Brien int 389145e5710bSMark Peek PutCursor(Char *p) 3892c80476e4SDavid E. O'Brien { 3893c80476e4SDavid E. O'Brien if (p < InputBuf || p > LastChar) 3894c80476e4SDavid E. O'Brien return 1; /* Error */ 3895c80476e4SDavid E. O'Brien Cursor = p; 3896c80476e4SDavid E. O'Brien return 0; 3897c80476e4SDavid E. O'Brien } 3898c80476e4SDavid E. O'Brien #endif 3899