1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1982-2012 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * David Korn <dgk@research.att.com> * 18da2e3ebdSchin * * 19da2e3ebdSchin ***********************************************************************/ 20da2e3ebdSchin #pragma prototyped 21da2e3ebdSchin #ifndef SEARCHSIZE 22da2e3ebdSchin /* 23da2e3ebdSchin * edit.h - common data structure for vi and emacs edit options 24da2e3ebdSchin * 25da2e3ebdSchin * David Korn 26da2e3ebdSchin * AT&T Labs 27da2e3ebdSchin * 28da2e3ebdSchin */ 29da2e3ebdSchin 30da2e3ebdSchin #define SEARCHSIZE 80 31da2e3ebdSchin 32da2e3ebdSchin #include "FEATURE/options" 33da2e3ebdSchin #include "FEATURE/locale" 34da2e3ebdSchin #if !SHOPT_VSH && !SHOPT_ESH 35da2e3ebdSchin # define ed_winsize() (SEARCHSIZE) 36da2e3ebdSchin #else 37da2e3ebdSchin 38da2e3ebdSchin #if !KSHELL 39da2e3ebdSchin # include <setjmp.h> 40da2e3ebdSchin # include <sig.h> 41da2e3ebdSchin # include <ctype.h> 42da2e3ebdSchin #endif /* KSHELL */ 43da2e3ebdSchin 44da2e3ebdSchin #include "FEATURE/setjmp" 45da2e3ebdSchin #include "terminal.h" 46da2e3ebdSchin 47da2e3ebdSchin #define STRIP 0377 48da2e3ebdSchin #define LOOKAHEAD 80 49da2e3ebdSchin 50da2e3ebdSchin #if SHOPT_MULTIBYTE 51da2e3ebdSchin # ifndef ESS_MAXCHAR 52da2e3ebdSchin # include "national.h" 53da2e3ebdSchin # endif /* ESS_MAXCHAR */ 54da2e3ebdSchin typedef wchar_t genchar; 55da2e3ebdSchin # define CHARSIZE (sizeof(wchar_t)<=2?3:sizeof(wchar_t)) 56da2e3ebdSchin #else 57da2e3ebdSchin typedef char genchar; 58da2e3ebdSchin # define CHARSIZE 1 59da2e3ebdSchin #endif /* SHOPT_MULTIBYTE */ 60da2e3ebdSchin 61da2e3ebdSchin #define TABSIZE 8 62*b30d1939SAndy Fiddaman #define PRSIZE 256 63da2e3ebdSchin #define MAXLINE 1024 /* longest edit line permitted */ 64da2e3ebdSchin 65da2e3ebdSchin typedef struct _edit_pos 66da2e3ebdSchin { 67da2e3ebdSchin unsigned short line; 68da2e3ebdSchin unsigned short col; 69da2e3ebdSchin } Edpos_t; 70da2e3ebdSchin 71*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT 72*b30d1939SAndy Fiddaman typedef struct Histmatch 73*b30d1939SAndy Fiddaman { 74*b30d1939SAndy Fiddaman struct Histmatch *next; 75*b30d1939SAndy Fiddaman int index; 76*b30d1939SAndy Fiddaman short len; 77*b30d1939SAndy Fiddaman short count; 78*b30d1939SAndy Fiddaman char data[1]; 79*b30d1939SAndy Fiddaman } Histmatch_t; 80*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */ 81*b30d1939SAndy Fiddaman 82*b30d1939SAndy Fiddaman 83*b30d1939SAndy Fiddaman 84da2e3ebdSchin typedef struct edit 85da2e3ebdSchin { 86da2e3ebdSchin sigjmp_buf e_env; 87*b30d1939SAndy Fiddaman int e_intr; 88da2e3ebdSchin int e_kill; 89da2e3ebdSchin int e_erase; 90da2e3ebdSchin int e_werase; 91da2e3ebdSchin int e_eof; 92da2e3ebdSchin int e_lnext; 93da2e3ebdSchin int e_fchar; 94da2e3ebdSchin int e_plen; /* length of prompt string */ 957c2fbfb3SApril Chin char e_crlf; /* zero if cannot return to beginning of line */ 967c2fbfb3SApril Chin char e_nocrnl; /* don't put a new-line with ^L */ 97*b30d1939SAndy Fiddaman char e_keytrap; /* set when in keytrap */ 98da2e3ebdSchin int e_llimit; /* line length limit */ 99da2e3ebdSchin int e_hline; /* current history line number */ 100da2e3ebdSchin int e_hloff; /* line number offset for command */ 101da2e3ebdSchin int e_hismin; /* minimum history line number */ 102da2e3ebdSchin int e_hismax; /* maximum history line number */ 103da2e3ebdSchin int e_raw; /* set when in raw mode or alt mode */ 104da2e3ebdSchin int e_cur; /* current line position */ 105da2e3ebdSchin int e_eol; /* end-of-line position */ 106da2e3ebdSchin int e_pcur; /* current physical line position */ 107da2e3ebdSchin int e_peol; /* end of physical line position */ 108da2e3ebdSchin int e_mode; /* edit mode */ 109da2e3ebdSchin int e_lookahead; /* index in look-ahead buffer */ 110da2e3ebdSchin int e_repeat; 111da2e3ebdSchin int e_saved; 112da2e3ebdSchin int e_fcol; /* first column */ 113da2e3ebdSchin int e_ucol; /* column for undo */ 114da2e3ebdSchin int e_wsize; /* width of display window */ 115da2e3ebdSchin char *e_outbase; /* pointer to start of output buffer */ 116da2e3ebdSchin char *e_outptr; /* pointer to position in output buffer */ 117da2e3ebdSchin char *e_outlast; /* pointer to end of output buffer */ 118da2e3ebdSchin genchar *e_inbuf; /* pointer to input buffer */ 119da2e3ebdSchin char *e_prompt; /* pointer to buffer containing the prompt */ 120da2e3ebdSchin genchar *e_ubuf; /* pointer to the undo buffer */ 121da2e3ebdSchin genchar *e_killbuf; /* pointer to delete buffer */ 122da2e3ebdSchin char e_search[SEARCHSIZE]; /* search string */ 123da2e3ebdSchin genchar *e_Ubuf; /* temporary workspace buffer */ 124da2e3ebdSchin genchar *e_physbuf; /* temporary workspace buffer */ 125da2e3ebdSchin int e_lbuf[LOOKAHEAD];/* pointer to look-ahead buffer */ 126da2e3ebdSchin int e_fd; /* file descriptor */ 127da2e3ebdSchin int e_ttyspeed; /* line speed, also indicates tty parms are valid */ 128da2e3ebdSchin int e_tabcount; 129da2e3ebdSchin #ifdef _hdr_utime 130da2e3ebdSchin ino_t e_tty_ino; 131da2e3ebdSchin dev_t e_tty_dev; 132da2e3ebdSchin char *e_tty; 133da2e3ebdSchin #endif 134da2e3ebdSchin #if SHOPT_OLDTERMIO 135da2e3ebdSchin char e_echoctl; 136da2e3ebdSchin char e_tcgeta; 137da2e3ebdSchin struct termio e_ott; 138da2e3ebdSchin #endif 139da2e3ebdSchin #if SHOPT_MULTIBYTE 140da2e3ebdSchin int e_curchar; 141da2e3ebdSchin int e_cursize; 142da2e3ebdSchin #endif 143da2e3ebdSchin int *e_globals; /* global variables */ 144da2e3ebdSchin genchar *e_window; /* display window image */ 145da2e3ebdSchin char e_inmacro; /* processing macro expansion */ 146da2e3ebdSchin #if KSHELL 147da2e3ebdSchin char e_vi_insert[2]; /* for sh_keytrap */ 148da2e3ebdSchin int32_t e_col; /* for sh_keytrap */ 149da2e3ebdSchin #else 150da2e3ebdSchin char e_prbuff[PRSIZE]; /* prompt buffer */ 151da2e3ebdSchin #endif /* KSHELL */ 152da2e3ebdSchin struct termios e_ttyparm; /* initial tty parameters */ 153da2e3ebdSchin struct termios e_nttyparm; /* raw tty parameters */ 154da2e3ebdSchin struct termios e_savetty; /* saved terminal state */ 155da2e3ebdSchin int e_savefd; /* file descriptor for saved terminal state */ 156da2e3ebdSchin char e_macro[4]; /* macro buffer */ 157da2e3ebdSchin void *e_vi; /* vi specific data */ 158da2e3ebdSchin void *e_emacs; /* emacs specific data */ 159da2e3ebdSchin Shell_t *sh; /* interpreter pointer */ 160da2e3ebdSchin char *e_stkptr; /* saved stack pointer */ 161da2e3ebdSchin int e_stkoff; /* saved stack offset */ 162da2e3ebdSchin char **e_clist; /* completion list after <ESC>= */ 163da2e3ebdSchin int e_nlist; /* number of elements on completion list */ 164da2e3ebdSchin int e_multiline; /* allow multiple lines for editing */ 165da2e3ebdSchin int e_winsz; /* columns in window */ 166da2e3ebdSchin Edpos_t e_curpos; /* cursor line and column */ 167da2e3ebdSchin Namval_t *e_default; /* variable containing default value */ 168da2e3ebdSchin Namval_t *e_term; /* TERM variable */ 169da2e3ebdSchin char e_termname[80]; /* terminal name */ 170*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT 171*b30d1939SAndy Fiddaman Histmatch_t **hlist; 172*b30d1939SAndy Fiddaman Histmatch_t *hfirst; 173*b30d1939SAndy Fiddaman unsigned short nhlist; 174*b30d1939SAndy Fiddaman unsigned short hoff; 175*b30d1939SAndy Fiddaman unsigned short hmax; 176*b30d1939SAndy Fiddaman char hpat[40]; 177*b30d1939SAndy Fiddaman char *hstak; 178*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */ 179da2e3ebdSchin } Edit_t; 180da2e3ebdSchin 181da2e3ebdSchin #undef MAXWINDOW 182da2e3ebdSchin #define MAXWINDOW 300 /* maximum width window */ 183da2e3ebdSchin #define FAST 2 184da2e3ebdSchin #define SLOW 1 185da2e3ebdSchin #define ESC cntl('[') 186da2e3ebdSchin #define UEOF -2 /* user eof char synonym */ 187da2e3ebdSchin #define UINTR -3 /* user intr char synonym */ 188da2e3ebdSchin #define UERASE -4 /* user erase char synonym */ 189da2e3ebdSchin #define UKILL -5 /* user kill char synonym */ 190da2e3ebdSchin #define UWERASE -6 /* user word erase char synonym */ 191da2e3ebdSchin #define ULNEXT -7 /* user next literal char synonym */ 192da2e3ebdSchin 193da2e3ebdSchin #if ( 'a' == 97) /* ASCII? */ 194da2e3ebdSchin # define cntl(x) (x&037) 195da2e3ebdSchin #else 196da2e3ebdSchin # define cntl(c) (c=='D'?55:(c=='E'?45:(c=='F'?46:(c=='G'?'\a':(c=='H'?'\b': \ 197da2e3ebdSchin (c=='I'?'\t':(c=='J'?'\n':(c=='T'?60:(c=='U'?61:(c=='V'?50: \ 198da2e3ebdSchin (c=='W'?38:(c=='Z'?63:(c=='['?39:(c==']'?29: \ 199da2e3ebdSchin (c<'J'?c+1-'A':(c+10-'J')))))))))))))))) 200da2e3ebdSchin #endif 201da2e3ebdSchin 202da2e3ebdSchin #if !KSHELL 203da2e3ebdSchin # define STRIP 0377 204da2e3ebdSchin # define GMACS 1 205da2e3ebdSchin # define EMACS 2 206da2e3ebdSchin # define VIRAW 4 207da2e3ebdSchin # define EDITVI 8 208da2e3ebdSchin # define NOHIST 16 209da2e3ebdSchin # define EDITMASK 15 210da2e3ebdSchin # define is_option(m) (opt_flag&(m)) 211da2e3ebdSchin extern char opt_flag; 212da2e3ebdSchin # ifdef SYSCALL 213da2e3ebdSchin # define read(fd,buff,n) syscall(3,fd,buff,n) 214da2e3ebdSchin # else 215da2e3ebdSchin # define read(fd,buff,n) rEAd(fd,buff,n) 216da2e3ebdSchin # endif /* SYSCALL */ 217da2e3ebdSchin #endif /* KSHELL */ 218da2e3ebdSchin 219da2e3ebdSchin extern void ed_crlf(Edit_t*); 220da2e3ebdSchin extern void ed_putchar(Edit_t*, int); 221da2e3ebdSchin extern void ed_ringbell(void); 222da2e3ebdSchin extern void ed_setup(Edit_t*,int, int); 223da2e3ebdSchin extern void ed_flush(Edit_t*); 224da2e3ebdSchin extern int ed_getchar(Edit_t*,int); 225da2e3ebdSchin extern int ed_virt_to_phys(Edit_t*,genchar*,genchar*,int,int,int); 226da2e3ebdSchin extern int ed_window(void); 227da2e3ebdSchin extern void ed_ungetchar(Edit_t*,int); 228da2e3ebdSchin extern int ed_viread(void*, int, char*, int, int); 229da2e3ebdSchin extern int ed_read(void*, int, char*, int, int); 230da2e3ebdSchin extern int ed_emacsread(void*, int, char*, int, int); 231da2e3ebdSchin extern Edpos_t ed_curpos(Edit_t*, genchar*, int, int, Edpos_t); 232da2e3ebdSchin extern int ed_setcursor(Edit_t*, genchar*, int, int, int); 233da2e3ebdSchin #if KSHELL 234da2e3ebdSchin extern int ed_macro(Edit_t*,int); 235da2e3ebdSchin extern int ed_expand(Edit_t*, char[],int*,int*,int,int); 236da2e3ebdSchin extern int ed_fulledit(Edit_t*); 237da2e3ebdSchin extern void *ed_open(Shell_t*); 238da2e3ebdSchin #endif /* KSHELL */ 239da2e3ebdSchin # if SHOPT_MULTIBYTE 240da2e3ebdSchin extern int ed_internal(const char*, genchar*); 241da2e3ebdSchin extern int ed_external(const genchar*, char*); 242da2e3ebdSchin extern void ed_gencpy(genchar*,const genchar*); 243da2e3ebdSchin extern void ed_genncpy(genchar*,const genchar*,int); 244da2e3ebdSchin extern int ed_genlen(const genchar*); 245da2e3ebdSchin extern int ed_setwidth(const char*); 246da2e3ebdSchin # endif /* SHOPT_MULTIBYTE */ 247*b30d1939SAndy Fiddaman #if SHOPT_EDPREDICT 248*b30d1939SAndy Fiddaman extern int ed_histgen(Edit_t*, const char*); 249*b30d1939SAndy Fiddaman extern void ed_histlist(Edit_t*, int); 250*b30d1939SAndy Fiddaman #endif /* SHOPT_EDPREDICT */ 251da2e3ebdSchin 252da2e3ebdSchin extern const char e_runvi[]; 253da2e3ebdSchin #if !KSHELL 254da2e3ebdSchin extern const char e_version[]; 255da2e3ebdSchin #endif /* KSHELL */ 256da2e3ebdSchin 257da2e3ebdSchin #if SHOPT_HISTEXPAND 258da2e3ebdSchin 259da2e3ebdSchin /* flags */ 260da2e3ebdSchin 261da2e3ebdSchin #define HIST_EVENT 0x1 /* event designator seen */ 262da2e3ebdSchin #define HIST_QUESTION 0x2 /* question mark event designator */ 263da2e3ebdSchin #define HIST_HASH 0x4 /* hash event designator */ 264da2e3ebdSchin #define HIST_WORDDSGN 0x8 /* word designator seen */ 265da2e3ebdSchin #define HIST_QUICKSUBST 0x10 /* quick substition designator seen */ 266da2e3ebdSchin #define HIST_SUBSTITUTE 0x20 /* for substition loop */ 267da2e3ebdSchin #define HIST_NEWLINE 0x40 /* newline in squashed white space */ 268da2e3ebdSchin 269da2e3ebdSchin /* modifier flags */ 270da2e3ebdSchin 271da2e3ebdSchin #define HIST_PRINT 0x100 /* print new command */ 272da2e3ebdSchin #define HIST_QUOTE 0x200 /* quote resulting history line */ 273da2e3ebdSchin #define HIST_QUOTE_BR 0x400 /* quote every word on space break */ 274da2e3ebdSchin #define HIST_GLOBALSUBST 0x800 /* apply substition globally */ 275da2e3ebdSchin 276da2e3ebdSchin #define HIST_ERROR 0x1000 /* an error ocurred */ 277da2e3ebdSchin 278da2e3ebdSchin /* flags to be returned */ 279da2e3ebdSchin 280da2e3ebdSchin #define HIST_FLAG_RETURN_MASK (HIST_EVENT|HIST_PRINT|HIST_ERROR) 281da2e3ebdSchin 282da2e3ebdSchin extern int hist_expand(const char *, char **); 283da2e3ebdSchin #endif 284da2e3ebdSchin 285da2e3ebdSchin #endif 286da2e3ebdSchin #endif 287