Annotation of src/usr.bin/mg/def.h, Revision 1.2
1.1 deraadt 1: /*
2: * This file is the general header file for all parts
3: * of the MicroEMACS display editor. It contains all of the
4: * general definitions and macros. It also contains some
5: * conditional compilation flags. All of the per-system and
6: * per-terminal definitions are in special header files.
7: * The most common reason to edit this file would be to zap
8: * the definition of CVMVAS or BACKUP.
9: */
10: #include "sysdef.h" /* Order is critical. */
11: #include "ttydef.h"
12: #include "chrdef.h"
13:
14: /*
15: * If your system and/or compiler does not support the "void" type
16: * then define NO_VOID_TYPE in sysdef.h. In the absence of some
17: * other definition for VOID, the default in that case will be to
18: * turn it into an int, which works with most compilers that don't
19: * support void. In the absence of any definition of VOID or
20: * NO_VOID_TYPE, the default is to assume void is supported, which
21: * should be the case for most modern C compilers.
22: */
23:
24: #ifdef NO_VOID_TYPE
25: # undef VOID
26: # define VOID int /* Default for no void is int */
27: #else
28: #ifndef VOID
29: # define VOID void /* Just use normal void */
30: #endif /* VOID */
31: #endif /* NO_VOID_TYPE */
32:
33: #ifdef NO_MACRO
34: #ifndef NO_STARTUP
35: #define NO_STARTUP /* NO_MACRO implies NO_STARTUP */
36: #endif
37: #endif
38:
39: typedef int (*PF)(); /* generaly useful type */
40:
41: /*
42: * Table sizes, etc.
43: */
44: #define NFILEN 80 /* Length, file name. */
45: #define NBUFN 24 /* Length, buffer name. */
46: #define NLINE 256 /* Length, line. */
47: #define PBMODES 4 /* modes per buffer */
48: #define NKBDM 256 /* Length, keyboard macro. */
49: #define NPAT 80 /* Length, pattern. */
50: #define HUGE 1000 /* A rather large number. */
51: #define NSRCH 128 /* Undoable search commands. */
52: #define NXNAME 64 /* Length, extended command. */
53: #define NKNAME 20 /* Length, key names */
54: /*
55: * Universal.
56: */
57: #define FALSE 0 /* False, no, bad, etc. */
58: #define TRUE 1 /* True, yes, good, etc. */
59: #define ABORT 2 /* Death, ^G, abort, etc. */
60:
61: #define KPROMPT 2 /* keyboard prompt */
62:
63: /*
64: * These flag bits keep track of
65: * some aspects of the last command. The CFCPCN
66: * flag controls goal column setting. The CFKILL
67: * flag controls the clearing versus appending
68: * of data in the kill buffer.
69: */
70: #define CFCPCN 0x0001 /* Last command was C-P, C-N */
71: #define CFKILL 0x0002 /* Last command was a kill */
72: #define CFINS 0x0004 /* Last command was self-insert */
73:
74: /*
75: * File I/O.
76: */
77: #define FIOSUC 0 /* Success. */
78: #define FIOFNF 1 /* File not found. */
79: #define FIOEOF 2 /* End of file. */
80: #define FIOERR 3 /* Error. */
81: #define FIOLONG 4 /* long line partially read */
82:
83: /*
84: * Directory I/O.
85: */
86: #define DIOSUC 0 /* Success. */
87: #define DIOEOF 1 /* End of file. */
88: #define DIOERR 2 /* Error. */
89:
90: /*
91: * Display colors.
92: */
93: #define CNONE 0 /* Unknown color. */
94: #define CTEXT 1 /* Text color. */
95: #define CMODE 2 /* Mode line color. */
96:
97: /* Flags for keyboard involked functions */
98:
99: #define FFUNIV 1 /* universal argument */
100: #define FFNEGARG 2 /* negitive only argument */
101: #define FFOTHARG 4 /* other argument */
102: #define FFARG 7 /* any argument */
103: #define FFRAND 8 /* Called by other function */
104:
105: /*
106: * Flags for "eread".
107: */
108: #define EFFUNC 0x0001 /* Autocomplete functions. */
109: #define EFBUF 0x0002 /* Autocomplete buffers. */
110: #define EFFILE 0x0004 /* " files (maybe someday) */
111: #define EFAUTO 0x0007 /* Some autocompleteion on */
112: #define EFNEW 0x0008 /* New prompt. */
113: #define EFCR 0x0010 /* Echo CR at end; last read. */
114:
115: /*
116: * Flags for "ldelete"/"kinsert"
117: */
118:
119: #define KNONE 0
120: #define KFORW 1
121: #define KBACK 2
122:
123: /*
124: * All text is kept in circularly linked
125: * lists of "LINE" structures. These begin at the
126: * header line (which is the blank line beyond the
127: * end of the buffer). This line is pointed to by
128: * the "BUFFER". Each line contains a the number of
129: * bytes in the line (the "used" size), the size
130: * of the text array, and the text. The end of line
131: * is not stored as a byte; it's implied. Future
132: * additions will include update hints, and a
133: * list of marks into the line.
134: */
135: typedef struct LINE {
136: struct LINE *l_fp; /* Link to the next line */
137: struct LINE *l_bp; /* Link to the previous line */
138: int l_size; /* Allocated size */
139: int l_used; /* Used size */
140: #ifndef ZEROARRAY
141: char l_text[1]; /* A bunch of characters. */
142: #else
143: char l_text[]; /* A bunch of characters. */
144: #endif
145: } LINE;
146:
147: /*
148: * The rationale behind these macros is that you
149: * could (with some editing, like changing the type of a line
150: * link from a "LINE *" to a "REFLINE", and fixing the commands
151: * like file reading that break the rules) change the actual
152: * storage representation of lines to use something fancy on
153: * machines with small address spaces.
154: */
155: #define lforw(lp) ((lp)->l_fp)
156: #define lback(lp) ((lp)->l_bp)
157: #define lgetc(lp, n) (CHARMASK((lp)->l_text[(n)]))
158: #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
159: #define llength(lp) ((lp)->l_used)
160: #define ltext(lp) ((lp)->l_text)
161:
162: /*
163: * All repeated structures are kept as linked lists of structures.
164: * All of these start with a LIST structure (except lines, which
165: * have their own abstraction). This will allow for
166: * later conversion to generic list manipulation routines should
167: * I decide to do that. it does mean that there are four extra
168: * bytes per window. I feel that this is an acceptable price,
169: * considering that there are usually only one or two windows.
170: */
171: typedef struct LIST {
172: union {
173: struct WINDOW *l_wp;
174: struct BUFFER *x_bp; /* l_bp is used by LINE */
175: struct LIST *l_nxt;
176: } l_p;
177: char *l_name;
178: } LIST;
179: /*
180: * Usual hack - to keep from uglifying the code with lotsa
181: * references through the union, we #define something for it.
182: */
183: #define l_next l_p.l_nxt
184:
185: /*
186: * There is a window structure allocated for
187: * every active display window. The windows are kept in a
188: * big list, in top to bottom screen order, with the listhead at
189: * "wheadp". Each window contains its own values of dot and mark.
190: * The flag field contains some bits that are set by commands
191: * to guide redisplay; although this is a bit of a compromise in
192: * terms of decoupling, the full blown redisplay is just too
193: * expensive to run for every input character.
194: */
195: typedef struct WINDOW {
196: LIST w_list; /* List header */
197: struct BUFFER *w_bufp; /* Buffer displayed in window */
198: struct LINE *w_linep; /* Top line in the window */
199: struct LINE *w_dotp; /* Line containing "." */
200: struct LINE *w_markp; /* Line containing "mark" */
201: int w_doto; /* Byte offset for "." */
202: int w_marko; /* Byte offset for "mark" */
203: char w_toprow; /* Origin 0 top row of window */
204: char w_ntrows; /* # of rows of text in window */
205: char w_force; /* If NZ, forcing row. */
206: char w_flag; /* Flags. */
207: } WINDOW;
208: #define w_wndp w_list.l_p.l_wp
209: #define w_name w_list.l_name
210:
211: /*
212: * Window flags are set by command processors to
213: * tell the display system what has happened to the buffer
214: * mapped by the window. Setting "WFHARD" is always a safe thing
215: * to do, but it may do more work than is necessary. Always try
216: * to set the simplest action that achieves the required update.
217: * Because commands set bits in the "w_flag", update will see
218: * all change flags, and do the most general one.
219: */
220: #define WFFORCE 0x01 /* Force reframe. */
221: #define WFMOVE 0x02 /* Movement from line to line. */
222: #define WFEDIT 0x04 /* Editing within a line. */
223: #define WFHARD 0x08 /* Better to a full display. */
224: #define WFMODE 0x10 /* Update mode line. */
225:
226: /*
227: * Text is kept in buffers. A buffer header, described
228: * below, exists for every buffer in the system. The buffers are
229: * kept in a big list, so that commands that search for a buffer by
230: * name can find the buffer header. There is a safe store for the
231: * dot and mark in the header, but this is only valid if the buffer
232: * is not being displayed (that is, if "b_nwnd" is 0). The text for
233: * the buffer is kept in a circularly linked list of lines, with
234: * a pointer to the header line in "b_linep".
235: */
236: typedef struct BUFFER {
237: LIST b_list; /* buffer list pointer */
238: struct BUFFER *b_altb; /* Link to alternate buffer */
239: struct LINE *b_dotp; /* Link to "." LINE structure */
240: struct LINE *b_markp; /* ditto for mark */
241: struct LINE *b_linep; /* Link to the header LINE */
242: struct MAPS_S *b_modes[PBMODES]; /* buffer modes */
243: int b_doto; /* Offset of "." in above LINE */
244: int b_marko; /* ditto for the "mark" */
245: short b_nmodes; /* number of non-fundamental modes */
246: char b_nwnd; /* Count of windows on buffer */
247: char b_flag; /* Flags */
248: char b_fname[NFILEN]; /* File name */
249: struct fileinfo b_fi; /* File attributes */
250: } BUFFER;
251: #define b_bufp b_list.l_p.x_bp
252: #define b_bname b_list.l_name
253:
254: #define BFCHG 0x01 /* Changed. */
255: #define BFBAK 0x02 /* Need to make a backup. */
256: #ifdef NOTAB
257: #define BFNOTAB 0x04 /* no tab mode */
258: #endif
259: #define BFOVERWRITE 0x08 /* overwrite mode */
260:
261: /*
262: * This structure holds the starting position
263: * (as a line/offset pair) and the number of characters in a
264: * region of a buffer. This makes passing the specification
265: * of a region around a little bit easier.
266: */
267: typedef struct {
268: struct LINE *r_linep; /* Origin LINE address. */
269: int r_offset; /* Origin LINE offset. */
270: RSIZE r_size; /* Length in characters. */
271: } REGION;
272:
273: /*
274: * Externals.
275: */
276: extern int thisflag;
277: extern int lastflag;
278: extern int curgoal;
279: extern int epresf;
280: extern int sgarbf;
281: extern int mode;
282: extern WINDOW *curwp;
283: extern BUFFER *curbp;
284: extern WINDOW *wheadp;
285: extern BUFFER *bheadp;
286: extern char pat[];
287: extern BUFFER *bfind();
288: extern WINDOW *popbuf();
289: extern WINDOW *wpopup();
290: extern LINE *lalloc();
291: extern LINE *lallocx();
292: extern VOID ewprintf();
293: extern int nrow;
294: extern int ncol;
295: extern int ttrow;
296: extern int ttcol;
297: extern int tceeol;
298: extern int tcinsl;
299: extern int tcdell;
300: extern char cinfo[];
301: extern char *keystrings[];
302: extern VOID update();
303: extern char *keyname();
304: extern char *adjustname();
305: extern VOID kdelete();
306: extern VOID lchange();