1 /*- 2 * Copyright (c) 1992, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1992, 1993, 1994, 1995, 1996 5 * Keith Bostic. All rights reserved. 6 * 7 * See the LICENSE file for redistribution information. 8 */ 9 10 /* 11 * There are minimum values that vi has to have to display a screen. The row 12 * minimum is fixed at 1 (the svi code can share a line between the text line 13 * and the colon command/message line). Column calculation is a lot trickier. 14 * For example, you have to have enough columns to display the line number, 15 * not to mention guaranteeing that tabstop and shiftwidth values are smaller 16 * than the current column value. It's simpler to have a fixed value and not 17 * worry about it. 18 * 19 * XXX 20 * MINIMUM_SCREEN_COLS is almost certainly wrong. 21 */ 22 #define MINIMUM_SCREEN_ROWS 1 23 #define MINIMUM_SCREEN_COLS 20 24 25 /* 26 * SCR -- 27 * The screen structure. To the extent possible, all screen information 28 * is stored in the various private areas. The only information here 29 * is used by global routines or is shared by too many screens. 30 */ 31 struct _scr { 32 /* INITIALIZED AT SCREEN CREATE. */ 33 TAILQ_ENTRY(_scr) q; /* Screens. */ 34 35 int id; /* Screen id #. */ 36 int refcnt; /* Reference count. */ 37 38 GS *gp; /* Pointer to global area. */ 39 SCR *nextdisp; /* Next display screen. */ 40 SCR *ccl_parent; /* Colon command-line parent screen. */ 41 EXF *ep; /* Screen's current EXF structure. */ 42 43 FREF *frp; /* FREF being edited. */ 44 char **argv; /* NULL terminated file name array. */ 45 char **cargv; /* Current file name. */ 46 47 u_long ccnt; /* Command count. */ 48 u_long q_ccnt; /* Quit or ZZ command count. */ 49 50 /* Screen's: */ 51 size_t rows; /* 1-N: number of rows. */ 52 size_t cols; /* 1-N: number of columns. */ 53 size_t t_rows; /* 1-N: cur number of text rows. */ 54 size_t t_maxrows; /* 1-N: max number of text rows. */ 55 size_t t_minrows; /* 1-N: min number of text rows. */ 56 size_t coff; /* 0-N: screen col offset in display. */ 57 size_t roff; /* 0-N: screen row offset in display. */ 58 59 /* Cursor's: */ 60 recno_t lno; /* 1-N: file line. */ 61 size_t cno; /* 0-N: file character in line. */ 62 63 size_t rcm; /* Vi: 0-N: Most attractive column. */ 64 65 #define L_ADDED 0 /* Added lines. */ 66 #define L_CHANGED 1 /* Changed lines. */ 67 #define L_DELETED 2 /* Deleted lines. */ 68 #define L_JOINED 3 /* Joined lines. */ 69 #define L_MOVED 4 /* Moved lines. */ 70 #define L_SHIFT 5 /* Shift lines. */ 71 #define L_YANKED 6 /* Yanked lines. */ 72 recno_t rptlchange; /* Ex/vi: last L_CHANGED lno. */ 73 recno_t rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */ 74 75 TEXTH tiq[1]; /* Ex/vi: text input queue. */ 76 77 SCRIPT *script; /* Vi: script mode information .*/ 78 79 recno_t defscroll; /* Vi: ^D, ^U scroll information. */ 80 81 /* Display character. */ 82 char cname[MAX_CHARACTER_COLUMNS + 1]; 83 size_t clen; /* Length of display character. */ 84 ARG_CHAR_T lastc; /* The last display character. */ 85 86 enum { /* Vi editor mode. */ 87 SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT, 88 SM_REPLACE } showmode; 89 90 void *ex_private; /* Ex private area. */ 91 void *vi_private; /* Vi private area. */ 92 void *cl_private; /* Curses private area. */ 93 94 CONV conv; /* Conversion functions. */ 95 CONVWIN cw; /* Conversion buffer. */ 96 97 /* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */ 98 char *alt_name; /* Ex/vi: alternate file name. */ 99 100 CHAR_T at_lbuf; /* Ex/vi: Last executed at buffer. */ 101 102 /* Ex/vi: re_compile flags. */ 103 #define RE_C_CSCOPE 0x0001 /* Compile cscope pattern. */ 104 #define RE_C_SEARCH 0x0002 /* Compile search replacement. */ 105 #define RE_C_SILENT 0x0004 /* No error messages. */ 106 #define RE_C_SUBST 0x0008 /* Compile substitute replacement. */ 107 #define RE_C_TAG 0x0010 /* Compile ctag pattern. */ 108 109 #define RE_WSTART L("[[:<:]]") /* Ex/vi: not-in-word search pattern. */ 110 #define RE_WSTOP L("[[:>:]]") 111 #define RE_WSTART_LEN (SIZE(RE_WSTART) - 1) 112 #define RE_WSTOP_LEN (SIZE(RE_WSTOP) - 1) 113 /* Ex/vi: flags to search routines. */ 114 #define SEARCH_CSCOPE 0x0001 /* Search for a cscope pattern. */ 115 #define SEARCH_EOL 0x0002 /* Offset past EOL is okay. */ 116 #define SEARCH_FILE 0x0004 /* Search the entire file. */ 117 #define SEARCH_INCR 0x0008 /* Search incrementally. */ 118 #define SEARCH_MSG 0x0010 /* Display search messages. */ 119 #define SEARCH_PARSE 0x0020 /* Parse the search pattern. */ 120 #define SEARCH_SET 0x0040 /* Set search direction. */ 121 #define SEARCH_TAG 0x0080 /* Search for a tag pattern. */ 122 #define SEARCH_WMSG 0x0100 /* Display search-wrapped messages. */ 123 124 /* Ex/vi: RE information. */ 125 dir_t searchdir; /* Last file search direction. */ 126 regex_t re_c; /* Search RE: compiled form. */ 127 CHAR_T *re; /* Search RE: uncompiled form. */ 128 size_t re_len; /* Search RE: uncompiled length. */ 129 regex_t subre_c; /* Substitute RE: compiled form. */ 130 CHAR_T *subre; /* Substitute RE: uncompiled form. */ 131 size_t subre_len; /* Substitute RE: uncompiled length). */ 132 CHAR_T *repl; /* Substitute replacement. */ 133 size_t repl_len; /* Substitute replacement length.*/ 134 size_t *newl; /* Newline offset array. */ 135 size_t newl_len; /* Newline array size. */ 136 size_t newl_cnt; /* Newlines in replacement. */ 137 u_int8_t c_suffix; /* Edcompatible 'c' suffix value. */ 138 u_int8_t g_suffix; /* Edcompatible 'g' suffix value. */ 139 140 OPTION opts[O_OPTIONCOUNT]; /* Ex/vi: Options. */ 141 142 /* 143 * Screen flags. 144 * 145 * Editor screens. 146 */ 147 #define SC_EX 0x00000001 /* Ex editor. */ 148 #define SC_VI 0x00000002 /* Vi editor. */ 149 150 /* 151 * Screen formatting flags, first major, then minor. 152 * 153 * SC_SCR_EX 154 * Ex screen, i.e. cooked mode. 155 * SC_SCR_VI 156 * Vi screen, i.e. raw mode. 157 * SC_SCR_EXWROTE 158 * The editor had to write on the screen behind curses' back, and we can't 159 * let curses change anything until the user agrees, e.g. entering the 160 * commands :!utility followed by :set. We have to switch back into the 161 * vi "editor" to read the user's command input, but we can't touch the 162 * rest of the screen because it's known to be wrong. 163 * SC_SCR_REFORMAT 164 * The expected presentation of the lines on the screen have changed, 165 * requiring that the intended screen lines be recalculated. Implies 166 * SC_SCR_REDRAW. 167 * SC_SCR_REDRAW 168 * The screen doesn't correctly represent the file; repaint it. Note, 169 * setting SC_SCR_REDRAW in the current window causes *all* windows to 170 * be repainted. 171 * SC_SCR_CENTER 172 * If the current line isn't already on the screen, center it. 173 * SC_SCR_TOP 174 * If the current line isn't already on the screen, put it at the to@. 175 */ 176 #define SC_SCR_EX 0x00000004 /* Screen is in ex mode. */ 177 #define SC_SCR_VI 0x00000008 /* Screen is in vi mode. */ 178 #define SC_SCR_EXWROTE 0x00000010 /* Ex overwrite: see comment above. */ 179 #define SC_SCR_REFORMAT 0x00000020 /* Reformat (refresh). */ 180 #define SC_SCR_REDRAW 0x00000040 /* Refresh. */ 181 182 #define SC_SCR_CENTER 0x00000080 /* Center the line if not visible. */ 183 #define SC_SCR_TOP 0x00000100 /* Top the line if not visible. */ 184 185 /* Screen/file changes. */ 186 #define SC_EXIT 0x00000200 /* Exiting (not forced). */ 187 #define SC_EXIT_FORCE 0x00000400 /* Exiting (forced). */ 188 #define SC_FSWITCH 0x00000800 /* Switch underlying files. */ 189 #define SC_SSWITCH 0x00001000 /* Switch screens. */ 190 191 #define SC_ARGNOFREE 0x00002000 /* Argument list wasn't allocated. */ 192 #define SC_ARGRECOVER 0x00004000 /* Argument list is recovery files. */ 193 #define SC_AT_SET 0x00008000 /* Last at buffer set. */ 194 #define SC_COMEDIT 0x00010000 /* Colon command-line edit window. */ 195 #define SC_EX_GLOBAL 0x00020000 /* Ex: executing a global command. */ 196 #define SC_EX_SILENT 0x00040000 /* Ex: batch script. */ 197 #define SC_EX_WAIT_NO 0x00080000 /* Ex: don't wait for the user. */ 198 #define SC_EX_WAIT_YES 0x00100000 /* Ex: do wait for the user. */ 199 #define SC_READONLY 0x00200000 /* Persistent readonly state. */ 200 #define SC_RE_SEARCH 0x00400000 /* Search RE has been compiled. */ 201 #define SC_RE_SUBST 0x00800000 /* Substitute RE has been compiled. */ 202 #define SC_SCRIPT 0x01000000 /* Shell script window. */ 203 #define SC_STATUS 0x02000000 /* Welcome message. */ 204 #define SC_STATUS_CNT 0x04000000 /* Welcome message plus file count. */ 205 #define SC_TINPUT 0x08000000 /* Doing text input. */ 206 #define SC_TINPUT_INFO 0x10000000 /* Doing text input on info line. */ 207 #define SC_CONV_ERROR 0x20000000 /* Met with a conversion error. */ 208 u_int32_t flags; 209 }; 210