--- /dev/null
+/* $OpenBSD: def.h,v 1.124 2012/06/14 17:21:22 lum Exp $ */
+
+/* This file is in the public domain. */
+
+/*
+ * This file is the general header file for all parts
+ * of the Mg display editor. It contains all of the
+ * general definitions and macros. It also contains some
+ * conditional compilation flags. All of the per-system and
+ * per-terminal definitions are in special header files.
+ */
+
+#include "sysdef.h" /* Order is critical. */
+#include "ttydef.h"
+#include "chrdef.h"
+
+typedef int (*PF)(int, int); /* generally useful type */
+
+/*
+ * Table sizes, etc.
+ */
+#define NFILEN 1024 /* Length, file name. */
+#define NBUFN NFILEN /* Length, buffer name. */
+#define NLINE 256 /* Length, line. */
+#define PBMODES 4 /* modes per buffer */
+#define NKBDM 256 /* Length, keyboard macro. */
+#define NPAT 80 /* Length, pattern. */
+#define HUGE 1000 /* A rather large number. */
+#define NSRCH 128 /* Undoable search commands. */
+#define NXNAME 64 /* Length, extended command. */
+#define NKNAME 20 /* Length, key names. */
+#define NTIME 50 /* Length, timestamp string. */
+/*
+ * Universal.
+ */
+#define FALSE 0 /* False, no, bad, etc. */
+#define TRUE 1 /* True, yes, good, etc. */
+#define ABORT 2 /* Death, ^G, abort, etc. */
+
+#define KCLEAR 2 /* clear echo area */
+
+/*
+ * These flag bits keep track of
+ * some aspects of the last command. The CFCPCN
+ * flag controls goal column setting. The CFKILL
+ * flag controls the clearing versus appending
+ * of data in the kill buffer.
+ */
+#define CFCPCN 0x0001 /* Last command was C-P, C-N */
+#define CFKILL 0x0002 /* Last command was a kill */
+#define CFINS 0x0004 /* Last command was self-insert */
+
+/*
+ * File I/O.
+ */
+#define FIOSUC 0 /* Success. */
+#define FIOFNF 1 /* File not found. */
+#define FIOEOF 2 /* End of file. */
+#define FIOERR 3 /* Error. */
+#define FIOLONG 4 /* long line partially read */
+#define FIODIR 5 /* File is a directory */
+
+/*
+ * Directory I/O.
+ */
+#define DIOSUC 0 /* Success. */
+#define DIOEOF 1 /* End of file. */
+#define DIOERR 2 /* Error. */
+
+/*
+ * Display colors.
+ */
+#define CNONE 0 /* Unknown color. */
+#define CTEXT 1 /* Text color. */
+#define CMODE 2 /* Mode line color. */
+
+/*
+ * Flags for keyboard invoked functions.
+ */
+#define FFUNIV 1 /* universal argument */
+#define FFNEGARG 2 /* negative only argument */
+#define FFOTHARG 4 /* other argument */
+#define FFARG 7 /* any argument */
+#define FFRAND 8 /* Called by other function */
+
+/*
+ * Flags for "eread".
+ */
+#define EFFUNC 0x0001 /* Autocomplete functions. */
+#define EFBUF 0x0002 /* Autocomplete buffers. */
+#define EFFILE 0x0004 /* " files (maybe someday) */
+#define EFAUTO 0x0007 /* Some autocompletion on */
+#define EFNEW 0x0008 /* New prompt. */
+#define EFCR 0x0010 /* Echo CR at end; last read. */
+#define EFDEF 0x0020 /* buffer contains default args */
+#define EFNUL 0x0040 /* Null Minibuffer OK */
+
+/*
+ * Direction of insert into kill ring
+ */
+#define KNONE 0x00
+#define KFORW 0x01 /* forward insert into kill ring */
+#define KBACK 0x02 /* Backwards insert into kill ring */
+#define KREG 0x04 /* This is a region-based kill */
+
+#define MAX_TOKEN 64
+
+/*
+ * This structure holds the starting position
+ * (as a line/offset pair) and the number of characters in a
+ * region of a buffer. This makes passing the specification
+ * of a region around a little bit easier.
+ */
+struct region {
+ struct line *r_linep; /* Origin line address. */
+ int r_offset; /* Origin line offset. */
+ int r_lineno; /* Origin line number */
+ RSIZE r_size; /* Length in characters. */
+};
+
+
+/*
+ * All text is kept in circularly linked
+ * lists of "line" structures. These begin at the
+ * header line (which is the blank line beyond the
+ * end of the buffer). This line is pointed to by
+ * the "buffer" structure. Each line contains the number of
+ * bytes in the line (the "used" size), the size
+ * of the text array, and the text. The end of line
+ * is not stored as a byte; it's implied. Future
+ * additions will include update hints, and a
+ * list of marks into the line.
+ */
+struct line {
+ struct line *l_fp; /* Link to the next line */
+ struct line *l_bp; /* Link to the previous line */
+ int l_size; /* Allocated size */
+ int l_used; /* Used size */
+ char *l_text; /* Content of the line */
+};
+
+/*
+ * The rationale behind these macros is that you
+ * could (with some editing, like changing the type of a line
+ * link from a "struct line *" to a "REFLINE", and fixing the commands
+ * like file reading that break the rules) change the actual
+ * storage representation of lines to use something fancy on
+ * machines with small address spaces.
+ */
+#define lforw(lp) ((lp)->l_fp)
+#define lback(lp) ((lp)->l_bp)
+#define lgetc(lp, n) (CHARMASK((lp)->l_text[(n)]))
+#define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
+#define llength(lp) ((lp)->l_used)
+#define ltext(lp) ((lp)->l_text)
+
+/*
+ * All repeated structures are kept as linked lists of structures.
+ * All of these start with a LIST structure (except lines, which
+ * have their own abstraction). This will allow for
+ * later conversion to generic list manipulation routines should
+ * I decide to do that. It does mean that there are four extra
+ * bytes per window. I feel that this is an acceptable price,
+ * considering that there are usually only one or two windows.
+ */
+struct list {
+ union {
+ struct mgwin *l_wp;
+ struct buffer *x_bp; /* l_bp is used by struct line */
+ struct list *l_nxt;
+ } l_p;
+ char *l_name;
+};
+
+/*
+ * Usual hack - to keep from uglifying the code with lotsa
+ * references through the union, we #define something for it.
+ */
+#define l_next l_p.l_nxt
+
+/*
+ * There is a window structure allocated for
+ * every active display window. The windows are kept in a
+ * big list, in top to bottom screen order, with the listhead at
+ * "wheadp". Each window contains its own values of dot and mark.
+ * The flag field contains some bits that are set by commands
+ * to guide redisplay; although this is a bit of a compromise in
+ * terms of decoupling, the full blown redisplay is just too
+ * expensive to run for every input character.
+ */
+struct mgwin {
+ struct list w_list; /* List header */
+ struct buffer *w_bufp; /* Buffer displayed in window */
+ struct line *w_linep; /* Top line in the window */
+ struct line *w_dotp; /* Line containing "." */
+ struct line *w_markp; /* Line containing "mark" */
+ int w_doto; /* Byte offset for "." */
+ int w_marko; /* Byte offset for "mark" */
+ int w_toprow; /* Origin 0 top row of window */
+ int w_ntrows; /* # of rows of text in window */
+ int w_frame; /* #lines to reframe by. */
+ char w_rflag; /* Redisplay Flags. */
+ char w_flag; /* Flags. */
+ struct line *w_wrapline;
+ int w_dotline; /* current line number of dot */
+ int w_markline; /* current line number of mark */
+};
+#define w_wndp w_list.l_p.l_wp
+#define w_name w_list.l_name
+
+/*
+ * Window redisplay flags are set by command processors to
+ * tell the display system what has happened to the buffer
+ * mapped by the window. Setting "WFFULL" is always a safe thing
+ * to do, but it may do more work than is necessary. Always try
+ * to set the simplest action that achieves the required update.
+ * Because commands set bits in the "w_flag", update will see
+ * all change flags, and do the most general one.
+ */
+#define WFFRAME 0x01 /* Force reframe. */
+#define WFMOVE 0x02 /* Movement from line to line. */
+#define WFEDIT 0x04 /* Editing within a line. */
+#define WFFULL 0x08 /* Do a full display. */
+#define WFMODE 0x10 /* Update mode line. */
+
+/*
+ * Window flags
+ */
+#define WNONE 0x00 /* No special window options. */
+#define WEPHEM 0x01 /* Window is ephemeral. */
+
+struct undo_rec;
+TAILQ_HEAD(undoq, undo_rec);
+
+/*
+ * Text is kept in buffers. A buffer header, described
+ * below, exists for every buffer in the system. The buffers are
+ * kept in a big list, so that commands that search for a buffer by
+ * name can find the buffer header. There is a safe store for the
+ * dot and mark in the header, but this is only valid if the buffer
+ * is not being displayed (that is, if "b_nwnd" is 0). The text for
+ * the buffer is kept in a circularly linked list of lines, with
+ * a pointer to the header line in "b_headp".
+ */
+struct buffer {
+ struct list b_list; /* buffer list pointer */
+ struct buffer *b_altb; /* Link to alternate buffer */
+ struct line *b_dotp; /* Link to "." line structure */
+ struct line *b_markp; /* ditto for mark */
+ struct line *b_headp; /* Link to the header line */
+ struct maps_s *b_modes[PBMODES]; /* buffer modes */
+ int b_doto; /* Offset of "." in above line */
+ int b_marko; /* ditto for the "mark" */
+ short b_nmodes; /* number of non-fundamental modes */
+ char b_nwnd; /* Count of windows on buffer */
+ char b_flag; /* Flags */
+ char b_fname[NFILEN]; /* File name */
+ char b_cwd[NFILEN]; /* working directory */
+ struct fileinfo b_fi; /* File attributes */
+ struct undoq b_undo; /* Undo actions list */
+ int b_undopos; /* Where we were during last undo */
+ struct undo_rec *b_undoptr;
+ int b_dotline; /* Line number of dot */
+ int b_markline; /* Line number of mark */
+ int b_lines; /* Number of lines in file */
+};
+#define b_bufp b_list.l_p.x_bp
+#define b_bname b_list.l_name
+
+/* Some helper macros, in case they ever change to functions */
+#define bfirstlp(buf) (lforw((buf)->b_headp))
+#define blastlp(buf) (lback((buf)->b_headp))
+
+#define BFCHG 0x01 /* Changed. */
+#define BFBAK 0x02 /* Need to make a backup. */
+#ifdef NOTAB
+#define BFNOTAB 0x04 /* no tab mode */
+#endif
+#define BFOVERWRITE 0x08 /* overwrite mode */
+#define BFREADONLY 0x10 /* read only mode */
+#define BFDIRTY 0x20 /* Buffer was modified elsewhere */
+#define BFIGNDIRTY 0x40 /* Ignore modifications */
+/*
+ * This structure holds information about recent actions for the Undo command.
+ */
+struct undo_rec {
+ TAILQ_ENTRY(undo_rec) next;
+ enum {
+ INSERT = 1,
+ DELETE,
+ BOUNDARY,
+ MODIFIED,
+ DELREG
+ } type;
+ struct region region;
+ int pos;
+ char *content;
+};
+
+/*
+ * Prototypes.
+ */
+
+/* tty.c X */
+void ttinit(void);
+void ttreinit(void);
+void tttidy(void);
+void ttmove(int, int);
+void tteeol(void);
+void tteeop(void);
+void ttbeep(void);
+void ttinsl(int, int, int);
+void ttdell(int, int, int);
+void ttwindow(int, int);
+void ttnowindow(void);
+void ttcolor(int);
+void ttresize(void);
+
+volatile sig_atomic_t winch_flag;
+
+/* ttyio.c */
+void ttopen(void);
+int ttraw(void);
+void ttclose(void);
+int ttcooked(void);
+int ttputc(int);
+void ttflush(void);
+int ttgetc(void);
+int ttwait(int);
+int charswaiting(void);
+
+/* dir.c */
+void dirinit(void);
+int changedir(int, int);
+int showcwdir(int, int);
+int getcwdir(char *, size_t);
+
+/* dired.c */
+struct buffer *dired_(char *);
+
+/* file.c X */
+int fileinsert(int, int);
+int filevisit(int, int);
+int filevisitalt(int, int);
+int filevisitro(int, int);
+int poptofile(int, int);
+struct buffer *findbuffer(char *);
+int readin(char *);
+int insertfile(char *, char *, int);
+int filewrite(int, int);
+int filesave(int, int);
+int buffsave(struct buffer *);
+int makebkfile(int, int);
+int writeout(FILE **, struct buffer *, char *);
+void upmodes(struct buffer *);
+size_t xbasename(char *, const char *, size_t);
+
+/* line.c X */
+struct line *lalloc(int);
+int lrealloc(struct line *, int);
+void lfree(struct line *);
+void lchange(int);
+int linsert_str(const char *, int);
+int linsert(int, int);
+int lnewline_at(struct line *, int);
+int lnewline(void);
+int ldelete(RSIZE, int);
+int ldelnewline(void);
+int lreplace(RSIZE, char *);
+char * linetostr(const struct line *);
+
+/* yank.c X */
+
+void kdelete(void);
+int kinsert(int, int);
+int kremove(int);
+int kchunk(char *, RSIZE, int);
+int killline(int, int);
+int yank(int, int);
+
+/* window.c X */
+struct mgwin *new_window(struct buffer *);
+void free_window(struct mgwin *);
+int reposition(int, int);
+int redraw(int, int);
+int do_redraw(int, int, int);
+int nextwind(int, int);
+int prevwind(int, int);
+int onlywind(int, int);
+int splitwind(int, int);
+int enlargewind(int, int);
+int shrinkwind(int, int);
+int delwind(int, int);
+
+/* buffer.c */
+int togglereadonly(int, int);
+struct buffer *bfind(const char *, int);
+int poptobuffer(int, int);
+int killbuffer(struct buffer *);
+int killbuffer_cmd(int, int);
+int savebuffers(int, int);
+int listbuffers(int, int);
+int addlinef(struct buffer *, char *, ...);
+#define addline(bp, text) addlinef(bp, "%s", text)
+int anycb(int);
+int bclear(struct buffer *);
+int showbuffer(struct buffer *, struct mgwin *, int);
+int augbname(char *, const char *, size_t);
+struct mgwin *popbuf(struct buffer *, int);
+int bufferinsert(int, int);
+int usebuffer(int, int);
+int notmodified(int, int);
+int popbuftop(struct buffer *, int);
+int getbufcwd(char *, size_t);
+int checkdirty(struct buffer *);
+
+/* display.c */
+int vtresize(int, int, int);
+void vtinit(void);
+void vttidy(void);
+void update(void);
+int linenotoggle(int, int);
+
+/* echo.c X */
+void eerase(void);
+int eyorn(const char *);
+int eyesno(const char *);
+void ewprintf(const char *fmt, ...);
+char *ereply(const char *, char *, size_t, ...);
+char *eread(const char *, char *, size_t, int, ...);
+int getxtra(struct list *, struct list *, int, int);
+void free_file_list(struct list *);
+
+/* fileio.c */
+int ffropen(FILE **, const char *, struct buffer *);
+void ffstat(FILE *, struct buffer *);
+int ffwopen(FILE **, const char *, struct buffer *);
+int ffclose(FILE *, struct buffer *);
+int ffputbuf(FILE *, struct buffer *);
+int ffgetline(FILE *, char *, int, int *);
+int fbackupfile(const char *);
+char *adjustname(const char *, int);
+char *startupfile(char *);
+int copy(char *, char *);
+struct list *make_file_list(char *);
+int fisdir(const char *);
+int fchecktime(struct buffer *);
+int fupdstat(struct buffer *);
+int backuptohomedir(int, int);
+int toggleleavetmp(int, int);
+
+/* kbd.c X */
+int do_meta(int, int);
+int bsmap(int, int);
+void ungetkey(int);
+int getkey(int);
+int doin(void);
+int rescan(int, int);
+int universal_argument(int, int);
+int digit_argument(int, int);
+int negative_argument(int, int);
+int selfinsert(int, int);
+int quote(int, int);
+
+/* main.c */
+int ctrlg(int, int);
+int quit(int, int);
+
+/* ttyio.c */
+void panic(char *);
+
+/* cinfo.c */
+char *getkeyname(char *, size_t, int);
+
+/* basic.c */
+int gotobol(int, int);
+int backchar(int, int);
+int gotoeol(int, int);
+int forwchar(int, int);
+int gotobob(int, int);
+int gotoeob(int, int);
+int forwline(int, int);
+int backline(int, int);
+void setgoal(void);
+int getgoal(struct line *);
+int forwpage(int, int);
+int backpage(int, int);
+int forw1page(int, int);
+int back1page(int, int);
+int pagenext(int, int);
+void isetmark(void);
+int setmark(int, int);
+int clearmark(int, int);
+int swapmark(int, int);
+int gotoline(int, int);
+
+/* random.c X */
+int showcpos(int, int);
+int getcolpos(void);
+int twiddle(int, int);
+int openline(int, int);
+int newline(int, int);
+int deblank(int, int);
+int justone(int, int);
+int delwhite(int, int);
+int delleadwhite(int, int);
+int deltrailwhite(int, int);
+int lfindent(int, int);
+int indent(int, int);
+int forwdel(int, int);
+int backdel(int, int);
+int space_to_tabstop(int, int);
+int backtoindent(int, int);
+int joinline(int, int);
+
+/* tags.c X */
+int findtag(int, int);
+int poptag(int, int);
+int tagsvisit(int, int);
+int curtoken(int, int, char *);
+
+/* cscope.c */
+int cssymbol(int, int);
+int csdefinition(int, int);
+int csfuncalled(int, int);
+int cscallerfuncs(int, int);
+int csfindtext(int, int);
+int csegrep(int, int);
+int csfindfile(int, int);
+int csfindinc(int, int);
+int csnextfile(int, int);
+int csnextmatch(int, int);
+int csprevfile(int, int);
+int csprevmatch(int, int);
+int cscreatelist(int, int);
+
+/* extend.c X */
+int insert(int, int);
+int bindtokey(int, int);
+int localbind(int, int);
+int redefine_key(int, int);
+int unbindtokey(int, int);
+int localunbind(int, int);
+int extend(int, int);
+int evalexpr(int, int);
+int evalbuffer(int, int);
+int evalfile(int, int);
+int load(const char *);
+int excline(char *);
+
+/* help.c X */
+int desckey(int, int);
+int wallchart(int, int);
+int help_help(int, int);
+int apropos_command(int, int);
+
+/* paragraph.c X */
+int gotobop(int, int);
+int gotoeop(int, int);
+int fillpara(int, int);
+int killpara(int, int);
+int fillword(int, int);
+int setfillcol(int, int);
+
+/* word.c X */
+int backword(int, int);
+int forwword(int, int);
+int upperword(int, int);
+int lowerword(int, int);
+int capword(int, int);
+int delfword(int, int);
+int delbword(int, int);
+int inword(void);
+
+/* region.c X */
+int killregion(int, int);
+int copyregion(int, int);
+int lowerregion(int, int);
+int upperregion(int, int);
+int prefixregion(int, int);
+int setprefix(int, int);
+int region_get_data(struct region *, char *, int);
+void region_put_data(const char *, int);
+int markbuffer(int, int);
+int piperegion(int, int);
+
+/* search.c X */
+int forwsearch(int, int);
+int backsearch(int, int);
+int searchagain(int, int);
+int forwisearch(int, int);
+int backisearch(int, int);
+int queryrepl(int, int);
+int forwsrch(void);
+int backsrch(void);
+int readpattern(char *);
+
+/* spawn.c X */
+int spawncli(int, int);
+
+/* ttykbd.c X */
+void ttykeymapinit(void);
+void ttykeymaptidy(void);
+
+/* match.c X */
+int showmatch(int, int);
+
+/* version.c X */
+int showversion(int, int);
+
+/* macro.c X */
+int definemacro(int, int);
+int finishmacro(int, int);
+int executemacro(int, int);
+
+/* modes.c X */
+int indentmode(int, int);
+int fillmode(int, int);
+int blinkparen(int, int);
+#ifdef NOTAB
+int notabmode(int, int);
+#endif /* NOTAB */
+int overwrite_mode(int, int);
+int set_default_mode(int,int);
+
+#ifdef REGEX
+/* re_search.c X */
+int re_forwsearch(int, int);
+int re_backsearch(int, int);
+int re_searchagain(int, int);
+int re_queryrepl(int, int);
+int replstr(int, int);
+int setcasefold(int, int);
+int delmatchlines(int, int);
+int delnonmatchlines(int, int);
+int cntmatchlines(int, int);
+int cntnonmatchlines(int, int);
+#endif /* REGEX */
+
+/* undo.c X */
+void free_undo_record(struct undo_rec *);
+int undo_dump(int, int);
+int undo_enabled(void);
+int undo_enable(int, int);
+int undo_add_boundary(int, int);
+void undo_add_modified(void);
+int undo_add_insert(struct line *, int, int);
+int undo_add_delete(struct line *, int, int, int);
+int undo_boundary_enable(int, int);
+int undo_add_change(struct line *, int, int);
+int undo(int, int);
+
+/* autoexec.c X */
+int auto_execute(int, int);
+PF *find_autoexec(const char *);
+int add_autoexec(const char *, const char *);
+
+/* cmode.c X */
+int cmode(int, int);
+int cc_brace(int, int);
+int cc_char(int, int);
+int cc_tab(int, int);
+int cc_indent(int, int);
+int cc_lfindent(int, int);
+
+/* grep.c X */
+int next_error(int, int);
+int globalwdtoggle(int, int);
+int compile(int, int);
+
+/*
+ * Externals.
+ */
+extern struct buffer *bheadp;
+extern struct buffer *curbp;
+extern struct mgwin *curwp;
+extern struct mgwin *wheadp;
+extern int thisflag;
+extern int lastflag;
+extern int curgoal;
+extern int startrow;
+extern int epresf;
+extern int sgarbf;
+extern int mode;
+extern int nrow;
+extern int ncol;
+extern int ttrow;
+extern int ttcol;
+extern int tttop;
+extern int ttbot;
+extern int tthue;
+extern int defb_nmodes;
+extern int defb_flag;
+extern char cinfo[];
+extern char *keystrings[];
+extern char pat[NPAT];
+#ifndef NO_DPROMPT
+extern char prompt[];
+#endif /* !NO_DPROMPT */
+
+/*
+ * Globals.
+ */
+int tceeol;
+int tcinsl;
+int tcdell;
+int rptcount; /* successive invocation count */