995
|
1 /*
|
|
2 * This file is the general header file for all parts of the MicroEMACS
|
|
3 * display editor. It contains definitions used by everyone, and it contains
|
|
4 * the stuff you have to edit to create a version of the editor for a specific
|
|
5 * operating system and terminal.
|
|
6 */
|
|
7
|
|
8 /* #define AMIGA 1 /* AmigaDOS, Lattice */
|
|
9 /* #define ST520 0 /* ST520, TOS */
|
|
10 /* #define MWC86 0
|
|
11 /* #define V7 0 /* V7 UN*X or Coherent */
|
|
12 /* #define VMS 0 /* VAX/VMS */
|
|
13 /* #define CPM 0 /* CP/M-86 */
|
1869
|
14 /* #define OS9 1 /* os9/6809 level 1 (coco) */
|
995
|
15 /* #define OSK 1 /* os9/68000 predefined */
|
|
16 /* #define MSDOS 0 /* MS-DOS predefined */
|
|
17
|
|
18 /* #define ANSI 1 /* ANSI terminal (Vt100) */
|
|
19 /* #define VT52 1 /* VT52 terminal (Zenith). */
|
|
20 /* #define VT100 0 /* Handle VT100 style keypad. */
|
|
21 /* #define LK201 0 /* Handle LK201 style keypad. */
|
|
22 /* #define RAINBOW 0 /* Use Rainbow fast video. */
|
|
23 /* #define TERMCAP 0 /* Use TERMCAP */
|
|
24
|
|
25 #define CVMVAS 1 /* C-V, M-V arg. in screens. */
|
|
26
|
|
27 #define NFILEN 80 /* # of bytes, file name */
|
|
28 #define NBUFN 16 /* # of bytes, buffer name */
|
|
29 #define NLINE 256 /* # of bytes, line */
|
|
30 #define NKBDM 256 /* # of strokes, keyboard macro */
|
|
31 #define NPAT 80 /* # of bytes, pattern */
|
|
32 #define HUGE 1000 /* Huge number */
|
|
33
|
|
34 #define AGRAVE 0x60 /* M- prefix, Grave (LK201) */
|
|
35 #define METACH 0x1B /* M- prefix, Control-[, ESC */
|
|
36 #define CTMECH 0x1C /* C-M- prefix, Control-\ */
|
|
37 #define EXITCH 0x1D /* Exit level, Control-] */
|
|
38 #define CTRLCH 0x1E /* C- prefix, Control-^ */
|
|
39 #define HELPCH 0x1F /* Help key, Control-_ */
|
|
40
|
|
41 #define CTRL 0x0100 /* Control flag, or'ed in */
|
|
42 #define META 0x0200 /* Meta flag, or'ed in */
|
|
43 #define CTLX 0x0400 /* ^X flag, or'ed in */
|
|
44
|
|
45 #define FALSE 0 /* False, no, bad, etc. */
|
|
46 #define TRUE 1 /* True, yes, good, etc. */
|
|
47 #define ABORT 2 /* Death, ^G, abort, etc. */
|
|
48
|
|
49 #define FIOSUC 0 /* File I/O, success. */
|
|
50 #define FIOFNF 1 /* File I/O, file not found. */
|
|
51 #define FIOEOF 2 /* File I/O, end of file. */
|
|
52 #define FIOERR 3 /* File I/O, error. */
|
|
53
|
|
54 #define CFCPCN 0x0001 /* Last command was C-P, C-N */
|
|
55 #define CFKILL 0x0002 /* Last command was a kill */
|
|
56
|
|
57 /*
|
|
58 * There is a window structure allocated for every active display window. The
|
|
59 * windows are kept in a big list, in top to bottom screen order, with the
|
|
60 * listhead at "wheadp". Each window contains its own values of dot and mark.
|
|
61 * The flag field contains some bits that are set by commands to guide
|
|
62 * redisplay; although this is a bit of a compromise in terms of decoupling,
|
|
63 * the full blown redisplay is just too expensive to run for every input
|
|
64 * character.
|
|
65 */
|
|
66 typedef struct WINDOW {
|
|
67 struct WINDOW *w_wndp; /* Next window */
|
|
68 struct BUFFER *w_bufp; /* Buffer displayed in window */
|
|
69 struct LINE *w_linep; /* Top line in the window */
|
|
70 struct LINE *w_dotp; /* Line containing "." */
|
|
71 short w_doto; /* Byte offset for "." */
|
|
72 struct LINE *w_markp; /* Line containing "mark" */
|
|
73 short w_marko; /* Byte offset for "mark" */
|
|
74 char w_toprow; /* Origin 0 top row of window */
|
|
75 char w_ntrows; /* # of rows of text in window */
|
|
76 char w_force; /* If NZ, forcing row. */
|
|
77 char w_flag; /* Flags. */
|
|
78 } WINDOW;
|
|
79
|
|
80 #define WFFORCE 0x01 /* Window needs forced reframe */
|
|
81 #define WFMOVE 0x02 /* Movement from line to line */
|
|
82 #define WFEDIT 0x04 /* Editing within a line */
|
|
83 #define WFHARD 0x08 /* Better to a full display */
|
|
84 #define WFMODE 0x10 /* Update mode line. */
|
|
85
|
|
86 /*
|
|
87 * Text is kept in buffers. A buffer header, described below, exists for every
|
|
88 * buffer in the system. The buffers are kept in a big list, so that commands
|
|
89 * that search for a buffer by name can find the buffer header. There is a
|
|
90 * safe store for the dot and mark in the header, but this is only valid if
|
|
91 * the buffer is not being displayed (that is, if "b_nwnd" is 0). The text for
|
|
92 * the buffer is kept in a circularly linked list of lines, with a pointer to
|
|
93 * the header line in "b_linep".
|
|
94 */
|
|
95 typedef struct BUFFER {
|
|
96 struct BUFFER *b_bufp; /* Link to next BUFFER */
|
|
97 struct LINE *b_dotp; /* Link to "." LINE structure */
|
|
98 short b_doto; /* Offset of "." in above LINE */
|
|
99 struct LINE *b_markp; /* The same as the above two, */
|
|
100 short b_marko; /* but for the "mark" */
|
|
101 struct LINE *b_linep; /* Link to the header LINE */
|
|
102 char b_nwnd; /* Count of windows on buffer */
|
|
103 char b_flag; /* Flags */
|
|
104 char b_fname[NFILEN]; /* File name */
|
|
105 char b_bname[NBUFN]; /* Buffer name */
|
|
106 } BUFFER;
|
|
107
|
|
108 #define BFTEMP 0x01 /* Internal temporary buffer */
|
|
109 #define BFCHG 0x02 /* Changed since last write */
|
|
110
|
|
111 /*
|
|
112 * The starting position of a region, and the size of the region in
|
|
113 * characters, is kept in a region structure. Used by the region commands.
|
|
114 */
|
|
115 typedef struct {
|
|
116 struct LINE *r_linep; /* Origin LINE address. */
|
|
117 short r_offset; /* Origin LINE offset. */
|
|
118 short r_size; /* Length in characters. */
|
|
119 } REGION;
|
|
120
|
|
121 /*
|
|
122 * All text is kept in circularly linked lists of "LINE" structures. These
|
|
123 * begin at the header line (which is the blank line beyond the end of the
|
|
124 * buffer). This line is pointed to by the "BUFFER". Each line contains a the
|
|
125 * number of bytes in the line (the "used" size), the size of the text array,
|
|
126 * and the text. The end of line is not stored as a byte; it's implied. Future
|
|
127 * additions will include update hints, and a list of marks into the line.
|
|
128 */
|
|
129 typedef struct LINE {
|
|
130 struct LINE *l_fp; /* Link to the next line */
|
|
131 struct LINE *l_bp; /* Link to the previous line */
|
|
132 short l_size; /* Allocated size */
|
|
133 short l_used; /* Used size */
|
|
134 char l_text[1]; /* A bunch of characters. */
|
|
135 } LINE;
|
|
136
|
|
137 #define lforw(lp) ((lp)->l_fp)
|
|
138 #define lback(lp) ((lp)->l_bp)
|
|
139 #define lgetc(lp, n) ((lp)->l_text[(n)]&0xFF)
|
|
140 #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
|
|
141 #define llength(lp) ((lp)->l_used)
|
|
142
|
|
143 /*
|
|
144 * The editor communicates with the display using a high level interface. A
|
|
145 * "TERM" structure holds useful variables, and indirect pointers to routines
|
|
146 * that do useful operations. The low level get and put routines are here too.
|
|
147 * This lets a terminal, in addition to having non standard commands, have
|
|
148 * funny get and put character code too. The calls might get changed to
|
|
149 * "termp->t_field" style in the future, to make it possible to run more than
|
|
150 * one terminal type.
|
|
151 */
|
|
152 typedef struct {
|
|
153 short t_nrow; /* Number of rows. */
|
|
154 short t_ncol; /* Number of columns. */
|
|
155 int (*t_open)(); /* Open terminal at the start. */
|
|
156 int (*t_close)(); /* Close terminal at end. */
|
|
157 int (*t_getchar)(); /* Get character from keyboard. */
|
|
158 int (*t_putchar)(); /* Put character to display. */
|
|
159 int (*t_flush)(); /* Flush output buffers. */
|
|
160 int (*t_move)(); /* Move the cursor, origin 0. */
|
|
161 int (*t_eeol)(); /* Erase to end of line. */
|
|
162 int (*t_eeop)(); /* Erase to end of page. */
|
|
163 int (*t_beep)(); /* Beep. */
|
|
164 } TERM;
|
|
165
|
|
166 extern int fillcol; /* Fill column */
|
|
167 extern int currow; /* Cursor row */
|
|
168 extern int curcol; /* Cursor column */
|
|
169 extern int thisflag; /* Flags, this command */
|
|
170 extern int lastflag; /* Flags, last command */
|
|
171 extern int curgoal; /* Goal for C-P, C-N */
|
|
172 extern int mpresf; /* Stuff in message line */
|
|
173 extern int sgarbf; /* State of screen unknown */
|
|
174 extern WINDOW *curwp; /* Current window */
|
|
175 extern BUFFER *curbp; /* Current buffer */
|
|
176 extern WINDOW *wheadp; /* Head of list of windows */
|
|
177 extern BUFFER *bheadp; /* Head of list of buffers */
|
|
178 extern BUFFER *blistp; /* Buffer for C-X C-B */
|
|
179 extern short kbdm[]; /* Holds kayboard macro data */
|
|
180 extern short *kbdmip; /* Input pointer for above */
|
|
181 extern short *kbdmop; /* Output pointer for above */
|
|
182 extern char pat[]; /* Search pattern */
|
|
183 extern TERM term; /*(Terminal information. */
|
|
184
|
|
185 extern BUFFER *bfind(); /* Lookup a buffer by name */
|
|
186 extern WINDOW *wpopup(); /* Pop up window creation */
|
|
187 extern LINE *lalloc(); /* Allocate a line */
|
|
188
|
|
189
|