da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Original version by Michael T. Veach
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Adapted for ksh by David Korn */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* EMACS_MODES: c tabstop=4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinOne line screen editor for any program
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* The following is provided by:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Matthijs N. Melchior
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Network Systems International
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * APT Nederland
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * HV BZ335 x2962
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * hvlpb!mmelchio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * These are now on by default
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - A ^N as first history related command after the prompt will move
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * to the next command relative to the last known history position.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * It will not start at the position where the last command was entered
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * as is done by the ^P command. Every history related command will
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set both the current and last position. Executing a command will
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * only set the current position.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - Successive kill and delete commands will accumulate their data
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * in the kill buffer, by appending or prepending as appropriate.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This mode will be reset by any command not adding something to the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * kill buffer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ESH_BETTER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - Some enhancements:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - argument for a macro is passed to its replacement
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - ^X^H command to find out about history position (debugging)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * - ^X^D command to show any debugging info
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * I do not pretend these for changes are completely independent,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * but you can use them to seperate features.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/cmds"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include "defs.h"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# include <ctype.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "io.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "history.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "edit.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "terminal.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ESH_BETTER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef putchar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define putchar(ed,c) ed_putchar(ed,c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define beep() ed_ringbell()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define gencpy(a,b) ed_gencpy(a,b)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define genncpy(a,b,n) ed_genncpy(a,b,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define genlen(str) ed_genlen(str)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int print(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int _isword(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define isword(c) _isword(out[c])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define gencpy(a,b) strcpy((char*)(a),(char*)(b))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define genncpy(a,b,n) strncpy((char*)(a),(char*)(b),n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define genlen(str) strlen(str)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define print(c) isprint(c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define isword(c) (isalnum(out[c]) || (out[c]=='_'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _emacs_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *screen; /* pointer to window buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *cursor; /* Cursor in real screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int mark;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int in_mult;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char cr_ok;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char CntrlO;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char overflow; /* Screen overflow flag set */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char scvalid; /* Screen is up to date */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char lastdraw; /* last update type */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int offset; /* Screen offset */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin enum
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CRT=0, /* Crt terminal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PAPER /* Paper terminal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } terminal;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Histloc_t _location;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int prevdirection;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Edit_t *ed; /* pointer to edit data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Emacs_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define editb (*ep->ed)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define eol editb.e_eol
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define cur editb.e_cur
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define hline editb.e_hline
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define hloff editb.e_hloff
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define hismin editb.e_hismin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define usrkill editb.e_kill
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define usrlnext editb.e_lnext
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define usreof editb.e_eof
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define usrerase editb.e_erase
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define crallowed editb.e_crlf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define Prompt editb.e_prompt
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define plen editb.e_plen
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define kstack editb.e_killbuf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define lstring editb.e_search
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define lookahead editb.e_lookahead
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define env editb.e_env
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define raw editb.e_raw
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define histlines editb.e_hismax
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define w_size editb.e_wsize
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define drawbuff editb.e_inbuf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define killing editb.e_mode
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define location ep->_location
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LBUF 100
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define KILLCHAR UKILL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ERASECHAR UERASE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EOFCHAR UEOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LNEXTCHAR ULNEXT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DELETE ('a'==97?0177:7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/**********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinA large lookahead helps when the user is inserting
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincharacters in the middle of the line.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef enum
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FIRST, /* First time thru for logical line, prompt on screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin REFRESH, /* Redraw entire screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin APPEND, /* Append char before cursor to screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UPDATE, /* Update the screen as need be */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FINAL /* Update screen even if pending look ahead */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Draw_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void draw(Emacs_t*,Draw_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int escape(Emacs_t*,genchar*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void putstring(Emacs_t*,char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void search(Emacs_t*,genchar*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void setcursor(Emacs_t*,int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void show_info(Emacs_t*,const char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void xcommands(Emacs_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint ed_emacsread(void *context, int fd,char *buff,int scend, int reedit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Edit_t *ed = (Edit_t*)context;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register genchar *out;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Emacs_t *ep = ed->e_emacs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int adjust,oadjust;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char backslash;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *kptr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char prompt[PRSIZE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar Screen[MAXLINE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!ep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep = ed->e_emacs = newof(0,Emacs_t,1,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed = ed;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->prevdirection = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = -5;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Prompt = prompt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->screen = Screen;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep->lastdraw = FINAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tty_raw(ERRIO,0) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(reedit?reedit:ed_read(context, fd,buff,scend,0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin raw = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* This mess in case the read system call fails */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_setup(ep->ed,fd,reedit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out = (genchar*)buff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz out = (genchar*)roundof(buff-(char*)0,sizeof(genchar));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(reedit)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ed_internal(buff,out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!kstack)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kstack = (genchar*)malloc(CHARSIZE*MAXLINE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kstack[0] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drawbuff = out;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command == -5) /* to be initialized */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kstack[0] = '\0'; /* also clear kstack... */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = hloff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command <= hismin) /* don't start below minimum */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hismin + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->in_mult = hloff; /* save pos in last command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = sigsetjmp(env,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i !=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->ed->e_multiline)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cur = eol;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin draw(ep,FINAL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_flush(ep->ed);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty_cooked(ERRIO);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i == UEOF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0); /* EOF */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1); /* some other error */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[reedit] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(scend+plen > (MAXLINE-2))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin scend = (MAXLINE-2)-plen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,reedit?REFRESH:FIRST);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin backslash = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->CntrlO)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('N'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location = hist_locate(sh.hist_ptr,location.hist_command,location.hist_line,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command < histlines)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = location.hist_command;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_copy((char*)kstack,MAXLINE, hline,hloff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_internal((char*)kstack,kstack);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('Y'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->CntrlO = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = ed_getchar(ep->ed,0)) != (-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (backslash)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin backslash = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c==usrerase||c==usrkill||(!print(c) &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (c!='\r'&&c!='\n')))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* accept a backslashed character */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[cur++] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[eol] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,APPEND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == usrkill)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = KILLCHAR ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == usrerase)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ERASECHAR ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == usrlnext)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = LNEXTCHAR ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((c == usreof)&&(eol == 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = EOFCHAR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--killing <= 0) /* reset killing flag */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oadjust = count = adjust;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(count<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LNEXTCHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ed_getchar(ep->ed,2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto do_default_processing;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('V'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin show_info(ep,fmtident(e_version));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\0':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('X'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xcommands(ep,count);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case EOFCHAR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_flush(ep->ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty_cooked(ERRIO);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef u370
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('S') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('Q') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* u370 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\t':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cur>0 && ep->ed->sh->nextprompt)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ep->ed->e_tabcount==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed->e_tabcount=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,ESC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto do_escape;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(ep->ed->e_tabcount==1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,'=');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto do_escape;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed->e_tabcount = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do_default_processing:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((eol+1) >= (scend)) /* will not fit on line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,c); /* save character for next line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto process;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i= ++eol; i>cur; i--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[i] = out[i-1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin backslash = (c == '\\');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[cur++] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,APPEND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('Y') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = genlen(kstack);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c + eol) > scend)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=eol;i>=cur;i--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[c+i] = out[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr=kstack;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i = *kptr++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[cur++] = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol = genlen(out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\r':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto process;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case DELETE: /* delete char 0x7f */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\b': /* backspace, ^h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ERASECHAR :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (count > i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr = &kstack[count]; /* move old contents here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (killing) /* prepend to killbuf */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = genlen(kstack) + CHARSIZE; /* include '\0' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(c--) /* copy stuff */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr[c] = kstack[c];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *kptr = 0; /* this is end of data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 2; /* we are killing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i -= count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol -= count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(kstack,out+i,cur-i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((count--)&&(i>0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(kstack,out+i,cur-i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kstack[cur-i] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(out+i,out+cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('W') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ++killing; /* keep killing flag */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->mark > eol )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->mark == i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->mark > i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = ep->mark - i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('D'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = i - ep->mark;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,usrerase);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('D') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (killing)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr = &kstack[genlen(kstack)]; /* append here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr = kstack;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 2; /* we are now killing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin kptr = kstack;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((count--)&&(eol>0)&&(i<eol))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *kptr++ = out[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((out[i] = out[(i+1)])==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *kptr = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('C') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('F') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int cntlC = (c==cntl('C'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (count-- && eol>i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (cntlC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = out[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((c&~STRIP)==0 && islower(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(islower(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c += 'A' - 'a';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[i] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl(']') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ed_getchar(ep->ed,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((count == 0) || (count > eol))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (out[i])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i < eol)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (out[i] == c && --count==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i < cur)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (out[i] == c && --count==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinupdate:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('B') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (count > i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i -= count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('T') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((sh_isoption(SH_EMACS))&& (eol!=i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i >= 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = out[i - 1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[i-1] = out[i-2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[i-2] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_EMACS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('A') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('E') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('U') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = 4*count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case KILLCHAR :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oadjust = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('K') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(oadjust >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 2; /* set killing signal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('W'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (killing) /* append to kill buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(&kstack[genlen(kstack)], &out[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(kstack,&out[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 2; /* set killing signal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(kstack,&out[i]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_KAPPEND */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[i] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == KILLCHAR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->terminal == PAPER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putchar(ep->ed,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putstring(ep,Prompt);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ed_getchar(ep->ed,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != usrkill)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->terminal == PAPER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->terminal = CRT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->terminal = PAPER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putchar(ep->ed,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putstring(ep,Prompt);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('L'):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!ep->ed->e_nocrnl)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_crlf(ep->ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,REFRESH);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep->ed->e_nocrnl = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('[') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do_escape:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin adjust = escape(ep,out,oadjust);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('R') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin search(ep,out,count);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto drawline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('P') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (count <= hloff)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff -= count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline -= count - hloff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (hline <= hismin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (hline < hismin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = hismin+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto common;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('O') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = hloff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->CntrlO = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto process;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('N') :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = location.hist_command; /* start at saved position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location = hist_locate(sh.hist_ptr,hline,hloff,count);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_command > histlines)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = histlines;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = ep->in_mult;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = location.hist_command;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin common:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hline; /* save current position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = hloff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cur = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_copy((char*)out,MAXLINE, hline,hloff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_internal((char*)(out),out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin drawline:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol = genlen(out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprocess:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == (-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lookahead = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *out = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,FINAL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty_cooked(ERRIO);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ed->e_nlist)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed->e_nlist = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakset(ed->e_stkptr,ed->e_stkoff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[eol++] = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[eol] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_crlf(ep->ed);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_external(out,buff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = strlen(buff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void show_info(Emacs_t *ep,const char *str)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register genchar *out = drawbuff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar string[LBUF];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sav_cur = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save current line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(string,out,sizeof(string)/sizeof(*string));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *out = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_internal(str,out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(out,str);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ed_getchar(ep->ed,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* restore line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sav_cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(out,string,sizeof(string)/sizeof(*string));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void putstring(Emacs_t* ep,register char *sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c= *sp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putchar(ep->ed,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int escape(register Emacs_t* ep,register genchar *out,int count)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i,value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int digit,ch;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin digit = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i=ed_getchar(ep->ed,0)),isdigit(i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value *= 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value += (i - '0');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin digit = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (digit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,i) ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ++killing; /* don't modify killing signal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value = count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(value<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(ch=i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('V'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin show_info(ep,fmtident(e_version));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ' ':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '+': /* M-+ = append next kill */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1; /* no argument for next command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'p': /* M-p == ^W^Y (copy stack == kill & yank) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('Y'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('W'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin killing = 0; /* start fresh */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'l': /* M-l == lower-case */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'd':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'c':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'f':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(value-- && i<eol)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((out[i])&&(!isword(i)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((out[i])&&(isword(i)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ch=='l')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin value = i-cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (value-- > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = out[cur];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((i&~STRIP)==0 && isupper(i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isupper(i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i += 'a' - 'A';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[cur] = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(ch=='f')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(ch=='c')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('C'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i-cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i-cur)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('D'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ++killing; /* keep killing signal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(i-cur);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'b':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case DELETE :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\b':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'h':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(value-- && i>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i>0)&&(!isword(i)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i>0)&&(isword(i-1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ch=='b')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,usrerase);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_KAPPEND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ++killing;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(cur-i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '>':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('N'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->in_mult)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = histlines;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = ep->in_mult - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = histlines - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = histlines-1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '<':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('P'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = hismin + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(hline-hismin);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '#':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,(out[0]=='#')?cntl('D'):'#');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('A'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '_' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '.' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar name[MAXLINE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[MAXLINE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *ptr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ptr = hist_word(buf,MAXLINE,(count?count:-1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ptr==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((eol - cur) >= sizeof(name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(name,&out[cur]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(*ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin out[cur++] = *ptr++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eol++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin gencpy(&out[cur],name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* file name expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('[') : /* filename completion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '*': /* filename expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '=': /* escape = - list all matching file names */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ed_expand(ep->ed,(char*)out,&cur,&eol,i,count) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ep->ed->e_tabcount==1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed->e_tabcount=2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('\t'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(i=='=')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,REFRESH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(count>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed->e_tabcount=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i=ed_getchar(ep->ed,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isdigit(i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,ESC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(i=='\\' && cur>ep->mark && (out[cur-1]=='/' || out[cur-1]==' '))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->ed->e_tabcount=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* search back for character */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl(']'): /* feature not in book */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int c = ed_getchar(ep->ed,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((value == 0) || (value > eol))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (out[i] == c && --value==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto update;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i > cur)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (out[i] == c && --value==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin update:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _cmd_tput
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('L'): /* clear screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_trap("tput clear", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,REFRESH);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '[': /* feature not in book */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(i=ed_getchar(ep->ed,1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'A':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cur>0 && eol==cur && (cur<(SEARCHSIZE-2) || ep->prevdirection == -2))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->lastdraw==APPEND && ep->prevdirection != -2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin out[cur] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin gencpy(&((genchar*)lstring)[1],out);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_MULTIBYTE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_external(&((genchar*)lstring)[1],lstring+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /* SHOPT_MULTIBYTE */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *lstring = '^';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep->prevdirection = -2;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(*lstring)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_ungetchar(ep->ed,'\r');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_ungetchar(ep->ed,cntl('R'));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(-1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *lstring = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('P'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'B':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('N'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'C':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('F'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'D':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('B'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'H':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('A'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'Y':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,cntl('E'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = '_';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* look for user defined macro definitions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ed_macro(ep->ed,i))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef ESH_BETTER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(count); /* pass argument to macro */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* ESH_BETTER */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin update:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This routine process all commands starting with ^X
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void xcommands(register Emacs_t *ep,int count)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i = ed_getchar(ep->ed,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(count);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('X'): /* exchange dot and mark */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->mark > eol)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = eol;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = ep->mark;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->mark = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef ESH_BETTER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('E'): /* invoke emacs on current command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(ed_fulledit(ep->ed)==-1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_internal((char*)drawbuff,drawbuff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_ungetchar(ep->ed,'\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define itos(i) fmtbase((long)(i),0,0)/* want signed conversion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('H'): /* ^X^H show history info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char hbuf[MAXLINE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy(hbuf, "Current command ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, itos(hline));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (hloff)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, " (line ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, itos(hloff+1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, ")");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((hline != location.hist_command) ||
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (hloff != location.hist_line))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, "; Previous command ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, itos(location.hist_command));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (location.hist_line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, " (line ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, itos(location.hist_line+1));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(hbuf, ")");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin show_info(ep,hbuf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if 0 /* debugging, modify as required */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case cntl('D'): /* ^X^D show debugging info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char debugbuf[MAXLINE];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy(debugbuf, "count=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(count));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, " eol=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(eol));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, " cur=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(cur));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, " crallowed=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(crallowed));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, " plen=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(plen));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, " w_size=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcat(debugbuf, itos(w_size));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin show_info(ep,debugbuf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* debugging code */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* ESH_BETTER */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void search(Emacs_t* ep,genchar *out,int direction)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Histloc_t location;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i,sl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar str_buff[LBUF];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register genchar *string = drawbuff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save current line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sav_cur = cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(str_buff,string,sizeof(str_buff)/sizeof(*str_buff));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[0] = '^';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[1] = 'R';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[2] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sl = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((i = ed_getchar(ep->ed,1))&&(i != '\r')&&(i != '\n'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i==usrerase || i==DELETE || i=='\b' || i==ERASECHAR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (sl > 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[--sl] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,UPDATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i==usrkill)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto restore;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i == '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[sl++] = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[sl] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,APPEND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = ed_getchar(ep->ed,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[--sl] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[sl++] = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin string[sl] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin draw(ep,APPEND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = genlen(string);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->prevdirection == -2 && i!=2 || direction!=1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep->prevdirection = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (direction < 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->prevdirection = -ep->prevdirection;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin direction = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin direction = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i != 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_external(string,(char*)string);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strncpy(lstring,((char*)string)+2,SEARCHSIZE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->prevdirection = direction;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin direction = ep->prevdirection ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location = hist_find(sh.hist_ptr,(char*)lstring,hline,1,direction);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = location.hist_command;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(i>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line = 0; /* display first line of multi line command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = location.hist_line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_copy((char*)out,MAXLINE, hline,hloff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ed_internal((char*)out,out);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin beep();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef ESH_NFIRST
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_command = hline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin location.hist_line = hloff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hloff = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hline = histlines;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* ESH_NFIRST */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinrestore:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genncpy(string,str_buff,sizeof(str_buff)/sizeof(*str_buff));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cur = sav_cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Adjust screen to agree with inputs: logical line and cursor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* If 'first' assume screen is blank */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Prompt is always kept on the screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void draw(register Emacs_t *ep,Draw_t option)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NORMAL ' '
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LOWER '<'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BOTH '*'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UPPER '>'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register genchar *sptr; /* Pointer within screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar nscreen[2*MAXLINE]; /* New entire screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *ncursor; /* New cursor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register genchar *nptr; /* Pointer to New screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char longline; /* Line overflow */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *logcursor;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *nscend; /* end of logical screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nptr = nscreen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sptr = drawbuff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin logcursor = sptr + cur;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin longline = NORMAL;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ep->lastdraw = option;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (option == FIRST || option == REFRESH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->overflow = NORMAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->cursor = ep->screen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->offset = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->cr_ok = crallowed;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (option == FIRST)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->scvalid = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ep->cursor = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putstring(ep,Prompt); /* start with prompt */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Do not update screen if pending characters
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin **********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((lookahead)&&(option != FINAL))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->scvalid = 0; /* Screen is out of date, APPEND will not work */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /***************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If in append mode, cursor at end of line, screen up to date,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin the previous character was a 'normal' character,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin and the window has room for another character.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Then output the character and adjust the screen only.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *****************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = *(logcursor-1); /* last character inserted */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((option == APPEND)&&(ep->scvalid)&&(*logcursor == '\0')&&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print(i)&&((ep->cursor-ep->screen)<(w_size-1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putchar(ep->ed,i);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ep->cursor++ = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ep->cursor = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* copy the line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ncursor = nptr + ed_virt_to_phys(ep->ed,sptr,nptr,cur,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nptr += genlen(nptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sptr += genlen(sptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nscend = nptr - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sptr == logcursor)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ncursor = nptr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Does ncursor appear on the screen?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If not, adjust the screen offset so it does.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin **********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = ncursor - nscreen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((ep->offset && i<=ep->offset)||(i >= (ep->offset+w_size)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* Center the cursor on the screen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->offset = i - (w_size>>1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--ep->offset < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->offset = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*********************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Is the range of screen[0] thru screen[w_size] up-to-date
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin with nscreen[offset] thru nscreen[offset+w_size] ?
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin If not, update as need be.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ***********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nptr = &nscreen[ep->offset];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sptr = ep->screen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = w_size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (i-- > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*nptr == '\0')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(nptr + 1) = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *nptr = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*sptr == '\0')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(sptr + 1) = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *sptr = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*nptr == *sptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nptr++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sptr++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setcursor(ep,sptr-ep->screen,*nptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *sptr++ = *nptr++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(*nptr==MARKER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*sptr=='\0')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(sptr + 1) = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *sptr++ = *nptr++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->cursor++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep->ed->e_multiline && option == REFRESH && ep->ed->e_nocrnl==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ed_setcursor(ep->ed, ep->screen, ep->cursor-ep->screen, ep->ed->e_peol, -1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /******************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Screen overflow checks
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ********************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (nscend >= &nscreen[ep->offset+w_size])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->offset > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin longline = BOTH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin longline = UPPER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ep->offset > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin longline = LOWER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* Update screen overflow indicator if need be */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (longline != ep->overflow)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setcursor(ep,w_size,longline);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->overflow = longline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = (ncursor-nscreen) - ep->offset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setcursor(ep,i,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(option==FINAL && ep->ed->e_multiline)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin setcursor(ep,nscend+1-nscreen,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->scvalid = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * put the cursor to the <newp> position within screen buffer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if <c> is non-zero then output this character
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * cursor is set to reflect the change
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void setcursor(register Emacs_t *ep,register int newp,int c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int oldp = ep->cursor - ep->screen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin newp = ed_setcursor(ep->ed, ep->screen, oldp, newp, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin putchar(ep->ed,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin newp++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ep->cursor = ep->screen+newp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int print(register int c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((c&~STRIP)==0 && isprint(c));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int _isword(register int c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return((c&~STRIP) || isalnum(c) || c=='_');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */