]> pd.if.org Git - pd_readline/blobdiff - mg/def.h
Added mg from an OpenBSD mirror site. Many thanks to the OpenBSD team and the mg...
[pd_readline] / mg / def.h
diff --git a/mg/def.h b/mg/def.h
new file mode 100644 (file)
index 0000000..1284e94
--- /dev/null
+++ b/mg/def.h
@@ -0,0 +1,707 @@
+/*     $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 */