365 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			365 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* ELLE - Copyright 1982, 1984 by Ken Harrenstien, SRI International
 | |
|  *	This software is quasi-public; it may be used freely with
 | |
|  *	like software, but may NOT be sold or made part of licensed
 | |
|  *	products without permission of the author.
 | |
|  */
 | |
| /*
 | |
|  * ELLE.H	Global ELLE definitions
 | |
|  */
 | |
| 
 | |
| #ifndef EXT
 | |
| #define EXT extern	/* Default assumes these are referencing decls */
 | |
| #endif
 | |
| 
 | |
| /* Make identifiers unique in 1st 6 chars as per ANSI rule for externals */
 | |
| #define tvc_cin tvccin
 | |
| #define tvc_cdn tvccdn
 | |
| #define tvc_lin tvclin
 | |
| #define tvc_ldn tvcldn
 | |
| #define ev_fno1 evfno1
 | |
| #define ev_fno2 evfno2
 | |
| #define ev_fnn1 evfnn1
 | |
| #define ev_fnn2 evfnn2
 | |
| 
 | |
| #define ask_sall	asksal	/* eebuff.c */
 | |
| #define ask_save	asksav
 | |
| #define buf_tmod	buftmo
 | |
| #define buf_tmat	buftma
 | |
| #define e_gobob		egobob	/* eeedit.c */
 | |
| #define e_gobol		egobol
 | |
| #define e_goeob		egoeob
 | |
| #define e_goeol		egoeol
 | |
| #define fill_prefix	filpfx	/* eefill.c */
 | |
| #define fill_plen	filpln
 | |
| #define fill_cur_line	filcln
 | |
| #define kill_ptr	kilptr		/* eef3.c */
 | |
| #define kill_push	kilpsh
 | |
| #define ed_insert	edinst	/* eefed.c */
 | |
| #define ed_insn		edinsn
 | |
| #define ed_deln		eddeln
 | |
| #define ed_delete	eddele
 | |
| #define f_fillreg	ffilrg	/* eejust.c */
 | |
| #define f_fillpara	ffilpa
 | |
| 
 | |
| #include "eesite.h"	/* Insert site-dependent flags and parameters */
 | |
| #include "sb.h"		/* Insert SB package definitions */
 | |
| #include "eeprof.h"	/* Insert user profile definition.  This is a
 | |
| 			 *	separate file so ELLEC can use it too. */
 | |
| #include "eefidx.h"	/* Insert desired function defs */
 | |
| 
 | |
| /* ELLE Compile-time parameter defaults */
 | |
| 
 | |
| #ifndef KILL_LEN
 | |
| #define KILL_LEN 8	/* Size of kill ring */
 | |
| #endif
 | |
| #ifndef MAXHT
 | |
| #define MAXHT 72	/* Height (# lines) of largest screen we'll suport */
 | |
| #endif
 | |
| #ifndef MAXLINE
 | |
| #define MAXLINE 132	/* Width  (# chars) of largest screen we'll support */
 | |
| #endif
 | |
| #ifndef FNAMELEN
 | |
| #define FNAMELEN 14	/* Sys-dep: Max size of last filename component */
 | |
| #endif			/*	Check FNAMSIZ if you change this. */
 | |
| #ifndef FNAMSIZ
 | |
| #define FNAMSIZ 100	/* Sys-dep: Max size of complete filename */
 | |
| #endif			/*	This must be at least as large as FNAMELEN! */
 | |
| #ifndef ISRCHLIM
 | |
| #define ISRCHLIM 50	/* Max # of chars to allow I-search on */
 | |
| #endif
 | |
| #ifndef TOBFSIZ
 | |
| #define TOBFSIZ 80	/* Size of TTY output buffer */
 | |
| #endif
 | |
| #ifndef TIBFSIZ
 | |
| #define TIBFSIZ 50	/* Size of TTY input buffer */
 | |
| #endif
 | |
| #ifndef ECHOLINES
 | |
| #define ECHOLINES 1	/* # of lines for echo area (below mode line) */
 | |
| #endif
 | |
| #ifndef MAXARGFILES
 | |
| #define MAXARGFILES 2	/* # of filename args OK at startup */
 | |
| #endif
 | |
| 
 | |
| /* ELLE initialized variables.
 | |
|  *	Initial values are defined in EEVINI.C, but the vars must be
 | |
|  * declared here as well so that references from all modules will
 | |
|  * compile correctly.
 | |
|  */
 | |
| 
 | |
| extern char *ev_verstr;		/* String: Editor name and version # */
 | |
| extern int ev_filmod;		/* Default file creation mode */
 | |
| extern char *ev_fno1,*ev_fno2;	/* Pre, postfix for "old" filenames */
 | |
| extern char *ev_fnn1,*ev_fnn2;	/* Pre, postfix for "new" filenames */
 | |
| extern int ev_fcolumn;		/* Fill Column variable */
 | |
| #if FX_INDCOMM
 | |
| extern int ev_ccolumn;		/* Comment Column variable */
 | |
| #endif
 | |
| extern int ev_nwpct, ev_mvpct;	/* New window selection percentages */
 | |
| #if FX_SOWIND
 | |
| extern int ev_modwso;		/* Initial mode window standout flag */
 | |
| #endif
 | |
| #if FX_2MODEWINDS
 | |
| extern int ev_2modws;		/* Initial setting of 2-mode-window flag */
 | |
| #endif
 | |
| extern char *ev_markshow;	/* String to show when Set Mark done */
 | |
| extern char *ev_helpfile;	/* Location of ELLE help file */
 | |
| extern char *ev_profile;	/* Filename of ELLE binary user profile */
 | |
| extern struct profile def_prof;	/* ELLE default user profile */
 | |
| 
 | |
| /* Global variables */
 | |
| 
 | |
| EXT chroff cur_dot;		/* Current dot */
 | |
| EXT chroff mark_dot;		/* Dot for mark */
 | |
| EXT int mark_p;			/* flag indicating whether mark exists */
 | |
| EXT int this_cmd, last_cmd;	/* Command type */
 | |
| EXT int unrchf;			/* Stuffed character back for readcommand */
 | |
| EXT int exp;			/* Numeric argument for commands */
 | |
| EXT int exp_p;			/* Flag meaning an arg was given */
 | |
| EXT int pgoal;			/* Permanent goal column */
 | |
| EXT int goal;
 | |
| EXT char *srch_str;		/* Last search string specified (0 = none) */
 | |
| EXT int srch_len;		/* Length of srch_str string */
 | |
| EXT int ask_len;		/* Length of last string returned by "ask" */
 | |
| EXT char *homedir;		/* User's home directory */
 | |
| EXT int kill_ptr;		/* Index into kill ring */
 | |
| extern SBSTR *kill_ring[];	/* Kill ring table (allocated in eevini) */
 | |
| 
 | |
| /* Editor Command types */
 | |
| 
 | |
| #define KILLCMD 1		/* Kill command, for kill merging */
 | |
| #define ARGCMD  2		/* Argument-setter, for main loop */
 | |
| #define YANKCMD 3		/* Yank command, for yankpop */
 | |
| #define LINECMD 4		/* Next or previous line goal hacking */
 | |
| #if IMAGEN
 | |
| #define INSCMD  5		/* Simple char-insert command, for autowrap */
 | |
| #endif /*IMAGEN*/
 | |
| 
 | |
| /* Misc char definitions */
 | |
| #define CTRL(ch) (037&ch)
 | |
| #define BELL	('\007')	/* Will become \a in ANSI */
 | |
| #define BS	('\b')
 | |
| #define TAB	('\t')
 | |
| #define LF	('\n')
 | |
| #define FF	('\f')
 | |
| #define CR	('\r')
 | |
| #define ESC	('\033')
 | |
| #define SP	(' ')
 | |
| #define DEL	('\177')
 | |
| 
 | |
| #define CB_META (0200)		/* Meta bit in command char */
 | |
| #define CB_EXT  (0400)		/* Extend bit in command char */
 | |
| #define METIZER ESC
 | |
| #define EXTIZER CTRL('X')
 | |
| 
 | |
| /* Terminal parameters - set at runtime startup */
 | |
| 
 | |
| EXT char *tv_stype;	/* Terminal type string specified by user/system */
 | |
| EXT int scr_ht;		/* # lines of main screen area */
 | |
| EXT int scr_wid;	/* # columns of screen */
 | |
| EXT int scr_wd0;	/* scr_wid - 1 (for 0-origin stuff) */
 | |
| EXT int trm_ospeed;	/* Output speed index */
 | |
| EXT int tvc_pos;	/* Cost for absolute move (# of output chars) */
 | |
| EXT int tvc_bs;		/* Cost for backspace */
 | |
| EXT int tvc_ci, tvc_cin;	/* Char ins cost per call, cost per column */
 | |
| EXT int tvc_cd, tvc_cdn;	/* Char del   "   "   "     "    "   "     */
 | |
| EXT int tvc_li, tvc_lin;	/* Line ins cost per call, cost per line */
 | |
| EXT int tvc_ld, tvc_ldn;	/* Line del   "   "   "     "    "   "   */
 | |
| 
 | |
| EXT int trm_flags;	/* Terminal capabilities - bit flags */
 | |
| 			/* Maybe change to word vars someday (faster) */
 | |
| #define TF_IDLIN	01	/* Has I/D line */
 | |
| #define TF_IDCHR	02	/* Has I/D char */
 | |
| #define TF_SO		04	/* Has usable standout mode */
 | |
| #define TF_CLEOL	010	/* Has clear-to-eol */
 | |
| #define TF_METAKEY	020	/* Has meta key */
 | |
| #define TF_DIRVID	040	/* Has direct-video type interface */
 | |
| 
 | |
| 
 | |
| /* Redisplay definitions */
 | |
| 
 | |
| EXT int curs_lin;	/* Line # of current cursor (0 origin) */
 | |
| EXT int curs_col;	/* Column # of current cursor (0 origin) */
 | |
| 
 | |
| EXT int rd_type;	/* Global var: holds redisplay "hints" */
 | |
| #define redp(n) rd_type |= (n)
 | |
| 
 | |
| #define RD_SCREEN 01	/* Clear everything and redisplay */
 | |
| #define RD_WINDS 02	/* Check all windows for changes (b/emod) */
 | |
| #define RD_MODE 04	/* Mode line has changed, update it. */
 | |
| #define RD_WINRES 0400	/* Assume all of window was changed (clear b/emod) */
 | |
| #define RD_MOVE	010	/* Cursor has moved */
 | |
| #define RD_UPDWIN 020	/* Window fixed, must update modified screen lines */
 | |
| /*#define RD_ICHR 0	*//* Hint: Char insert done */
 | |
| /*#define RD_DCHR 0	*//* Hint: Char del done */
 | |
| #define RD_ILIN 0100	/* Hint: Line insert done */
 | |
| #define RD_DLIN 0200	/* Hint: Line del done */
 | |
| 
 | |
| /* #define RD_MOVWIN 02000	*//* Window should be re-positioned */
 | |
| #define RD_FIXWIN 02000		/* Window needs fixing (call fix_wind) */
 | |
| #define RD_TMOD   04000		/* Text changed in this window, check it. */
 | |
| #define RD_WINCLR 010000	/* Clear window with CLEOLs (not yet) */
 | |
| #define RD_CHKALL 020000	/* Check all windows for redisplay flags */
 | |
| #if IMAGEN
 | |
| #define RD_REDO   040000	/* Just re-do the entire window, don't think */
 | |
| #endif /*IMAGEN*/
 | |
| 
 | |
| 	/* Flags with global effects, only seen in rd_type */
 | |
| #define RDS_GLOBALS (RD_SCREEN|RD_MODE|RD_WINDS|RD_CHKALL)
 | |
| 	/* Flags which are allowed per-window (in w_redp) */
 | |
| #define RDS_WINFLGS (~RDS_GLOBALS)
 | |
| 	/* Flags which force FIX_WIND() to do something */
 | |
| #define RDS_DOFIX (RD_WINRES|RD_TMOD|RD_FIXWIN|RD_MOVE)
 | |
| 
 | |
| #define CI_CLINE '!'		/* Char indicator for continued line */
 | |
| #define CI_CNTRL '^'		/* Char indicator for control chars */
 | |
| #define CI_META  '~'		/* Char indicator for meta-bit (8th) set */
 | |
| #define CI_TOP   '|'		/* Char indicator for top-bit (9th) set */
 | |
| #define MAXCHAR (8+3)		/* Longest char representation (TAB) + slop */
 | |
| 
 | |
| /* Definitions for screen structures */
 | |
| 
 | |
| struct scr_line {
 | |
| 	chroff sl_boff;		/* Ptr to start of line's text in buffer */
 | |
| 	int sl_len;		/* # buffer chars in line (incl NL) */
 | |
| 	char *sl_line;		/* Ptr to screen image of line */
 | |
| 	int sl_col;		/* # chars in image == # columns used */
 | |
| 	char sl_flg;		/* Flags - set if this line modified */
 | |
| 	char sl_cont;		/* If line being continued on next, this */
 | |
| 				/* contains 1 plus # extra chars (if any) */
 | |
| 				/* stored at end of this line which shd be */
 | |
| 				/* put at beg of next line. */
 | |
| 	char *sl_nlin;	/* New screen image line if modified flag set */
 | |
| 	int sl_ncol;
 | |
| };
 | |
| 	/* sl_flg definitions */
 | |
| #define SL_MOD 01		/* New line exists, must update to it */
 | |
| #define SL_EOL 02		/* Buffer line ends with EOL */
 | |
| #define SL_CSO 04		/* Current screen line is in standout mode */
 | |
| #define SL_NSO 010		/* New screen line is in standout mode */
 | |
| #if IMAGEN
 | |
| #define SL_REDO 0100		/* Line should be redone completely */
 | |
| #endif /*IMAGEN*/
 | |
| 
 | |
| extern struct scr_line *scr[];	/* Screen line ptrs (allocated in e_vinit) */
 | |
| 
 | |
| 
 | |
| /* Buffer stuff */
 | |
| 
 | |
| struct buffer 
 | |
| {	SBBUF b_sb;			/* MUST be 1st thing! */
 | |
| 	struct buffer *b_next;		/* ptr to next in chain */
 | |
| 	char *b_name;			/* text name */
 | |
| 	char *b_fn;			/* filename */
 | |
| 	chroff b_dot;			/* point (dot) */
 | |
| 	int b_flags;			/* misc. bits */
 | |
| 	struct majmode *b_mode;		/* Mode of buffer */
 | |
| #if IMAGEN
 | |
| 	long b_mtime;			/* Last file modification time */
 | |
| #endif /*IMAGEN*/
 | |
| };
 | |
| 	/* b_flags definitions */
 | |
| #define B_MODIFIED	01		/* Buffer is modified */
 | |
| #define B_EOLCRLF	0200		/* On = CRLF mode, off = LF mode */
 | |
| #if IMAGEN
 | |
| #define B_PERMANENT 002			/* buffer cannot be killed */
 | |
| #define B_CMODE	    004			/* "C" mode (HACK HACK) */
 | |
| #define B_BACKEDUP  010			/* Buffer has been backed up once */
 | |
| #define B_TEXTMODE  020			/* Text mode (auto-wrap, basically) */
 | |
| #define B_QUERYREP  040			/* Query-replace mode (qualifier) */
 | |
| #endif /*IMAGEN*/
 | |
| 
 | |
| /* Handy macro to check EOL mode */
 | |
| #define eolcrlf(buf) (((struct buffer *)buf)->b_flags&B_EOLCRLF)
 | |
| 
 | |
| /* Buffer pointers */
 | |
| 
 | |
| EXT struct buffer
 | |
| 		 *buf_head,		/* head of list of all buffers */
 | |
| 		 *cur_buf,		/* buffer we are editing now */
 | |
| 		 *last_buf,		/* buffer we were editing before */
 | |
| 		 *lines_buf;		/* buffer for sep_win */
 | |
| 
 | |
| /* Window stuff */
 | |
| 
 | |
| struct window
 | |
| {	struct window *w_next;		/* ptr to next in chain */
 | |
| 	int w_flags;			/* Window flags */
 | |
| 	int w_pos;			/* index of top line */
 | |
| 	int w_ht;			/* number of lines */
 | |
| 	struct buffer *w_buf;		/* buffer in this window */
 | |
| 	int w_pct;			/* % of buffer window is at */
 | |
| 	int w_redp;			/* Redisplay hints */
 | |
| 	chroff w_topldot;		/* line currently at top of window */
 | |
| 	chroff w_dot;			/* Saved dot while not cur_win */
 | |
| 	chroff w_bmod;			/* Lower bound of modified text */
 | |
| 	chroff w_emod;			/* Upper bound of modified text */
 | |
| 					/* (offset from end of buffer!) */
 | |
| 	chroff w_oldz;			/* Buffer len as of last update */
 | |
| };
 | |
| 
 | |
| /* Window flags */
 | |
| #define W_STANDOUT	01	/* Use terminal's standout mode for window */
 | |
| #define W_MODE		02	/* This is a mode window */
 | |
| 
 | |
| /* Window pointers */
 | |
| 
 | |
| EXT struct window
 | |
| 		*win_head,		/* head of list of all windows */
 | |
| 		*cur_win,		/* window we are now in */
 | |
| 		*user_win,		/* current user window */
 | |
| 		*oth_win,		/* "other" user window */
 | |
| 		*mode_win,		/* window for mode line */
 | |
| 		*ask_win,		/* window for ask (echo) area */
 | |
| 		*sep_win;		/* window for separation dashes */
 | |
| 
 | |
| /* Major Mode stuff.  Each buffer has its own major mode.
 | |
|  * Only one major mode may be in effect at any time.
 | |
|  */
 | |
| struct majmode {
 | |
| 	char *mjm_name;		/* Simple for now */
 | |
| };
 | |
| EXT struct majmode *fun_mode;	/* Fundamental mode - the default */
 | |
| EXT struct majmode *cur_mode;	/* Current major mode */
 | |
| 
 | |
| /* Minor modes are currently implemented by means of flag variables
 | |
|  * which have global effects (regardless of buffer or major mode).
 | |
|  * Each variable has the name "x_mode" where x is the name of the minor
 | |
|  * mode.  These are declared in the modules containing their support code.
 | |
|  * In the future this may be generalized along the lines of major modes.
 | |
|  */
 | |
| 
 | |
| 
 | |
| /* Miscellaneous debug stuff */
 | |
| 
 | |
| EXT int dbgval;		/* Set nonzero to do verify stuff */
 | |
| EXT int dbg_isw;	/* Set to enable interrupts if possible */
 | |
| #if IMAGEN
 | |
| EXT int dbg_redp;	/* Set to debug redisplay algorithms */
 | |
| #endif /*IMAGEN*/
 | |
| extern int errno;
 | |
| 
 | |
| /* V7 routines for setexit/reset emulation */
 | |
| 
 | |
| #if !(V6)
 | |
| #include <setjmp.h>
 | |
| EXT jmp_buf env_main;
 | |
| #define setexit(a)	setjmp(env_main)
 | |
| #define reset(a)	longjmp(env_main,a)
 | |
| #endif /*-V6*/
 | |
| 
 | |
| /* Declare functions returning CHROFF values (offsets into a buffer) */
 | |
| 
 | |
| extern chroff e_dot(),e_nldot(),e_pldot(),e_boldot(),e_eoldot(),
 | |
| 	e_alldot(),ex_boldot(),ex_alldot(),
 | |
| 	ex_blen(),e_blen(),ex_dot(),e_wdot();
 | |
| 
 | |
| extern SBSTR *e_copyn();
 | |
| 
 | |
| /* Some other commonly needed declarations */
 | |
| 
 | |
| extern char *memalloc(), *ask(), *dottoa(), *strdup();
 | |
| #if !(V6)
 | |
| extern char *getenv();
 | |
| #endif /*-V6*/
 | |
| #include "eeproto.h"	/* function prototypes */
 | 
