source: trunk/third/nvi/common/gs.h @ 14302

Revision 14302, 7.3 KB checked in by ghudson, 25 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14301, which included commits to RCS files with non-trunk default branches.
Line 
1/*-
2 * Copyright (c) 1993, 1994
3 *      The Regents of the University of California.  All rights reserved.
4 * Copyright (c) 1993, 1994, 1995, 1996
5 *      Keith Bostic.  All rights reserved.
6 *
7 * See the LICENSE file for redistribution information.
8 *
9 *      @(#)gs.h        10.34 (Berkeley) 9/24/96
10 */
11
12#define TEMPORARY_FILE_STRING   "/tmp"  /* Default temporary file name. */
13
14/*
15 * File reference structure (FREF).  The structure contains the name of the
16 * file, along with the information that follows the name.
17 *
18 * !!!
19 * The read-only bit follows the file name, not the file itself.
20 */
21struct _fref {
22        CIRCLEQ_ENTRY(_fref) q;         /* Linked list of file references. */
23        char    *name;                  /* File name. */
24        char    *tname;                 /* Backing temporary file name. */
25
26        recno_t  lno;                   /* 1-N: file cursor line. */
27        size_t   cno;                   /* 0-N: file cursor column. */
28
29#define FR_CURSORSET    0x0001          /* If lno/cno values valid. */
30#define FR_DONTDELETE   0x0002          /* Don't delete the temporary file. */
31#define FR_EXNAMED      0x0004          /* Read/write renamed the file. */
32#define FR_NAMECHANGE   0x0008          /* If the name changed. */
33#define FR_NEWFILE      0x0010          /* File doesn't really exist yet. */
34#define FR_RECOVER      0x0020          /* File is being recovered. */
35#define FR_TMPEXIT      0x0040          /* Modified temporary file, no exit. */
36#define FR_TMPFILE      0x0080          /* If file has no name. */
37#define FR_UNLOCKED     0x0100          /* File couldn't be locked. */
38        u_int16_t flags;
39};
40
41/* Action arguments to scr_exadjust(). */
42typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
43
44/* Screen attribute arguments to scr_attr(). */
45typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
46
47/* Key type arguments to scr_keyval(). */
48typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
49
50/*
51 * GS:
52 *
53 * Structure that describes global state of the running program.
54 */
55struct _gs {
56        char    *progname;              /* Programe name. */
57
58        int      id;                    /* Last allocated screen id. */
59        CIRCLEQ_HEAD(_dqh, _scr) dq;    /* Displayed screens. */
60        CIRCLEQ_HEAD(_hqh, _scr) hq;    /* Hidden screens. */
61
62        SCR     *ccl_sp;                /* Colon command-line screen. */
63
64        void    *perl_interp;           /* Perl interpreter. */
65        void    *tcl_interp;            /* Tcl_Interp *: Tcl interpreter. */
66
67        void    *cl_private;            /* Curses support private area. */
68        void    *ip_private;            /* IP support private area. */
69        void    *tk_private;            /* Tk/Tcl support private area. */
70
71                                        /* File references. */
72        CIRCLEQ_HEAD(_frefh, _fref) frefq;
73
74#define GO_COLUMNS      0               /* Global options: columns. */
75#define GO_LINES        1               /* Global options: lines. */
76#define GO_SECURE       2               /* Global options: secure. */
77#define GO_TERM         3               /* Global options: terminal type. */
78        OPTION   opts[GO_TERM + 1];
79
80        DB      *msg;                   /* Message catalog DB. */
81        MSGH     msgq;                  /* User message list. */
82#define DEFAULT_NOPRINT '\1'            /* Emergency non-printable character. */
83        CHAR_T   noprint;               /* Cached, unprintable character. */
84
85        char    *tmp_bp;                /* Temporary buffer. */
86        size_t   tmp_blen;              /* Temporary buffer size. */
87
88        /*
89         * Ex command structures (EXCMD).  Defined here because ex commands
90         * exist outside of any particular screen or file.
91         */
92#define EXCMD_RUNNING(gp)       ((gp)->ecq.lh_first->clen != 0)
93        LIST_HEAD(_excmdh, _excmd) ecq; /* Ex command linked list. */
94        EXCMD    excmd;                 /* Default ex command structure. */
95        char     *if_name;              /* Current associated file. */
96        recno_t   if_lno;               /* Current associated line number. */
97
98        char    *c_option;              /* Ex initial, command-line command. */
99
100#ifdef DEBUG
101        FILE    *tracefp;               /* Trace file pointer. */
102#endif
103
104        EVENT   *i_event;               /* Array of input events. */
105        size_t   i_nelem;               /* Number of array elements. */
106        size_t   i_cnt;                 /* Count of events. */
107        size_t   i_next;                /* Offset of next event. */
108
109        CB      *dcbp;                  /* Default cut buffer pointer. */
110        CB       dcb_store;             /* Default cut buffer storage. */
111        LIST_HEAD(_cuth, _cb) cutq;     /* Linked list of cut buffers. */
112
113#define MAX_BIT_SEQ     128             /* Max + 1 fast check character. */
114        LIST_HEAD(_seqh, _seq) seqq;    /* Linked list of maps, abbrevs. */
115        bitstr_t bit_decl(seqb, MAX_BIT_SEQ);
116
117#define MAX_FAST_KEY    254             /* Max fast check character.*/
118#define KEY_LEN(sp, ch)                                                 \
119        ((unsigned char)(ch) <= MAX_FAST_KEY ?                          \
120            sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
121#define KEY_NAME(sp, ch)                                                \
122        ((unsigned char)(ch) <= MAX_FAST_KEY ?                          \
123            sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
124        struct {
125                CHAR_T   name[MAX_CHARACTER_COLUMNS + 1];
126                u_int8_t len;
127        } cname[MAX_FAST_KEY + 1];      /* Fast lookup table. */
128
129#define KEY_VAL(sp, ch)                                                 \
130        ((unsigned char)(ch) <= MAX_FAST_KEY ?                          \
131            sp->gp->special_key[(unsigned char)ch] :                    \
132            (unsigned char)(ch) > sp->gp->max_special ? 0 : v_key_val(sp,ch))
133        CHAR_T   max_special;           /* Max special character. */
134        u_char                          /* Fast lookup table. */
135            special_key[MAX_FAST_KEY + 1];
136
137/* Flags. */
138#define G_ABBREV        0x0001          /* If have abbreviations. */
139#define G_BELLSCHED     0x0002          /* Bell scheduled. */
140#define G_INTERRUPTED   0x0004          /* Interrupted. */
141#define G_RECOVER_SET   0x0008          /* Recover system initialized. */
142#define G_SCRIPTED      0x0010          /* Ex script session. */
143#define G_SCRWIN        0x0020          /* Scripting windows running. */
144#define G_SNAPSHOT      0x0040          /* Always snapshot files. */
145#define G_SRESTART      0x0080          /* Screen restarted. */
146#define G_TMP_INUSE     0x0100          /* Temporary buffer in use. */
147        u_int32_t flags;
148
149        /* Screen interface functions. */
150                                        /* Add a string to the screen. */
151        int     (*scr_addstr) __P((SCR *, const char *, size_t));
152                                        /* Toggle a screen attribute. */
153        int     (*scr_attr) __P((SCR *, scr_attr_t, int));
154                                        /* Terminal baud rate. */
155        int     (*scr_baud) __P((SCR *, u_long *));
156                                        /* Beep/bell/flash the terminal. */
157        int     (*scr_bell) __P((SCR *));
158                                        /* Display a busy message. */
159        void    (*scr_busy) __P((SCR *, const char *, busy_t));
160                                        /* Clear to the end of the line. */
161        int     (*scr_clrtoeol) __P((SCR *));
162                                        /* Return the cursor location. */
163        int     (*scr_cursor) __P((SCR *, size_t *, size_t *));
164                                        /* Delete a line. */
165        int     (*scr_deleteln) __P((SCR *));
166                                        /* Get a keyboard event. */
167        int     (*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
168                                        /* Ex: screen adjustment routine. */
169        int     (*scr_ex_adjust) __P((SCR *, exadj_t));
170        int     (*scr_fmap)             /* Set a function key. */
171            __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
172                                        /* Get terminal key value. */
173        int     (*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *));
174                                        /* Insert a line. */
175        int     (*scr_insertln) __P((SCR *));
176                                        /* Handle an option change. */
177        int     (*scr_optchange) __P((SCR *, int, char *, u_long *));
178                                        /* Move the cursor. */
179        int     (*scr_move) __P((SCR *, size_t, size_t));
180                                        /* Message or ex output. */
181        void    (*scr_msg) __P((SCR *, mtype_t, char *, size_t));
182                                        /* Refresh the screen. */
183        int     (*scr_refresh) __P((SCR *, int));
184                                        /* Rename the file. */
185        int     (*scr_rename) __P((SCR *, char *, int));
186                                        /* Set the screen type. */
187        int     (*scr_screen) __P((SCR *, u_int32_t));
188                                        /* Suspend the editor. */
189        int     (*scr_suspend) __P((SCR *, int *));
190                                        /* Print usage message. */
191        void    (*scr_usage) __P((void));
192};
193
194/*
195 * XXX
196 * Block signals if there are asynchronous events.  Used to keep DB system calls
197 * from being interrupted and not restarted, as that will result in consistency
198 * problems.  This should be handled by DB.
199 */
200#ifdef BLOCK_SIGNALS
201#include <signal.h>
202extern sigset_t __sigblockset;
203#define SIGBLOCK \
204        (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
205#define SIGUNBLOCK \
206        (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);
207#else
208#define SIGBLOCK
209#define SIGUNBLOCK
210#endif
Note: See TracBrowser for help on using the repository browser.