diff options
author | peter <peter@FreeBSD.org> | 1996-11-01 06:45:43 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1996-11-01 06:45:43 +0000 |
commit | 59cc89c2c2e686da3bdab2d5cfac4f33462d29fe (patch) | |
tree | 88f923c9c0be2e2a225a9b21716fd582de668b42 /contrib/nvi/common/gs.h | |
download | FreeBSD-src-59cc89c2c2e686da3bdab2d5cfac4f33462d29fe.zip FreeBSD-src-59cc89c2c2e686da3bdab2d5cfac4f33462d29fe.tar.gz |
Import of nvi-1.79, minus a few bits that we dont need (eg: postscript
files, curses, db, regex etc that we already have). The other glue will
follow shortly.
Obtained from: Keith Bostic <bostic@bostic.com>
Diffstat (limited to 'contrib/nvi/common/gs.h')
-rw-r--r-- | contrib/nvi/common/gs.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/contrib/nvi/common/gs.h b/contrib/nvi/common/gs.h new file mode 100644 index 0000000..e5a43a6 --- /dev/null +++ b/contrib/nvi/common/gs.h @@ -0,0 +1,210 @@ +/*- + * Copyright (c) 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1993, 1994, 1995, 1996 + * Keith Bostic. All rights reserved. + * + * See the LICENSE file for redistribution information. + * + * @(#)gs.h 10.34 (Berkeley) 9/24/96 + */ + +#define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */ + +/* + * File reference structure (FREF). The structure contains the name of the + * file, along with the information that follows the name. + * + * !!! + * The read-only bit follows the file name, not the file itself. + */ +struct _fref { + CIRCLEQ_ENTRY(_fref) q; /* Linked list of file references. */ + char *name; /* File name. */ + char *tname; /* Backing temporary file name. */ + + recno_t lno; /* 1-N: file cursor line. */ + size_t cno; /* 0-N: file cursor column. */ + +#define FR_CURSORSET 0x0001 /* If lno/cno values valid. */ +#define FR_DONTDELETE 0x0002 /* Don't delete the temporary file. */ +#define FR_EXNAMED 0x0004 /* Read/write renamed the file. */ +#define FR_NAMECHANGE 0x0008 /* If the name changed. */ +#define FR_NEWFILE 0x0010 /* File doesn't really exist yet. */ +#define FR_RECOVER 0x0020 /* File is being recovered. */ +#define FR_TMPEXIT 0x0040 /* Modified temporary file, no exit. */ +#define FR_TMPFILE 0x0080 /* If file has no name. */ +#define FR_UNLOCKED 0x0100 /* File couldn't be locked. */ + u_int16_t flags; +}; + +/* Action arguments to scr_exadjust(). */ +typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t; + +/* Screen attribute arguments to scr_attr(). */ +typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t; + +/* Key type arguments to scr_keyval(). */ +typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t; + +/* + * GS: + * + * Structure that describes global state of the running program. + */ +struct _gs { + char *progname; /* Programe name. */ + + int id; /* Last allocated screen id. */ + CIRCLEQ_HEAD(_dqh, _scr) dq; /* Displayed screens. */ + CIRCLEQ_HEAD(_hqh, _scr) hq; /* Hidden screens. */ + + SCR *ccl_sp; /* Colon command-line screen. */ + + void *perl_interp; /* Perl interpreter. */ + void *tcl_interp; /* Tcl_Interp *: Tcl interpreter. */ + + void *cl_private; /* Curses support private area. */ + void *ip_private; /* IP support private area. */ + void *tk_private; /* Tk/Tcl support private area. */ + + /* File references. */ + CIRCLEQ_HEAD(_frefh, _fref) frefq; + +#define GO_COLUMNS 0 /* Global options: columns. */ +#define GO_LINES 1 /* Global options: lines. */ +#define GO_SECURE 2 /* Global options: secure. */ +#define GO_TERM 3 /* Global options: terminal type. */ + OPTION opts[GO_TERM + 1]; + + DB *msg; /* Message catalog DB. */ + MSGH msgq; /* User message list. */ +#define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */ + CHAR_T noprint; /* Cached, unprintable character. */ + + char *tmp_bp; /* Temporary buffer. */ + size_t tmp_blen; /* Temporary buffer size. */ + + /* + * Ex command structures (EXCMD). Defined here because ex commands + * exist outside of any particular screen or file. + */ +#define EXCMD_RUNNING(gp) ((gp)->ecq.lh_first->clen != 0) + LIST_HEAD(_excmdh, _excmd) ecq; /* Ex command linked list. */ + EXCMD excmd; /* Default ex command structure. */ + char *if_name; /* Current associated file. */ + recno_t if_lno; /* Current associated line number. */ + + char *c_option; /* Ex initial, command-line command. */ + +#ifdef DEBUG + FILE *tracefp; /* Trace file pointer. */ +#endif + + EVENT *i_event; /* Array of input events. */ + size_t i_nelem; /* Number of array elements. */ + size_t i_cnt; /* Count of events. */ + size_t i_next; /* Offset of next event. */ + + CB *dcbp; /* Default cut buffer pointer. */ + CB dcb_store; /* Default cut buffer storage. */ + LIST_HEAD(_cuth, _cb) cutq; /* Linked list of cut buffers. */ + +#define MAX_BIT_SEQ 128 /* Max + 1 fast check character. */ + LIST_HEAD(_seqh, _seq) seqq; /* Linked list of maps, abbrevs. */ + bitstr_t bit_decl(seqb, MAX_BIT_SEQ); + +#define MAX_FAST_KEY 254 /* Max fast check character.*/ +#define KEY_LEN(sp, ch) \ + ((unsigned char)(ch) <= MAX_FAST_KEY ? \ + sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch)) +#define KEY_NAME(sp, ch) \ + ((unsigned char)(ch) <= MAX_FAST_KEY ? \ + sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch)) + struct { + CHAR_T name[MAX_CHARACTER_COLUMNS + 1]; + u_int8_t len; + } cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */ + +#define KEY_VAL(sp, ch) \ + ((unsigned char)(ch) <= MAX_FAST_KEY ? \ + sp->gp->special_key[(unsigned char)ch] : \ + (unsigned char)(ch) > sp->gp->max_special ? 0 : v_key_val(sp,ch)) + CHAR_T max_special; /* Max special character. */ + u_char /* Fast lookup table. */ + special_key[MAX_FAST_KEY + 1]; + +/* Flags. */ +#define G_ABBREV 0x0001 /* If have abbreviations. */ +#define G_BELLSCHED 0x0002 /* Bell scheduled. */ +#define G_INTERRUPTED 0x0004 /* Interrupted. */ +#define G_RECOVER_SET 0x0008 /* Recover system initialized. */ +#define G_SCRIPTED 0x0010 /* Ex script session. */ +#define G_SCRWIN 0x0020 /* Scripting windows running. */ +#define G_SNAPSHOT 0x0040 /* Always snapshot files. */ +#define G_SRESTART 0x0080 /* Screen restarted. */ +#define G_TMP_INUSE 0x0100 /* Temporary buffer in use. */ + u_int32_t flags; + + /* Screen interface functions. */ + /* Add a string to the screen. */ + int (*scr_addstr) __P((SCR *, const char *, size_t)); + /* Toggle a screen attribute. */ + int (*scr_attr) __P((SCR *, scr_attr_t, int)); + /* Terminal baud rate. */ + int (*scr_baud) __P((SCR *, u_long *)); + /* Beep/bell/flash the terminal. */ + int (*scr_bell) __P((SCR *)); + /* Display a busy message. */ + void (*scr_busy) __P((SCR *, const char *, busy_t)); + /* Clear to the end of the line. */ + int (*scr_clrtoeol) __P((SCR *)); + /* Return the cursor location. */ + int (*scr_cursor) __P((SCR *, size_t *, size_t *)); + /* Delete a line. */ + int (*scr_deleteln) __P((SCR *)); + /* Get a keyboard event. */ + int (*scr_event) __P((SCR *, EVENT *, u_int32_t, int)); + /* Ex: screen adjustment routine. */ + int (*scr_ex_adjust) __P((SCR *, exadj_t)); + int (*scr_fmap) /* Set a function key. */ + __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); + /* Get terminal key value. */ + int (*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *)); + /* Insert a line. */ + int (*scr_insertln) __P((SCR *)); + /* Handle an option change. */ + int (*scr_optchange) __P((SCR *, int, char *, u_long *)); + /* Move the cursor. */ + int (*scr_move) __P((SCR *, size_t, size_t)); + /* Message or ex output. */ + void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); + /* Refresh the screen. */ + int (*scr_refresh) __P((SCR *, int)); + /* Rename the file. */ + int (*scr_rename) __P((SCR *, char *, int)); + /* Set the screen type. */ + int (*scr_screen) __P((SCR *, u_int32_t)); + /* Suspend the editor. */ + int (*scr_suspend) __P((SCR *, int *)); + /* Print usage message. */ + void (*scr_usage) __P((void)); +}; + +/* + * XXX + * Block signals if there are asynchronous events. Used to keep DB system calls + * from being interrupted and not restarted, as that will result in consistency + * problems. This should be handled by DB. + */ +#ifdef BLOCK_SIGNALS +#include <signal.h> +extern sigset_t __sigblockset; +#define SIGBLOCK \ + (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL) +#define SIGUNBLOCK \ + (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL); +#else +#define SIGBLOCK +#define SIGUNBLOCK +#endif |