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#ifndef SEARCHSIZE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * edit.h - common data structure for vi and emacs edit options
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SEARCHSIZE 80
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/options"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/locale"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !SHOPT_VSH && !SHOPT_ESH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define ed_winsize() (SEARCHSIZE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <setjmp.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <sig.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <ctype.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/setjmp"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "terminal.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define STRIP 0377
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LOOKAHEAD 80
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifndef ESS_MAXCHAR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include "national.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* ESS_MAXCHAR */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typedef wchar_t genchar;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define CHARSIZE (sizeof(wchar_t)<=2?3:sizeof(wchar_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typedef char genchar;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define CHARSIZE 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TABSIZE 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PRSIZE 160
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAXLINE 1024 /* longest edit line permitted */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _edit_pos
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned short line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned short col;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Edpos_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct edit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sigjmp_buf e_env;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_kill;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_erase;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_werase;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_eof;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_lnext;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_fchar;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_plen; /* length of prompt string */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char e_crlf; /* zero if cannot return to beginning of line */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char e_nocrnl; /* don't put a new-line with ^L */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_llimit; /* line length limit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_hline; /* current history line number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_hloff; /* line number offset for command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_hismin; /* minimum history line number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_hismax; /* maximum history line number */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_raw; /* set when in raw mode or alt mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_cur; /* current line position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_eol; /* end-of-line position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_pcur; /* current physical line position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_peol; /* end of physical line position */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_mode; /* edit mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_lookahead; /* index in look-ahead buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_repeat;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_saved;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_fcol; /* first column */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_ucol; /* column for undo */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_wsize; /* width of display window */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_outbase; /* pointer to start of output buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_outptr; /* pointer to position in output buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_outlast; /* pointer to end of output buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_inbuf; /* pointer to input buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_prompt; /* pointer to buffer containing the prompt */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_ubuf; /* pointer to the undo buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_killbuf; /* pointer to delete buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_search[SEARCHSIZE]; /* search string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_Ubuf; /* temporary workspace buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_physbuf; /* temporary workspace buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_lbuf[LOOKAHEAD];/* pointer to look-ahead buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_fd; /* file descriptor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_ttyspeed; /* line speed, also indicates tty parms are valid */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_tabcount;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_utime
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ino_t e_tty_ino;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dev_t e_tty_dev;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_tty;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_OLDTERMIO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_echoctl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_tcgeta;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termio e_ott;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_curchar;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_cursize;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int *e_globals; /* global variables */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin genchar *e_window; /* display window image */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_inmacro; /* processing macro expansion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_vi_insert[2]; /* for sh_keytrap */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int32_t e_col; /* for sh_keytrap */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_prbuff[PRSIZE]; /* prompt buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termios e_ttyparm; /* initial tty parameters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termios e_nttyparm; /* raw tty parameters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct termios e_savetty; /* saved terminal state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_savefd; /* file descriptor for saved terminal state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_macro[4]; /* macro buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *e_vi; /* vi specific data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *e_emacs; /* emacs specific data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shell_t *sh; /* interpreter pointer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *e_stkptr; /* saved stack pointer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_stkoff; /* saved stack offset */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char **e_clist; /* completion list after <ESC>= */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_nlist; /* number of elements on completion list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_multiline; /* allow multiple lines for editing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int e_winsz; /* columns in window */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Edpos_t e_curpos; /* cursor line and column */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *e_default; /* variable containing default value */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *e_term; /* TERM variable */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char e_termname[80]; /* terminal name */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Edit_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MAXWINDOW
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAXWINDOW 300 /* maximum width window */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FAST 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SLOW 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ESC cntl('[')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UEOF -2 /* user eof char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UINTR -3 /* user intr char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UERASE -4 /* user erase char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UKILL -5 /* user kill char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UWERASE -6 /* user word erase char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ULNEXT -7 /* user next literal char synonym */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if ( 'a' == 97) /* ASCII? */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define cntl(x) (x&037)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define cntl(c) (c=='D'?55:(c=='E'?45:(c=='F'?46:(c=='G'?'\a':(c=='H'?'\b': \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (c=='I'?'\t':(c=='J'?'\n':(c=='T'?60:(c=='U'?61:(c=='V'?50: \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (c=='W'?38:(c=='Z'?63:(c=='['?39:(c==']'?29: \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (c<'J'?c+1-'A':(c+10-'J'))))))))))))))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define STRIP 0377
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define GMACS 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EMACS 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define VIRAW 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EDITVI 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define NOHIST 16
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EDITMASK 15
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define is_option(m) (opt_flag&(m))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char opt_flag;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef SYSCALL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define read(fd,buff,n) syscall(3,fd,buff,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define read(fd,buff,n) rEAd(fd,buff,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* SYSCALL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_crlf(Edit_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_putchar(Edit_t*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_ringbell(void);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_setup(Edit_t*,int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_flush(Edit_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_getchar(Edit_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_virt_to_phys(Edit_t*,genchar*,genchar*,int,int,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_window(void);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ed_ungetchar(Edit_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_viread(void*, int, char*, int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_read(void*, int, char*, int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_emacsread(void*, int, char*, int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Edpos_t ed_curpos(Edit_t*, genchar*, int, int, Edpos_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ed_setcursor(Edit_t*, genchar*, int, int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_macro(Edit_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_expand(Edit_t*, char[],int*,int*,int,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_fulledit(Edit_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void *ed_open(Shell_t*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_internal(const char*, genchar*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_external(const genchar*, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void ed_gencpy(genchar*,const genchar*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void ed_genncpy(genchar*,const genchar*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_genlen(const genchar*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern int ed_setwidth(const char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern const char e_runvi[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !KSHELL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern const char e_version[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_HISTEXPAND
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_EVENT 0x1 /* event designator seen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_QUESTION 0x2 /* question mark event designator */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_HASH 0x4 /* hash event designator */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_WORDDSGN 0x8 /* word designator seen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_QUICKSUBST 0x10 /* quick substition designator seen */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_SUBSTITUTE 0x20 /* for substition loop */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_NEWLINE 0x40 /* newline in squashed white space */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* modifier flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_PRINT 0x100 /* print new command */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_QUOTE 0x200 /* quote resulting history line */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_QUOTE_BR 0x400 /* quote every word on space break */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_GLOBALSUBST 0x800 /* apply substition globally */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_ERROR 0x1000 /* an error ocurred */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* flags to be returned */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIST_FLAG_RETURN_MASK (HIST_EVENT|HIST_PRINT|HIST_ERROR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int hist_expand(const char *, char **);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif