1 /*        $NetBSD: gs.h,v 1.4 2018/08/07 08:05:47 rin Exp $ */
2 /*-
3  * Copyright (c) 1993, 1994
4  *        The Regents of the University of California.  All rights reserved.
5  * Copyright (c) 1993, 1994, 1995, 1996
6  *        Keith Bostic.  All rights reserved.
7  *
8  * See the LICENSE file for redistribution information.
9  *
10  *        Id: gs.h,v 10.55 2001/11/01 10:28:25 skimo Exp  (Berkeley) Date: 2001/11/01 10:28:25
11  */
12 
13 #define   TEMPORARY_FILE_STRING         "/tmp"    /* Default temporary file name. */
14 
15 /*
16  * File reference structure (FREF).  The structure contains the name of the
17  * file, along with the information that follows the name.
18  *
19  * !!!
20  * The read-only bit follows the file name, not the file itself.
21  */
22 struct _fref {
23           TAILQ_ENTRY(_fref) q;                   /* Linked list of file references. */
24           char      *name;                        /* File name. */
25           char      *tname;                       /* Backing temporary file name. */
26 
27           db_recno_t           lno;                         /* 1-N: file cursor line. */
28           size_t     cno;                         /* 0-N: file cursor column. */
29 
30 #define   FR_CURSORSET        0x0001              /* If lno/cno values valid. */
31 #define   FR_DONTDELETE       0x0002              /* Don't delete the temporary file. */
32 #define   FR_EXNAMED          0x0004              /* Read/write renamed the file. */
33 #define   FR_NAMECHANGE       0x0008              /* If the name changed. */
34 #define   FR_NEWFILE          0x0010              /* File doesn't really exist yet. */
35 #define   FR_RECOVER          0x0020              /* File is being recovered. */
36 #define   FR_TMPEXIT          0x0040              /* Modified temporary file, no exit. */
37 #define   FR_TMPFILE          0x0080              /* If file has no name. */
38 #define   FR_UNLOCKED         0x0100              /* File couldn't be locked. */
39           u_int16_t flags;
40 };
41 
42 /* Action arguments to scr_exadjust(). */
43 typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
44 
45 /* Screen attribute arguments to scr_attr(). */
46 typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
47 
48 #ifdef IMCTRL
49 /* Input method control arguments to scr_imctrl(). */
50 typedef enum { IMCTRL_INIT, IMCTRL_OFF, IMCTRL_ON } imctrl_t;
51 #endif
52 
53 /* Key type arguments to scr_keyval(). */
54 typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
55 
56 /*
57  * GS:
58  *
59  * Structure that describes global state of the running program.
60  */
61 struct _gs {
62           char      *progname;                    /* Programe name. */
63 
64           int        id;                          /* Last allocated screen id. */
65           TAILQ_HEAD(_dqh, _win) dq;    /* Displayed windows. */
66           TAILQ_HEAD(_hqh, _scr) hq;    /* Hidden screens. */
67 
68           void      *perl_interp;                 /* Perl interpreter. */
69           void      *tcl_interp;                  /* Tcl_Interp *: Tcl interpreter. */
70 
71           void      *cl_private;                  /* Curses support private area. */
72           void      *tk_private;                  /* Tk/Tcl support private area. */
73 
74                                                   /* File references. */
75           TAILQ_HEAD(_frefh, _fref) frefq;
76                                                   /* File structures. */
77           TAILQ_HEAD(_exfh, _exf) exfq;
78 
79 #define   GO_COLUMNS          0                   /* Global options: columns. */
80 #define   GO_LINES  1                   /* Global options: lines. */
81 #define   GO_SECURE 2                   /* Global options: secure. */
82 #define   GO_TERM             3                   /* Global options: terminal type. */
83           OPTION     opts[GO_TERM + 1];
84 
85           DB        *msg;                         /* Message catalog DB. */
86           MSGH       msgq;                        /* User message list. */
87 #define   DEFAULT_NOPRINT     '\1'                /* Emergency non-printable character. */
88           int        noprint;           /* Cached, unprintable character. */
89 
90           char      *c_option;                    /* Ex initial, command-line command. */
91 
92 #ifdef DEBUG
93           FILE      *tracefp;           /* Trace file pointer. */
94 #endif
95 
96 #define   MAX_BIT_SEQ         0x7f                /* Max + 1 fast check character. */
97           LIST_HEAD(_seqh, _seq) seqq;  /* Linked list of maps, abbrevs. */
98           bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1);
99 
100 #define   MAX_FAST_KEY        0xff                /* Max fast check character.*/
101 #define   KEY_LEN(sp, ch)                                                                 \
102           (((ch) & ~MAX_FAST_KEY) == 0 ?                                                  \
103               sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch))
104 #define   KEY_NAME(sp, ch)                                                      \
105           (((ch) & ~MAX_FAST_KEY) == 0 ?                                                  \
106               sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch))
107           struct {
108                     u_char     name[MAX_CHARACTER_COLUMNS + 1];
109                     u_int8_t len;
110           } cname[MAX_FAST_KEY + 1];    /* Fast lookup table. */
111 
112 #define   KEY_VAL(sp, ch)                                                                 \
113           (((ch) & ~MAX_FAST_KEY) == 0 ?                                                  \
114               sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch))
115           e_key_t                                 /* Fast lookup table. */
116               special_key[MAX_FAST_KEY + 1];
117 
118 /* Flags. */
119 #define   G_ABBREV  0x0001              /* If have abbreviations. */
120 #define   G_BELLSCHED         0x0002              /* Bell scheduled. */
121 #define   G_INTERRUPTED       0x0004              /* Interrupted. */
122 #define   G_RECOVER_SET       0x0008              /* Recover system initialized. */
123 #define   G_SCRIPTED          0x0010              /* Ex script session. */
124 #define   G_SCRWIN  0x0020              /* Scripting windows running. */
125 #define   G_SNAPSHOT          0x0040              /* Always snapshot files. */
126 #define   G_SRESTART          0x0080              /* Screen restarted. */
127           u_int32_t flags;
128 
129           /* Screen interface functions. */
130                                                   /* Add a string to the screen. */
131           int       (*scr_addstr) __P((SCR *, const char *, size_t));
132                                                   /* Add a string to the screen. */
133           int       (*scr_waddstr) __P((SCR *, const CHAR_T *, size_t));
134                                                   /* Toggle a screen attribute. */
135           int       (*scr_attr) __P((SCR *, scr_attr_t, int));
136                                                   /* Terminal baud rate. */
137           int       (*scr_baud) __P((SCR *, u_long *));
138                                                   /* Beep/bell/flash the terminal. */
139           int       (*scr_bell) __P((SCR *));
140                                                   /* Display a busy message. */
141           void      (*scr_busy) __P((SCR *, const char *, busy_t));
142                                                   /* Prepare child. */
143           int       (*scr_child) __P((SCR *));
144                                                   /* Clear to the end of the line. */
145           int       (*scr_clrtoeol) __P((SCR *));
146                                                   /* Return the cursor location. */
147           int       (*scr_cursor) __P((SCR *, size_t *, size_t *));
148                                                   /* Delete a line. */
149           int       (*scr_deleteln) __P((SCR *));
150                                                   /* Discard a screen. */
151           int       (*scr_discard) __P((SCR *, SCR **));
152                                                   /* Get a keyboard event. */
153           int       (*scr_event) __P((SCR *, EVENT *, u_int32_t, int));
154                                                   /* Ex: screen adjustment routine. */
155           int       (*scr_ex_adjust) __P((SCR *, exadj_t));
156           int       (*scr_fmap)                   /* Set a function key. */
157               __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t));
158                                                   /* Get terminal key value. */
159           int       (*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *));
160 #ifdef IMCTRL
161                                                   /* Control the state of input method. */
162           void      (*scr_imctrl) __P((SCR *, imctrl_t));
163 #endif
164                                                   /* Insert a line. */
165           int       (*scr_insertln) __P((SCR *));
166                                                   /* Handle an option change. */
167           int       (*scr_optchange) __P((SCR *, int, const char *, u_long *));
168                                                   /* Move the cursor. */
169           int       (*scr_move) __P((SCR *, size_t, size_t));
170                                                   /* Refresh the screen. */
171           int       (*scr_refresh) __P((SCR *, int));
172                                                   /* Rename the file. */
173           int       (*scr_rename) __P((SCR *, char *, int));
174                                                   /* Reply to an event. */
175           int       (*scr_reply) __P((SCR *, int, char *));
176                                                   /* Set the screen type. */
177           int       (*scr_screen) __P((SCR *, u_int32_t));
178                                                   /* Split the screen. */
179           int       (*scr_split) __P((SCR *, SCR *));
180                                                   /* Suspend the editor. */
181           int       (*scr_suspend) __P((SCR *, int *));
182                                                   /* Print usage message. */
183           void      (*scr_usage) __P((void));
184 
185           /* Threading stuff */
186           void      *th_private;
187 
188           int       (*run) __P((WIN *, void *(*)(void*), void *));
189 
190           int       (*lock_init) __P((WIN *, void **));
191 #define LOCK_INIT(wp,s)                                                                       \
192           wp->gp->lock_init(wp, &s->lock)
193           int       (*lock_try) __P((WIN *, void **));
194 #define LOCK_TRY(wp,s)                                                                        \
195           wp->gp->lock_try(wp, &s->lock)
196           int       (*lock_unlock) __P((WIN *, void **));
197 #define LOCK_UNLOCK(wp,s)                                                           \
198           wp->gp->lock_unlock(wp, &s->lock)
199           int       (*lock_end) __P((WIN *, void **));
200 #define LOCK_END(wp,s)                                                                        \
201           wp->gp->lock_end(wp, &s->lock)
202 };
203 
204 /*
205  * XXX
206  * Block signals if there are asynchronous events.  Used to keep DB system calls
207  * from being interrupted and not restarted, as that will result in consistency
208  * problems.  This should be handled by DB.
209  */
210 #ifdef BLOCK_SIGNALS
211 #include <signal.h>
212 extern sigset_t     __sigblockset;
213 #define   SIGBLOCK \
214           (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL)
215 #define   SIGUNBLOCK \
216           (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL);
217 #else
218 #define   SIGBLOCK
219 #define   SIGUNBLOCK
220 #endif
221