Annotation of src/usr.bin/mg/def.h, Revision 1.40
1.40 ! vincent 1: /* $OpenBSD: def.h,v 1.39 2002/03/18 01:45:54 vincent Exp $ */
1.30 vincent 2:
3: #include <sys/queue.h>
1.6 niklas 4:
1.1 deraadt 5: /*
6: * This file is the general header file for all parts
1.4 millert 7: * of the Mg display editor. It contains all of the
1.1 deraadt 8: * general definitions and macros. It also contains some
9: * conditional compilation flags. All of the per-system and
10: * per-terminal definitions are in special header files.
11: * The most common reason to edit this file would be to zap
12: * the definition of CVMVAS or BACKUP.
13: */
1.4 millert 14: #include "sysdef.h" /* Order is critical. */
1.1 deraadt 15: #include "ttydef.h"
16: #include "chrdef.h"
17:
18: #ifdef NO_MACRO
19: #ifndef NO_STARTUP
1.4 millert 20: #define NO_STARTUP /* NO_MACRO implies NO_STARTUP */
1.1 deraadt 21: #endif
22: #endif
23:
1.18 mickey 24: typedef int (*PF)(); /* generally useful type */
1.1 deraadt 25:
26: /*
27: * Table sizes, etc.
28: */
1.7 art 29: #define NFILEN 1024 /* Length, file name. */
30: #define NBUFN NFILEN /* Length, buffer name. */
1.4 millert 31: #define NLINE 256 /* Length, line. */
32: #define PBMODES 4 /* modes per buffer */
33: #define NKBDM 256 /* Length, keyboard macro. */
34: #define NPAT 80 /* Length, pattern. */
35: #define HUGE 1000 /* A rather large number. */
36: #define NSRCH 128 /* Undoable search commands. */
37: #define NXNAME 64 /* Length, extended command. */
38: #define NKNAME 20 /* Length, key names */
1.1 deraadt 39: /*
40: * Universal.
41: */
1.4 millert 42: #define FALSE 0 /* False, no, bad, etc. */
43: #define TRUE 1 /* True, yes, good, etc. */
44: #define ABORT 2 /* Death, ^G, abort, etc. */
1.1 deraadt 45:
1.4 millert 46: #define KPROMPT 2 /* keyboard prompt */
1.1 deraadt 47:
48: /*
49: * These flag bits keep track of
50: * some aspects of the last command. The CFCPCN
51: * flag controls goal column setting. The CFKILL
52: * flag controls the clearing versus appending
53: * of data in the kill buffer.
54: */
1.4 millert 55: #define CFCPCN 0x0001 /* Last command was C-P, C-N */
56: #define CFKILL 0x0002 /* Last command was a kill */
57: #define CFINS 0x0004 /* Last command was self-insert */
1.1 deraadt 58:
59: /*
60: * File I/O.
61: */
1.4 millert 62: #define FIOSUC 0 /* Success. */
63: #define FIOFNF 1 /* File not found. */
64: #define FIOEOF 2 /* End of file. */
65: #define FIOERR 3 /* Error. */
66: #define FIOLONG 4 /* long line partially read */
1.1 deraadt 67:
68: /*
69: * Directory I/O.
70: */
1.4 millert 71: #define DIOSUC 0 /* Success. */
72: #define DIOEOF 1 /* End of file. */
73: #define DIOERR 2 /* Error. */
1.1 deraadt 74:
75: /*
76: * Display colors.
77: */
1.4 millert 78: #define CNONE 0 /* Unknown color. */
79: #define CTEXT 1 /* Text color. */
80: #define CMODE 2 /* Mode line color. */
81:
82: /*
1.22 millert 83: * Flags for keyboard invoked functions.
1.4 millert 84: */
85: #define FFUNIV 1 /* universal argument */
1.27 deraadt 86: #define FFNEGARG 2 /* negative only argument */
1.4 millert 87: #define FFOTHARG 4 /* other argument */
88: #define FFARG 7 /* any argument */
89: #define FFRAND 8 /* Called by other function */
1.1 deraadt 90:
91: /*
92: * Flags for "eread".
93: */
1.4 millert 94: #define EFFUNC 0x0001 /* Autocomplete functions. */
95: #define EFBUF 0x0002 /* Autocomplete buffers. */
96: #define EFFILE 0x0004 /* " files (maybe someday) */
97: #define EFAUTO 0x0007 /* Some autocompleteion on */
98: #define EFNEW 0x0008 /* New prompt. */
99: #define EFCR 0x0010 /* Echo CR at end; last read. */
1.20 art 100: #define EFDEF 0x0020 /* buffer contains default args */
1.1 deraadt 101:
102: /*
103: * Flags for "ldelete"/"kinsert"
104: */
105: #define KNONE 0
106: #define KFORW 1
107: #define KBACK 2
108:
109: /*
110: * All text is kept in circularly linked
111: * lists of "LINE" structures. These begin at the
112: * header line (which is the blank line beyond the
113: * end of the buffer). This line is pointed to by
114: * the "BUFFER". Each line contains a the number of
115: * bytes in the line (the "used" size), the size
116: * of the text array, and the text. The end of line
117: * is not stored as a byte; it's implied. Future
118: * additions will include update hints, and a
119: * list of marks into the line.
120: */
1.4 millert 121: typedef struct LINE {
1.18 mickey 122: struct LINE *l_fp; /* Link to the next line */
123: struct LINE *l_bp; /* Link to the previous line */
124: int l_size; /* Allocated size */
125: int l_used; /* Used size */
1.26 vincent 126: char *l_text; /* Content of the line */
1.4 millert 127: } LINE;
1.1 deraadt 128:
129: /*
130: * The rationale behind these macros is that you
131: * could (with some editing, like changing the type of a line
132: * link from a "LINE *" to a "REFLINE", and fixing the commands
133: * like file reading that break the rules) change the actual
134: * storage representation of lines to use something fancy on
135: * machines with small address spaces.
136: */
137: #define lforw(lp) ((lp)->l_fp)
138: #define lback(lp) ((lp)->l_bp)
139: #define lgetc(lp, n) (CHARMASK((lp)->l_text[(n)]))
140: #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
141: #define llength(lp) ((lp)->l_used)
142: #define ltext(lp) ((lp)->l_text)
143:
144: /*
145: * All repeated structures are kept as linked lists of structures.
146: * All of these start with a LIST structure (except lines, which
147: * have their own abstraction). This will allow for
148: * later conversion to generic list manipulation routines should
149: * I decide to do that. it does mean that there are four extra
150: * bytes per window. I feel that this is an acceptable price,
151: * considering that there are usually only one or two windows.
152: */
153: typedef struct LIST {
154: union {
1.18 mickey 155: struct MGWIN *l_wp;
156: struct BUFFER *x_bp; /* l_bp is used by LINE */
157: struct LIST *l_nxt;
1.1 deraadt 158: } l_p;
1.36 vincent 159: const char *l_name;
1.1 deraadt 160: } LIST;
1.4 millert 161:
1.1 deraadt 162: /*
163: * Usual hack - to keep from uglifying the code with lotsa
164: * references through the union, we #define something for it.
165: */
166: #define l_next l_p.l_nxt
167:
168: /*
169: * There is a window structure allocated for
170: * every active display window. The windows are kept in a
171: * big list, in top to bottom screen order, with the listhead at
172: * "wheadp". Each window contains its own values of dot and mark.
173: * The flag field contains some bits that are set by commands
174: * to guide redisplay; although this is a bit of a compromise in
175: * terms of decoupling, the full blown redisplay is just too
176: * expensive to run for every input character.
177: */
1.4 millert 178: typedef struct MGWIN {
1.18 mickey 179: LIST w_list; /* List header */
180: struct BUFFER *w_bufp; /* Buffer displayed in window */
181: struct LINE *w_linep; /* Top line in the window */
182: struct LINE *w_dotp; /* Line containing "." */
183: struct LINE *w_markp; /* Line containing "mark" */
184: int w_doto; /* Byte offset for "." */
185: int w_marko; /* Byte offset for "mark" */
186: char w_toprow; /* Origin 0 top row of window */
187: char w_ntrows; /* # of rows of text in window */
188: char w_force; /* If NZ, forcing row. */
189: char w_flag; /* Flags. */
1.4 millert 190: } MGWIN;
1.1 deraadt 191: #define w_wndp w_list.l_p.l_wp
192: #define w_name w_list.l_name
193:
194: /*
195: * Window flags are set by command processors to
196: * tell the display system what has happened to the buffer
197: * mapped by the window. Setting "WFHARD" is always a safe thing
198: * to do, but it may do more work than is necessary. Always try
199: * to set the simplest action that achieves the required update.
200: * Because commands set bits in the "w_flag", update will see
201: * all change flags, and do the most general one.
202: */
1.4 millert 203: #define WFFORCE 0x01 /* Force reframe. */
204: #define WFMOVE 0x02 /* Movement from line to line. */
205: #define WFEDIT 0x04 /* Editing within a line. */
206: #define WFHARD 0x08 /* Better to a full display. */
207: #define WFMODE 0x10 /* Update mode line. */
1.1 deraadt 208:
1.35 vincent 209: struct undo_rec;
210:
1.1 deraadt 211: /*
1.39 vincent 212: * This structure holds the starting position
213: * (as a line/offset pair) and the number of characters in a
214: * region of a buffer. This makes passing the specification
215: * of a region around a little bit easier.
216: */
217: typedef struct {
218: struct LINE *r_linep; /* Origin LINE address. */
219: int r_offset; /* Origin LINE offset. */
220: RSIZE r_size; /* Length in characters. */
221: } REGION;
222: /*
1.1 deraadt 223: * Text is kept in buffers. A buffer header, described
224: * below, exists for every buffer in the system. The buffers are
225: * kept in a big list, so that commands that search for a buffer by
226: * name can find the buffer header. There is a safe store for the
227: * dot and mark in the header, but this is only valid if the buffer
228: * is not being displayed (that is, if "b_nwnd" is 0). The text for
229: * the buffer is kept in a circularly linked list of lines, with
230: * a pointer to the header line in "b_linep".
231: */
1.4 millert 232: typedef struct BUFFER {
1.18 mickey 233: LIST b_list; /* buffer list pointer */
234: struct BUFFER *b_altb; /* Link to alternate buffer */
235: struct LINE *b_dotp; /* Link to "." LINE structure */
236: struct LINE *b_markp; /* ditto for mark */
237: struct LINE *b_linep; /* Link to the header LINE */
238: struct MAPS_S *b_modes[PBMODES]; /* buffer modes */
239: int b_doto; /* Offset of "." in above LINE */
240: int b_marko; /* ditto for the "mark" */
241: short b_nmodes; /* number of non-fundamental modes */
242: char b_nwnd; /* Count of windows on buffer */
243: char b_flag; /* Flags */
244: char b_fname[NFILEN];/* File name */
245: struct fileinfo b_fi; /* File attributes */
1.35 vincent 246: LIST_HEAD(, undo_rec) b_undo; /* Undo actions list */
1.39 vincent 247: REGION b_undopos; /* Where we were during the last
248: undo action */
249: struct undo_rec *b_undoptr;
1.4 millert 250: } BUFFER;
1.37 vincent 251:
1.1 deraadt 252: #define b_bufp b_list.l_p.x_bp
253: #define b_bname b_list.l_name
254:
1.4 millert 255: #define BFCHG 0x01 /* Changed. */
256: #define BFBAK 0x02 /* Need to make a backup. */
1.1 deraadt 257: #ifdef NOTAB
1.4 millert 258: #define BFNOTAB 0x04 /* no tab mode */
1.1 deraadt 259: #endif
1.4 millert 260: #define BFOVERWRITE 0x08 /* overwrite mode */
1.37 vincent 261: #define BFREADONLY 0x10 /* read only mode */
262:
1.1 deraadt 263:
264: /*
1.30 vincent 265: * This structure holds information about recent actions for the Undo command.
266: */
267: struct undo_rec {
1.34 deraadt 268: LIST_ENTRY(undo_rec) next;
1.30 vincent 269: enum {
270: INSERT = 1,
271: DELETE,
272: CHANGE,
273: BOUNDARY
274: } type;
275: REGION region;
276: int pos;
277: int size;
1.34 deraadt 278: char *content;
1.30 vincent 279: };
280:
281: /*
1.4 millert 282: * Prototypes.
283: */
284:
1.5 millert 285: /* tty.c X */
1.29 millert 286: void ttinit(void);
287: void ttreinit(void);
288: void tttidy(void);
289: void ttmove(int, int);
290: void tteeol(void);
291: void tteeop(void);
292: void ttbeep(void);
293: void ttinsl(int, int, int);
294: void ttdell(int, int, int);
295: void ttwindow(int, int);
296: void ttnowindow(void);
297: void ttcolor(int);
298: void ttresize(void);
1.31 deraadt 299:
300: volatile sig_atomic_t winch_flag;
1.4 millert 301:
302: /* ttyio.c */
1.29 millert 303: void ttopen(void);
304: int ttraw(void);
305: void ttclose(void);
306: int ttcooked(void);
307: int ttputc(int);
308: void ttflush(void);
309: int ttgetc(void);
310: int ttwait(int);
311: int typeahead(void);
1.4 millert 312:
313: /* dir.c */
1.29 millert 314: void dirinit(void);
315: int changedir(int, int);
316: int showcwdir(int, int);
1.4 millert 317:
318: /* dired.c */
1.29 millert 319: int dired(int, int);
320: int d_otherwindow(int, int);
321: int d_undel(int, int);
322: int d_undelbak(int, int);
323: int d_findfile(int, int);
324: int d_ffotherwindow(int, int);
325: int d_expunge(int, int);
326: int d_copy(int, int);
327: int d_del(int, int);
328: int d_rename(int, int);
1.5 millert 329:
330: /* file.c X */
1.29 millert 331: int fileinsert(int, int);
332: int filevisit(int, int);
1.40 ! vincent 333: int filevisitro(int, int);
1.29 millert 334: int poptofile(int, int);
335: BUFFER *findbuffer(char *);
336: int readin(char *);
337: int insertfile(char *, char *, int);
338: int filewrite(int, int);
339: int filesave(int, int);
340: int buffsave(BUFFER *);
341: int makebkfile(int, int);
342: int writeout(BUFFER *, char *);
343: void upmodes(BUFFER *);
1.5 millert 344:
345: /* line.c X */
1.29 millert 346: LINE *lalloc(int);
347: int lrealloc(LINE *, int);
348: void lfree(LINE *);
349: void lchange(int);
350: int linsert(int, int);
351: int lnewline(void);
352: int ldelete(RSIZE, int);
353: int ldelnewline(void);
354: int lreplace(RSIZE, char *, int);
355: void kdelete(void);
356: int kinsert(int, int);
357: int kremove(int);
1.5 millert 358:
359: /* window.c X */
1.29 millert 360: int reposition(int, int);
361: int refresh(int, int);
362: int nextwind(int, int);
363: int prevwind(int, int);
364: int onlywind(int, int);
365: int splitwind(int, int);
366: int enlargewind(int, int);
367: int shrinkwind(int, int);
368: int delwind(int, int);
369: MGWIN *wpopup(void);
1.4 millert 370:
371: /* buffer.c */
1.37 vincent 372: int togglereadonly(void);
1.36 vincent 373: BUFFER *bfind(const char *, int);
1.29 millert 374: int poptobuffer(int, int);
375: int killbuffer(int, int);
376: int savebuffers(int, int);
377: int listbuffers(int, int);
378: int addlinef(BUFFER *, char *, ...);
1.12 art 379: #define addline(bp, text) addlinef(bp, "%s", text)
1.29 millert 380: int anycb(int);
381: int bclear(BUFFER *);
382: int showbuffer(BUFFER *, MGWIN *, int);
383: MGWIN *popbuf(BUFFER *);
384: int bufferinsert(int, int);
385: int usebuffer(int, int);
386: int notmodified(int, int);
387: int popbuftop(BUFFER *);
1.4 millert 388:
389: /* display.c */
1.29 millert 390: int vtresize(int, int, int);
391: void vtinit(void);
392: void vttidy(void);
393: void update(void);
1.5 millert 394:
395: /* echo.c X */
1.29 millert 396: void eerase(void);
1.36 vincent 397: int eyorn(const char *);
398: int eyesno(const char *);
1.29 millert 399: void ewprintf(const char *fmt, ...);
400: int ereply(const char *, char *, int, ...);
401: int eread(const char *, char *, int, int, ...);
402: int getxtra(LIST *, LIST *, int, int);
403: void free_file_list(LIST *);
1.4 millert 404:
405: /* fileio.c */
1.36 vincent 406: int ffropen(const char *, BUFFER *);
407: int ffwopen(const char *, BUFFER *);
1.29 millert 408: int ffclose(BUFFER *);
409: int ffputbuf(BUFFER *);
410: int ffgetline(char *, int, int *);
1.36 vincent 411: int fbackupfile(const char *);
412: char *adjustname(const char *);
1.29 millert 413: char *startupfile(char *);
414: int copy(char *, char *);
415: BUFFER *dired_(char *);
416: int d_makename(LINE *, char *, int);
417: LIST *make_file_list(char *);
1.4 millert 418:
1.5 millert 419: /* kbd.c X */
1.29 millert 420: int do_meta(int, int);
421: int bsmap(int, int);
422: void ungetkey(int);
423: int getkey(int);
424: int doin(void);
425: int rescan(int, int);
426: int universal_argument(int, int);
427: int digit_argument(int, int);
428: int negative_argument(int, int);
429: int selfinsert(int, int);
430: int quote(int, int);
1.4 millert 431:
432: /* main.c */
1.29 millert 433: int ctrlg(int, int);
434: int quit(int, int);
1.4 millert 435:
436: /* ttyio.c */
1.29 millert 437: void panic(char *);
1.4 millert 438:
439: /* cinfo.c */
1.29 millert 440: char *keyname(char *, size_t, int);
1.4 millert 441:
442: /* basic.c */
1.29 millert 443: int gotobol(int, int);
444: int backchar(int, int);
445: int gotoeol(int, int);
446: int forwchar(int, int);
447: int gotobob(int, int);
448: int gotoeob(int, int);
449: int forwline(int, int);
450: int backline(int, int);
451: void setgoal(void);
452: int getgoal(LINE *);
453: int forwpage(int, int);
454: int backpage(int, int);
455: int forw1page(int, int);
456: int back1page(int, int);
457: int pagenext(int, int);
458: void isetmark(void);
459: int setmark(int, int);
460: int swapmark(int, int);
461: int gotoline(int, int);
1.5 millert 462:
463: /* random.c X */
1.29 millert 464: int showcpos(int, int);
465: int getcolpos(void);
466: int twiddle(int, int);
467: int openline(int, int);
468: int newline(int, int);
469: int deblank(int, int);
470: int justone(int, int);
471: int delwhite(int, int);
472: int indent(int, int);
473: int forwdel(int, int);
474: int backdel(int, int);
475: int killline(int, int);
476: int yank(int, int);
477: int space_to_tabstop(int, int);
1.5 millert 478:
479: /* extend.c X */
1.29 millert 480: int insert(int, int);
481: int bindtokey(int, int);
482: int localbind(int, int);
483: int define_key(int, int);
484: int unbindtokey(int, int);
485: int localunbind(int, int);
486: int extend(int, int);
487: int evalexpr(int, int);
488: int evalbuffer(int, int);
489: int evalfile(int, int);
1.36 vincent 490: int load(const char *);
1.29 millert 491: int excline(char *);
1.5 millert 492:
493: /* help.c X */
1.29 millert 494: int desckey(int, int);
495: int wallchart(int, int);
496: int help_help(int, int);
497: int apropos_command(int, int);
1.5 millert 498:
499: /* paragraph.c X */
1.29 millert 500: int gotobop(int, int);
501: int gotoeop(int, int);
502: int fillpara(int, int);
503: int killpara(int, int);
504: int fillword(int, int);
505: int setfillcol(int, int);
1.5 millert 506:
507: /* word.c X */
1.29 millert 508: int backword(int, int);
509: int forwword(int, int);
510: int upperword(int, int);
511: int lowerword(int, int);
512: int capword(int, int);
513: int delfword(int, int);
514: int delbword(int, int);
515: int inword(void);
1.5 millert 516:
517: /* region.c X */
1.29 millert 518: int killregion(int, int);
519: int copyregion(int, int);
520: int lowerregion(int, int);
521: int upperregion(int, int);
522: int prefixregion(int, int);
523: int setprefix(int, int);
1.30 vincent 524: int region_get_data(REGION *, char *, int);
525: int region_put_data(const char *, int);
1.5 millert 526:
527: /* search.c X */
1.29 millert 528: int forwsearch(int, int);
529: int backsearch(int, int);
530: int searchagain(int, int);
531: int forwisearch(int, int);
532: int backisearch(int, int);
533: int queryrepl(int, int);
534: int forwsrch(void);
535: int backsrch(void);
536: int readpattern(char *);
1.5 millert 537:
538: /* spawn.c X */
1.29 millert 539: int spawncli(int, int);
1.5 millert 540:
541: /* ttykbd.c X */
1.29 millert 542: void ttykeymapinit(void);
543: void ttykeymaptidy(void);
1.5 millert 544:
545: /* match.c X */
1.29 millert 546: int showmatch(int, int);
1.5 millert 547:
548: /* version.c X */
1.29 millert 549: int showversion(int, int);
1.5 millert 550:
551: #ifndef NO_MACRO
552: /* macro.c X */
1.29 millert 553: int definemacro(int, int);
554: int finishmacro(int, int);
555: int executemacro(int, int);
1.5 millert 556: #endif /* !NO_MACRO */
557:
558: /* modes.c X */
1.29 millert 559: int indentmode(int, int);
560: int fillmode(int, int);
561: int blinkparen(int, int);
1.5 millert 562: #ifdef NOTAB
1.29 millert 563: int notabmode(int, int);
1.5 millert 564: #endif /* NOTAB */
1.29 millert 565: int overwrite(int, int);
566: int set_default_mode(int,int);
1.5 millert 567:
568: #ifdef REGEX
569: /* re_search.c X */
1.29 millert 570: int re_forwsearch(int, int);
571: int re_backsearch(int, int);
572: int re_searchagain(int, int);
573: int re_queryrepl(int, int);
574: int setcasefold(int, int);
575: int delmatchlines(int, int);
576: int delnonmatchlines(int, int);
577: int cntmatchlines(int, int);
578: int cntnonmatchlines(int, int);
1.5 millert 579: #endif /* REGEX */
1.1 deraadt 580:
1.30 vincent 581: /* undo.c X */
1.35 vincent 582: void free_undo_record(struct undo_rec *);
1.38 vincent 583: int undo_dump(void);
1.30 vincent 584: int undo_enable(int);
1.39 vincent 585: int undo_add_custom(int, int, LINE *, int, void *, int);
1.30 vincent 586: int undo_add_boundary(void);
587: int undo_add_insert(LINE *, int, int);
588: int undo_add_delete(LINE *, int, int);
589: int undo_add_change(LINE *, int, int);
1.32 vincent 590: int undo(int, int);
1.30 vincent 591:
1.1 deraadt 592: /*
593: * Externals.
594: */
1.5 millert 595: extern BUFFER *bheadp;
596: extern BUFFER *curbp;
597: extern MGWIN *curwp;
598: extern MGWIN *wheadp;
599: extern int thisflag;
600: extern int lastflag;
601: extern int curgoal;
602: extern int epresf;
603: extern int sgarbf;
604: extern int mode;
605: extern int nrow;
606: extern int ncol;
607: extern int ttrow;
608: extern int ttcol;
609: extern int tttop;
610: extern int ttbot;
611: extern int tthue;
1.30 vincent 612: extern int undoaction;
1.5 millert 613: extern int defb_nmodes;
614: extern int defb_flag;
1.17 mickey 615: extern const char cinfo[];
1.5 millert 616: extern char *keystrings[];
1.25 vincent 617: extern char pat[NPAT];
1.5 millert 618: #ifndef NO_DPROMPT
619: extern char prompt[];
620: #endif /* !NO_DPROMPT */
621:
622: /*
623: * Globals.
624: */
625: int tceeol;
626: int tcinsl;
627: int tcdell;