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