/* TECO for DOS Copyright (C) 1986-1991 Matt Fichtenbaum */ /* Based on Ultrix TECO (C) 1986-1990 GenRad Inc., Concord, MA 01742 */ /* These programs may be copied if this copyright notice is included and */ /* only on a "not for sale or profit" basis */ /* te_defs.h definitions file 03/21/91 21.43 */ /* 8-bit version 04/18/91 09.20 */ /* version with "SWAP" 08/01/91 23.10 */ /* version with separate filespec buffers for pri, sec I/O 09/16/91 20.37 */ /* improved dly_freebuf 01/12/92 14.10 */ /* add directory command 03/30/92 21.45 */ /* add 11:w 'mark' function 09/02/92 21.47 */ /* 4 buffers 03/11/93 10.14 */ /* assignable windows/buffers 12/09/93 11.15 */ #include #undef BUFSIZ #define BUFSIZ 2048 #include #include #include #define VERSION 36 /* this TECO is closest to v. 36 */ #define CTL(x) ((x) & 0x1f) /* for control chars */ #define ERROR(e) longjmp(xxx, (e)) #define BLOCKSIZE (0x2000) /* size of buffer memory block to allocate */ #define DBLOCKSIZE (0x200) /* size of data cell memory block */ #define CELLSIZE 512 /* number of characters per cell */ #define CSTACKSIZE 64 /* size of command stack */ #define MSTACKSIZE 64 /* size of macro stack */ #define QSTACKSIZE 64 /* size of q register stack */ #define ESTACKSIZE 64 /* size of expression stack */ #define TTIBUFSIZE 1024 /* size of type-ahead buffer */ #define BUFF_LIMIT 16384 /* text buffer soft limit for ED & 4 */ #define NQREGS 36 /* number of Q registers */ #define NEXTQREGS 36 /* number of extended Q registers */ #define MAX_BUFFERS 4 /* maximum number of text buffers */ #define CBUFF 0 /* id for command buffer */ #define SERBUF NQREGS+1 /* and search string buffer */ #define FILBUF0 NQREGS+2 /* and primary file string buffer */ #define FILBUF1 NQREGS+3 /* and secondary file string buffer */ #define SYSBUF NQREGS+6 /* and system command buffer */ #define TIMBUF NQREGS+7 /* and time/date buffer */ #define DIRBUF NQREGS+8 /* and current directory buffer */ #define DIRNAME NQREGS+9 /* and directory name buffer */ #define EXTQREGS NQREGS+10 /* and extended Q registers */ #define EXTALPHQREGS EXTQREGS+10 /* and alphabetic extended Q registers */ #define cbuf qreg[CBUFF] /* shorthand for command-string header */ #define sbuf qreg[SERBUF] /* and for search-buffer header */ #define fbuf qreg[filbuf] /* and for file-buffer header */ #define sysbuf qreg[SYSBUF] /* and for system command header */ #define timbuf qreg[TIMBUF] /* and for time/date header */ #define dirbuf qreg[DIRBUF] /* and directory */ #define dirname qreg[DIRNAME] #define cptr (*msp) /* command string is top of macro stack */ #define cmdstr mstack[0] /* for entering command string */ #define TAB 011 /* define special chars */ #define LF 012 #define VT 013 #define FF 014 #define CR 015 #define ESC 033 #define DEL 0177 /* expression operators */ #define OP_START 1 #define OP_ADD 2 #define OP_SUB 3 #define OP_MULT 4 #define OP_DIV 5 #define OP_AND 6 #define OP_OR 7 /* macro flags */ #define F_ITER 1 /* bits in special-character table */ #define A_S 1 /* "skipto()" special character */ #define A_T 2 /* command with std text argument */ #define A_E 4 /* E takes a text argument */ #define A_F 8 /* F takes a text argument */ #define A_X 16 /* char causes "skipto()" to exit */ #define A_Q 32 /* command with q-register argument */ #define A_A 64 /* special char in search string */ #define A_L 128 /* character is a line separator */ /* define names for window control registers */ #define WN_type win_data[0] #define WN_width win_data[1] #define WN_height win_data[2] #define WN_seeall win_data[3] #define WN_mark win_data[4] #define WN_hold win_data[5] #define WN_origin win_data[6] #define WN_scroll win_data[7] #define WN_secondary win_data[8] #define WN_sec_origin win_data[9] #define WN_primary win_data[10] #define WN_mark2 win_data[11] #define WN_buff3 win_data[12] #define WN_buff4 win_data[13] #define WN_buff3_origin win_data[14] #define WN_buff4_origin win_data[15] /* define display operations */ #define WIN_OFF 0 /* disable window */ #define WIN_SUSP 1 /* suspend window */ #define WIN_INIT 2 /* turn on window */ #define WIN_RESUME 3 /* re-enable window */ #define WIN_REFR 4 /* refresh window */ #define WIN_LINE 5 /* display one line */ #define WIN_REDRAW 6 /* force window absolute redraw on next refresh */ #define WIN_DISP 7 /* refresh window even if not enabled */ /* define scope special functions */ #define VT_CLEAR 0 /* clear screen */ #define VT_EEOL 1 /* erase to eol */ #define VT_SETSPEC1 2 /* set special (reverse) video */ #define VT_SETSPEC2 3 /* alternative special video */ #define VT_CLRSPEC 4 /* clear it */ #define VT_BS1 5 /* backspace and erase 1 */ #define VT_BS2 6 /* backspace and erase 2 */ #define VT_LINEUP 7 /* up one line */ #define VT_EBOL 8 /* erase from bol */ #define VT_SETCURS 9 /* set cursor */ #define VT_LINEFEED 10 /* cursor on LF */ #define VT_LINECONT 11 /* contin char, no cursor */ #define VT_BSP1 12 /* back space one position */ #define VT_BSP2 13 /* back space two positions */ #define VT_SETMARK 14 /* set marked-region colors */ /* define keyboard modes */ #define TTY_OFF 0 /* final "off" */ #define TTY_SUSP 1 /* temporary suspend */ #define TTY_ON 2 /* initial "on" */ #define TTY_RESUME 3 /* resume after suspend */ /* define values for ED, ET, EZ flags */ #define ED_CARET 1 #define ED_YPROT 2 #define ED_EXPMEM 4 #define ED_SFAIL 16 #define ED_SMULT 64 #define ET_IMAGE 1 #define ET_SCOPE 2 #define ET_LCASE 4 #define ET_NOECHO 8 #define ET_CTRLO 16 #define ET_NOWAIT 32 #define ET_DETACH 64 #define ET_QUIT 128 #define ET_TRUNC 256 #define ET_SCOPEWATCH 512 #define ET_REFSCOPEWATCH 1024 #define ET_INP_REDIR 4096 #define ET_OUT_REDIR 8192 #define ET_GRAPH 16384 #define ET_CTRLC 32768 /* mask for writeable ET bits */ #define ET_MASK 0x81a9 #define EZ_CRLF 1 #define EZ_READFF 2 #define EZ_TAB4 4 #define EZ_NOTMPFIL 8 #define EZ_NOTABI 16 #define EZ_NOVTFF 32 #define EZ_MULT 64 #define EZ_AUTOIO 128 #define EZ_MOUSE 256 #define EZ_MOUSE_L 512 #define EZ_MOUSE_R 1024 #define EZ_SWAP 8192 #define EZ_EIGHTBIT 16384 #define EZ_EXTQ 32768 /* error codes */ #define E_BNI 1 #define E_CPQ 2 #define E_COF 3 #define E_FNF 4 #define E_IEC 5 #define E_IFC 6 #define E_IIA 7 #define E_ILL 8 #define E_ILN 9 #define E_IPA 10 #define E_IQC 11 #define E_IQN 12 #define E_IRA 13 #define E_ISA 14 #define E_ISS 15 #define E_IUC 16 #define E_MEM 17 #define E_MRP 18 #define E_NAB 19 #define E_NAC 20 #define E_NAE 21 #define E_NAP 22 #define E_NAQ 23 #define E_NAS 24 #define E_NAU 25 #define E_NFI 26 #define E_NFO 27 #define E_NYA 28 #define E_OFO 29 #define E_PDO 30 #define E_POP 31 #define E_SNI 32 #define E_SRH 33 #define E_STL 34 #define E_UTC 35 #define E_UTM 36 #define E_XAB 37 #define E_YCA 38 #define E_IWA 39 #define E_NFR 40 #define E_INT 41 #define E_EFI 42 #define E_IAA 43 #define E_AMB 44 #define E_SYS 45 #define E_STR 46 #define E_IBS 47 #define E_IOS 48 #define E_FBC 49 #define E_IMX 50 #define E_NOM 51 #define E_IMO 52 #define E_MOU 53 #define E_DIR 54 /* define buffer cell */ /* a buffer cell is a forward pointer, a backward pointer, */ /* and CELLSIZE characters */ #ifdef FAR_BUFFER typedef struct buffcell _far * BUFFPTR; #else typedef struct buffcell * BUFFPTR; #endif struct buffcell { BUFFPTR f; /* forward pointer */ BUFFPTR b; /* backward pointer */ short usecount; /* count of current uses */ unsigned char ch[CELLSIZE]; /* char storage */ }; /* define structures for buffer header, q-register header, */ /* q-register pointer, macro stack entry, and macro iteration list */ /* these are really alternative ways of looking at the same cell */ struct qh /* q-register header */ { BUFFPTR f; /* forward pointer */ BUFFPTR b; /* backward pointer */ long z; /* number of characters */ long v; /* q-register numeric value */ } ; struct qp /* q-register pointer/macro stack entry */ { struct qp *f; /* forward pointer */ BUFFPTR p; /* pointer to a buffer cell */ BUFFPTR head; /* pointer to start of q-reg text (to keep track of macro execution) */ long z; /* number of characters in object pointed to */ long dot; /* current character position */ struct is *il; /* iteration list pointer */ short c; /* character offset */ short flag; /* flags for "iteration in process," "ei macro," etc. */ short *condsp; /* saved conditional stack pointer */ } ; struct is /* macro iteration list entry */ { struct is *f; /* forward pointer */ struct is *b; /* backward pointer */ BUFFPTR p; /* cell with start of iteration */ long dot; /* char position where iteration started */ long count; /* iteration count */ short c; /* char offset where iteration started */ short dflag; /* definite iteration flag */ } ; struct bh /* buffer header list entry */ { BUFFPTR f; /* pointer to buffer */ BUFFPTR b; /* null pointer */ long z; /* number of characters */ long ctrl_e; /* form feed flag */ long buff_mod; /* buffer - modified position for display */ } ; struct lbh /* logical buffer/window header */ { struct bh *phys; /* pointer to physical buffer */ long dot; /* current pointer position */ long mark; /* marked region start */ long mark2; /* marked region end */ }; /* define expression stack entry */ struct exp_entry { long val1; /* first value */ long flag1; /* nonzero if there is a first value */ long val2; /* second value (set by 'comma') */ long flag2; /* nonzero if there is one */ long exp; /* expression in process */ short op; /* operation to be applied */ } ; /* define file data structures */ struct infiledata /* structure of input file info */ { FILE *fd; /* file pointer */ short eofsw; /* end-of-file switch */ } ; struct outfiledata /* structure of output file info */ { FILE *fd; /* file pointer */ unsigned char proto[13]; /* temp file name */ unsigned char f_name[CELLSIZE+5]; /* real name of output */ unsigned char t_name[CELLSIZE+5]; /* temporary output name */ unsigned char drive[_MAX_DRIVE]; /* drive string */ unsigned char dir[_MAX_DIR]; /* directory string */ unsigned char fname[_MAX_FNAME]; /* name string */ unsigned char extens[_MAX_EXT]; /* extension string */ short name_size; /* number of chars in name */ short bak; /* backup flag */ char temp_ext[4]; /* extension for temp output file name */ } ; extern unsigned short filbuf; /* selector for current filename buffer */ extern struct infiledata *infile; /* pointer to currently active intput file structure */ extern struct outfiledata *outfile; /* pointer to currently active output file structure */ extern struct outfiledata out_files[]; /* output file descriptors */ /* define global variables, etc. */ extern short char_count; /* char count for tab typer */ extern unsigned char lastc; /* last char read */ extern short ttyerr; /* error return from ioctl */ extern short inp_noterm; /* nonzero if standard in is not a terminal */ extern short out_noterm; /* nonzero if standard out is not a term. */ extern jmp_buf xxx; /* preserved environment for error restart */ extern short err; /* local error code */ extern struct qp t_qp; /* temporary buffer pointer */ extern struct qp aa, bb, cc; /* more temporaries */ extern struct buffcell t_bcell; /* temporary bcell */ extern unsigned char char_mask; /* 7- or 8-bit character mask */ extern short tabmask; /* mask for selecting 4/8 char tabs */ extern short exitflag; /* flag for ending command str exec */ extern unsigned char term_char; /* terminator for insert, search, etc. */ extern unsigned char cmdc; /* current command character */ extern unsigned char skipc; /* char found by "skipto()" */ extern long tdot; /* current, last, temp buffer position */ extern long ll, mm, nn; /* general temps */ extern long ins_count; /* count of chars inserted */ extern long ctrl_r; /* current number radix (8, 10, 16) */ extern long ctrl_s; /* string length for S, I, G */ extern long ctrl_x; /* search case flag */ extern long ed_val; /* ED value */ extern long es_val; /* ES value */ extern long et_val; /* ET value */ extern long eu_val; /* EU value */ extern long ev_val; /* EV value */ extern long ez_val; /* EZ value */ extern short srch_result; /* result of last :S executed */ extern short atflag; /* flag for @ char typed */ extern short colonflag; /* flag for : char typed */ extern short trace_sw; /* nonzero if tracing command exec */ extern short redraw_sw; /* nonzero forces window redraw */ extern short win_data[]; /* window control parameters */ extern BUFFPTR insert_p; /* pointer to temp text buffer during insert */ extern long buff_mod; /* set to earliest buffer change */ extern short search_flag; /* set nonzero by search */ extern unsigned char *errors[]; /* error text */ extern unsigned char mapch[], mapch_l[]; /* char mapping tables */ extern unsigned char spec_chars[]; /* special character table */ extern unsigned char skipto(short), getcmdc(short), getcmdc0(short); /* routines that return chars */ extern FILE *eisw; /* indirect command file pointer */ extern FILE *fopen(); extern BUFFPTR freebuff; /* buffcell free-list pointer */ extern BUFFPTR dly_freebuff; /* delayed free-list pointer */ extern struct is *freedcell; /* cell free-list pointer */ extern BUFFPTR get_bcell(void); /* get buffcell routine */ extern struct is *get_dcell(void); /* get data cell routine */ extern short reset_mouse(void); /* reset mouse driver */ extern unsigned short do_mouse_event(void); /* respond to a mouse interrupt */ extern void display_mouse(unsigned short mouse_disp_func); extern void clear_mouse(void); extern void do_mouse(void); extern long setup_mouse(long); extern void check_interrupt(void); extern short gettty(); extern short gettty_nowait(); extern void out_flush(); extern void out_str(unsigned char *p); extern int getqspec(int fors, unsigned char c); /* fors ("file or search") nonzero = allow _ or * */ extern short peekcmdc(unsigned char arg); extern int read_file(struct qp *rbuff, long *nchars, short endsw); extern long build_string(struct qh *sbuff); extern int end_search(int result); extern void do_fq(void); extern void te_fx(void); extern void init_wd(short); extern short set_wd(short), do_e_slash(); /* the text buffer header */ extern struct qh buff; extern struct bh buffs[]; extern struct lbh lbuffs[], *pbuff; /* the q-register headers point to the start of the buffer and registers */ extern struct qh qreg[]; /* for q regs, command, search, file */ /* the q-register stack contains temporary copies of q-register contents */ extern struct qh qstack[]; /* q-reg stack */ extern struct qh *qsp; /* q-reg stack pointer */ /* the macro stack contains pointers to the currently active macros. */ /* the top of the stack is the command pointer */ extern struct qp mstack[]; /* macro stack */ extern struct qp *msp; /* macro stack pointer */ /* the expression stack */ extern struct exp_entry estack[]; /* expression stack */ extern struct exp_entry *esp; /* expression stack pointer */ /* function declarations */ void exec_cmdstr(void), exec_cmds1(void), do_e(void), do_f(void); void write_file(struct qp *wbuff, long nchars, short ffsw); void kill_output(struct outfiledata *); void pop_iteration(short), find_enditer(void); void delete1(long), insert1(void), insert2(long), do_o(void), do_ctlp(void); void fwdcx(struct qp *); short fwdc(struct qp *), backc(struct qp *); void set_pointer(long, struct qp *); void vt(int), do_window(int), set_term_par(void), window(short); void display_lines(void); long xy_to_dot(long x, long y, long *p_bufsel); long get_value(int), lines(long), line_args(int, struct qp *); long setup_search(void), do_fb(void); int do_nsearch(char), do_search(long); void set_var(short, long *), movenchars(struct qp *, struct qp *, long); void moveuntil(struct qp *, struct qp *, unsigned char, long *, long, int); void free_blist(BUFFPTR), dly_free_blist(BUFFPTR), free_dlyd_blist(BUFFPTR); void make_buffer(struct qh *); void reset_q_usecounts(void); void setup_tty(short), type_char(unsigned char), crlf(void); /* mouse definitions */ #define KEY_MOUSEL 0376 #define KEY_MOUSEL_S 0376 #define KEY_MOUSEL_C 0376 #define KEY_MOUSEL_A 0376 #define KEY_MOUSER 0377 #define KEY_MOUSER_S 0377 #define KEY_MOUSER_C 0377 #define KEY_MOUSER_A 0377 #define KEY_MOUSEM 0375 #define KEY_MOUSEM_S 0375 #define KEY_MOUSEM_C 0375 #define KEY_MOUSEM_A 0375 #define fm_ctrl fm_vals[0] #define fm_dot fm_vals[1] #define fm_buff fm_vals[2] #define fm_y fm_vals[3] #define fm_x fm_vals[4] #define MOUSE_IS_ENABLED 1 #define MOUSE_IS_INVISIBLE 2 #define MOUSE_WHILE_EXEC 4 #define MOUSE_HIDE 0 #define MOUSE_SHOW 1 #define MOUSE_RDCMD 2 #define MOUSE_NORDCMD 3 #define MOUSE_SUSPEND 5 #define MOUSE_RESUME 6 extern long fm_vals[]; extern short term_rows, term_cols; extern unsigned long video_buffer; extern unsigned short mouse_event_flag; extern struct buffcell id_cell;