File: [local] / src / usr.bin / mg / def.h (download)
Revision 1.39, Mon Mar 18 01:45:54 2002 UTC (22 years, 3 months ago) by vincent
Branch: MAIN
CVS Tags: OPENBSD_3_1_BASE, OPENBSD_3_1 Changes since 1.38: +16 -15 lines
Enter the new undo code. it is still disabled since it has bugs, but it's
somewhat more useful....
ok millert@ + no objections on ICB
|
/* $OpenBSD: def.h,v 1.39 2002/03/18 01:45:54 vincent Exp $ */
#include <sys/queue.h>
/*
* 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.
* The most common reason to edit this file would be to zap
* the definition of CVMVAS or BACKUP.
*/
#include "sysdef.h" /* Order is critical. */
#include "ttydef.h"
#include "chrdef.h"
#ifdef NO_MACRO
#ifndef NO_STARTUP
#define NO_STARTUP /* NO_MACRO implies NO_STARTUP */
#endif
#endif
typedef int (*PF)(); /* 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 */
/*
* Universal.
*/
#define FALSE 0 /* False, no, bad, etc. */
#define TRUE 1 /* True, yes, good, etc. */
#define ABORT 2 /* Death, ^G, abort, etc. */
#define KPROMPT 2 /* keyboard prompt */
/*
* 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 */
/*
* 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 autocompleteion on */
#define EFNEW 0x0008 /* New prompt. */
#define EFCR 0x0010 /* Echo CR at end; last read. */
#define EFDEF 0x0020 /* buffer contains default args */
/*
* Flags for "ldelete"/"kinsert"
*/
#define KNONE 0
#define KFORW 1
#define KBACK 2
/*
* 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". Each line contains a 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.
*/
typedef 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 */
} LINE;
/*
* The rationale behind these macros is that you
* could (with some editing, like changing the type of a line
* link from a "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.
*/
typedef struct LIST {
union {
struct MGWIN *l_wp;
struct BUFFER *x_bp; /* l_bp is used by LINE */
struct LIST *l_nxt;
} l_p;
const char *l_name;
} LIST;
/*
* 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.
*/
typedef struct MGWIN {
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" */
char w_toprow; /* Origin 0 top row of window */
char w_ntrows; /* # of rows of text in window */
char w_force; /* If NZ, forcing row. */
char w_flag; /* Flags. */
} MGWIN;
#define w_wndp w_list.l_p.l_wp
#define w_name w_list.l_name
/*
* Window flags are set by command processors to
* tell the display system what has happened to the buffer
* mapped by the window. Setting "WFHARD" 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 WFFORCE 0x01 /* Force reframe. */
#define WFMOVE 0x02 /* Movement from line to line. */
#define WFEDIT 0x04 /* Editing within a line. */
#define WFHARD 0x08 /* Better to a full display. */
#define WFMODE 0x10 /* Update mode line. */
struct undo_rec;
/*
* 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.
*/
typedef struct {
struct LINE *r_linep; /* Origin LINE address. */
int r_offset; /* Origin LINE offset. */
RSIZE r_size; /* Length in characters. */
} REGION;
/*
* 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_linep".
*/
typedef struct BUFFER {
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_linep; /* 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 */
struct fileinfo b_fi; /* File attributes */
LIST_HEAD(, undo_rec) b_undo; /* Undo actions list */
REGION b_undopos; /* Where we were during the last
undo action */
struct undo_rec *b_undoptr;
} BUFFER;
#define b_bufp b_list.l_p.x_bp
#define b_bname b_list.l_name
#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 */
/*
* This structure holds information about recent actions for the Undo command.
*/
struct undo_rec {
LIST_ENTRY(undo_rec) next;
enum {
INSERT = 1,
DELETE,
CHANGE,
BOUNDARY
} type;
REGION region;
int pos;
int size;
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 typeahead(void);
/* dir.c */
void dirinit(void);
int changedir(int, int);
int showcwdir(int, int);
/* dired.c */
int dired(int, int);
int d_otherwindow(int, int);
int d_undel(int, int);
int d_undelbak(int, int);
int d_findfile(int, int);
int d_ffotherwindow(int, int);
int d_expunge(int, int);
int d_copy(int, int);
int d_del(int, int);
int d_rename(int, int);
/* file.c X */
int fileinsert(int, int);
int filevisit(int, int);
int poptofile(int, int);
BUFFER *findbuffer(char *);
int readin(char *);
int insertfile(char *, char *, int);
int filewrite(int, int);
int filesave(int, int);
int buffsave(BUFFER *);
int makebkfile(int, int);
int writeout(BUFFER *, char *);
void upmodes(BUFFER *);
/* line.c X */
LINE *lalloc(int);
int lrealloc(LINE *, int);
void lfree(LINE *);
void lchange(int);
int linsert(int, int);
int lnewline(void);
int ldelete(RSIZE, int);
int ldelnewline(void);
int lreplace(RSIZE, char *, int);
void kdelete(void);
int kinsert(int, int);
int kremove(int);
/* window.c X */
int reposition(int, int);
int refresh(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);
MGWIN *wpopup(void);
/* buffer.c */
int togglereadonly(void);
BUFFER *bfind(const char *, int);
int poptobuffer(int, int);
int killbuffer(int, int);
int savebuffers(int, int);
int listbuffers(int, int);
int addlinef(BUFFER *, char *, ...);
#define addline(bp, text) addlinef(bp, "%s", text)
int anycb(int);
int bclear(BUFFER *);
int showbuffer(BUFFER *, MGWIN *, int);
MGWIN *popbuf(BUFFER *);
int bufferinsert(int, int);
int usebuffer(int, int);
int notmodified(int, int);
int popbuftop(BUFFER *);
/* display.c */
int vtresize(int, int, int);
void vtinit(void);
void vttidy(void);
void update(void);
/* echo.c X */
void eerase(void);
int eyorn(const char *);
int eyesno(const char *);
void ewprintf(const char *fmt, ...);
int ereply(const char *, char *, int, ...);
int eread(const char *, char *, int, int, ...);
int getxtra(LIST *, LIST *, int, int);
void free_file_list(LIST *);
/* fileio.c */
int ffropen(const char *, BUFFER *);
int ffwopen(const char *, BUFFER *);
int ffclose(BUFFER *);
int ffputbuf(BUFFER *);
int ffgetline(char *, int, int *);
int fbackupfile(const char *);
char *adjustname(const char *);
char *startupfile(char *);
int copy(char *, char *);
BUFFER *dired_(char *);
int d_makename(LINE *, char *, int);
LIST *make_file_list(char *);
/* 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 *keyname(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(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 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 indent(int, int);
int forwdel(int, int);
int backdel(int, int);
int killline(int, int);
int yank(int, int);
int space_to_tabstop(int, int);
/* extend.c X */
int insert(int, int);
int bindtokey(int, int);
int localbind(int, int);
int define_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(REGION *, char *, int);
int region_put_data(const char *, 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);
#ifndef NO_MACRO
/* macro.c X */
int definemacro(int, int);
int finishmacro(int, int);
int executemacro(int, int);
#endif /* !NO_MACRO */
/* 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(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 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(void);
int undo_enable(int);
int undo_add_custom(int, int, LINE *, int, void *, int);
int undo_add_boundary(void);
int undo_add_insert(LINE *, int, int);
int undo_add_delete(LINE *, int, int);
int undo_add_change(LINE *, int, int);
int undo(int, int);
/*
* Externals.
*/
extern BUFFER *bheadp;
extern BUFFER *curbp;
extern MGWIN *curwp;
extern MGWIN *wheadp;
extern int thisflag;
extern int lastflag;
extern int curgoal;
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 undoaction;
extern int defb_nmodes;
extern int defb_flag;
extern const 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;