home *** CD-ROM | disk | FTP | other *** search
- /*
- * Common header file.
- *
- * This file is the general header file for all parts
- * of the 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.
- */
- #define LINT_ARGS 1 /* enable lint type checking */
- #include "stdio.h"
-
- #define UNIX 1
- #define MSDOS 0
-
- #define BACKUP 1 /* Make backup file. */
- #define RUNCHK 1 /* Do additional checking at run time */
-
- #ifndef uchar
- #define uchar unsigned char
- #endif
-
- #ifndef uint
- #define uint unsigned int
- #endif
-
- #ifndef ulong
- #define ulong unsigned long
- #endif
-
- /* these defines are reserved for handling data values from the buffer */
- #define D8 uchar /* this had better be a 8 bit quantity */
- #define D16 uint /* this had better be a 16 bit quantity */
- #define D32 ulong /* this had better be a 32 bit quantity */
-
- /* this define is reserved for the address of a location in the buffer */
- #define A32 long /* this is a 32 bit address into the buffer */
-
- #define bool char /* used for boolean values */
- #define bits char /* used for boolean bit flags */
-
- /*
- * MS-DOS system header file.
- */
- #if MSDOS
- #define LARGE 1 /* Large model. */
- #endif
- #define PCC 1 /* "[]" won't work. */
- #define GOOD 0 /* Indicate hunkydoryhood */
-
- /*
- * Macros used by the buffer name making code.
- * Start at the end of the file name, scan to the left
- * until BDC1 (or BDC2, if defined) is reached. The buffer
- * name starts just to the right of that location, and
- * stops at end of string (or at the next BDC3 character,
- * if defined). BDC2 and BDC3 are mainly for VMS.
- */
- #define BDC1 ':' /* Buffer names. */
- #define BDC2 '/' /* Buffer names. jam */
-
- /*
- * Digital ANSI terminal header file
- */
- #define GOSLING 0 /* Compile in fancy display. */
-
- #define NROW 25 /* Rows.for boot */
- #define NCOL 80 /* Columns. */
-
- #define CUSTOMIZE /* compile switch for extended key
- binding in extend.c */
- #define COSMETIC /* cosmetic screen stuff on
- insert off screen */
- #if MSDOS
- #define WANG_CHARACTER_SCREEN 0xf0000000L
- #endif
- /*
- * Table sizes, etc.
- */
- #define NSHASH 31 /* Symbol table hash size. */
- #define NFILEN 80 /* Length, file name. */
- #define NBUFN 13 /* Length, buffer name. */
- #define NFILE 12 /* Length, file name. */ /* krw */
- #define NLINE 80 /* Length, line. pvr */
- #define NKBDM 256 /* Length, keyboard macro. */
- #define NMSG 512 /* Length, message buffer. */
- #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 NBLOCK 16 /* Line block chunk size */
- #define MAXPOS 0x7FFFFFFF /* Maximum positive long value */
-
- /*
- * Universal.
- */
- #define FALSE 0 /* False, no, bad, etc. */
- #define TRUE 1 /* True, yes, good, etc. */
- #define ABORT 2 /* Death, ^G, abort, etc. */
-
- /*
- * These flag bits keep track of
- * some aspects of the last command.
- * The CFKILL flag controls the clearing versus appending
- * of data in the kill buffer.
- */
- #define CFKILL 0x0002 /* Last command was a kill */
-
- /*
- * File I/O.
- */
- #define FIOSUC 0 /* Success. */
- #define FIOFNF 1 /* File not found. */
- #define FIOEOF 2 /* End of file. */
- #define FIOERR 3 /* Error. */
-
- /*
- * 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 "eread".
- */
- #define EFNEW 0x0001 /* New prompt. */
- #define EFAUTO 0x0002 /* Autocompletion enabled. */
- #define EFCR 0x0004 /* Echo CR at end; last read. */
-
- /*
- * Keys are represented inside using an 11 bit
- * keyboard code. The transformation between the keys on
- * the keyboard and 11 bit code is done by terminal specific
- * code in the "kbd.c" file. The actual character is stored
- * in 8 bits (DEC multinationals work); there is also a control
- * flag KCTRL, a meta flag KMETA, and a control-X flag KCTLX.
- * ASCII control characters are always represented using the
- * KCTRL form. Although the C0 control set is free, it is
- * reserved for C0 controls because it makes the communication
- * between "getkey" and "getkbd" easier. The funny keys get
- * mapped into the C1 control area.
- */
- #define NKEYS 2048 /* 11 bit code. */
-
- #define METACH 0x1B /* M- prefix, Control-[, ESC */
- #define CTMECH 0x1C /* C-M- prefix, Control-\ */
- #define EXITCH 0x1D /* Exit level, Control-] */
- #define CTRLCH 0x1E /* C- prefix, Control-^ */
- #define HELPCH 0x1F /* Help key, Control-_ */
-
- #define KCHAR 0x00FF /* The basic character code. */
- #define KCTRL 0x0100 /* Control flag. */
- #define KMETA 0x0200 /* Meta flag. */
- #define KCTLX 0x0400 /* Control-X flag. */
-
- #define KFIRST 0x0080 /* First special. fitz */
- #define KLAST 0x00F3 /* Last special. */
-
- #define KRANDOM 0x0080 /* A "no key" code. */
- /*
- * These flags, and the macros below them,
- * make up a do-it-yourself set of "ctype" macros that
- * understand the DEC multinational set, and let me ask
- * a slightly different set of questions.
- */
- #define _W 0x01 /* Word. */
- #define _U 0x02 /* Upper case letter. */
- #define _L 0x04 /* Lower case letter. */
- #define _C 0x08 /* Control. */
-
- #define ISCTRL(c) ((cinfo[(c)]&_C)!=0)
- #define ISUPPER(c) ((cinfo[(c)]&_U)!=0)
- #define ISLOWER(c) ((cinfo[(c)]&_L)!=0)
- #define TOUPPER(c) ((c)-0x20)
- #define TOLOWER(c) ((c)+0x20)
-
- #define BUF_SIZE(wp) (wp -> w_bufp -> b_linep -> l_bp -> l_file_offset + \
- wp -> w_bufp -> b_linep -> l_bp -> l_used)
- #define BUF_START(wp) (wp -> w_bufp -> b_linep -> l_fp -> l_file_offset)
- #define DOT_POS(wp) (wp -> w_dotp -> l_file_offset + wp -> w_doto)
- #define MARK_POS(wp) (wp -> w_markp -> l_file_offset + wp -> w_marko)
- #define DOT_CHAR(wp) (wp -> w_dotp -> l_text[wp -> w_doto])
- #define WIND_POS(wp) (wp -> w_linep -> l_file_offset + wp -> w_loff)
- #define R_TYPE(wp) (wp -> w_fmt_ptr -> r_type)
- #define R_SIZE(wp) (wp -> w_fmt_ptr -> r_size)
- #define R_UNITS(wp) (wp -> w_fmt_ptr -> r_units)
- #define R_BYTES(wp) (wp -> w_fmt_ptr -> r_bytes)
- #define R_ALIGN(wp) (wp -> w_fmt_ptr -> r_align)
- #define R_B_PER_U(wp) (wp -> w_fmt_ptr -> r_b_per_u)
- #define R_CHR_PER_U(wp) (wp -> w_fmt_ptr -> r_chr_per_u)
- #define R_FLAGS(wp) (wp -> w_fmt_ptr -> r_flags)
- #define R_UNIT_FMT(wp) (wp -> w_fmt_ptr -> r_unit_fmt)
- #define R_POS_FMT(wp) (wp -> w_fmt_ptr -> r_pos_fmt)
- #define R_BYTE_FMT(wp) (wp -> w_fmt_ptr -> r_byte_fmt)
- #define R_POSITIONS(wp) (wp -> w_fmt_ptr -> r_positions)
-
- /*
- * The symbol table links editing functions
- * to names. Entries in the key map point at the symbol
- * table entry. A reference count is kept, but it is
- * probably next to useless right now. The old type code,
- * which was not being used and probably not right
- * anyway, is all gone.
- */
- typedef struct SYMBOL {
- struct SYMBOL *s_symp; /* Hash chain. */
- short s_nkey; /* Count of keys bound here. */
- char *s_name; /* Name. */
- int (*s_funcp)(); /* Function. */
- bits s_modify; /* modify bit */
- } SYMBOL;
-
- /*
- * These are the legal values for 's_modify' and 'k_modify'
- */
- #define SMOD 0x01 /* command modifies the buffer */
- #define SSIZE 0x02 /* command changes buffer size */
- #define SSRCH 0x04 /* command valid in search */
- #define SRPLC 0x08 /* command valid in replace */
-
- /*
- * 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 WINDOW {
- struct WINDOW *w_wndp; /* Next window */
- struct BUFFER *w_bufp; /* Buffer displayed in window */
- struct LINE *w_linep; /* Top line in the window */
- int w_loff; /* Offset into line for start pvr */
- struct LINE *w_dotp; /* Line containing "." */
- int w_doto; /* Offset into line for "." */
- struct LINE *w_markp; /* Line containing "mark" */
- int w_marko; /* Byte offset for "mark" */
- char w_unit_offset; /* Byte offset for "." into unit pvr */
- char w_toprow; /* Origin 0 top row of window */
- char w_ntrows; /* # of rows of text in window */
- bits w_flag; /* Flags. */
- char w_disp_shift; /* Display byte shift; 0-3 pvr */
- bool w_intel_mode; /* Display byte swaped. pvr */
- struct ROW_FMT *w_fmt_ptr; /* Pointer to display format pvr */
- } WINDOW;
-
- /*
- * 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. */
- /*
- * This structure contains how a row is constructed. pvr
- */
-
- typedef struct ROW_FMT {
- uchar r_type; /* format type nibbles */
- uchar r_size; /* format size: must be 0,1,3,7,15, etc */
- uchar r_units; /* number of units per window row: must be 1,2,4,8,16*/
- uchar r_bytes; /* number of bytes per window row: must be 1,2,4,8,16*/
- uchar r_align; /* number of bytes per align row: must be 1,2,4,8,16*/
- uchar r_b_per_u; /* number of bytes per unit: must be 1,2,4,8,16 */
- uchar r_chr_per_u; /* displayed chars per unit */
- bits r_flags; /* flags controlling format */
- char *r_unit_fmt; /* print format for unit */
- char *r_pos_fmt; /* print format for buffer position, always a long */
- char *r_byte_fmt; /* print format for bytes */
- uchar *r_positions; /* list of unit positions */
- struct ROW_FMT *r_srch_fmt; /* pointer to search display format */
- } ROW_FMT;
-
- /* legal values for 'r_size' (values significant; used as bit mask) pvr */
-
- #define BYTES 0x00 /* Display as byte; 8 bits */
- #define WORDS 0x01 /* Display as word; 16 bits */
- #define DWORDS 0x03 /* Display as doubles; 32 bits */
-
- /* legal values for 'r_type' pvr */
- #define ASCII 0x10 /* Display as ascii */
- #define OCTAL 0x20 /* Display as octal values */
- #define DECIMAL 0x30 /* Display as decimal values */
- #define HEX 0x40 /* Display as hex values */
- #define BINARY 0x50 /* Display as binary values */
- #define EBCDIC 0x60 /* Display as ebcdic */
- #define TEXT 0x70 /* Display as normal text */
-
- /*
- * 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 {
- bits buf_type; /* Type of buffer */
- struct BUFFER *b_bufp; /* Link to next BUFFER */
- struct LINE *b_dotp; /* Link to "." LINE structure */
- int b_doto; /* Offset of "." in above LINE */
- char b_unit_offset; /* Offset into unit for "." pvr */
- struct LINE *b_markp; /* The same as the above two, */
- int b_marko; /* but for the "mark" */
- struct LINE *b_linep; /* Link to the header LINE */
- char b_nwnd; /* Count of windows on buffer */
- bits b_flag; /* Flags */
- A32 b_begin_addr; /* File address of begining of buffer */
- A32 b_end_addr; /* File address of end of buffer */
- A32 b_file_size; /* Size of file */
- char b_fname[NFILEN]; /* File name */
- char b_bname[NBUFN]; /* Buffer name */
- } BUFFER;
-
- /* Values for 'buf_type' */
- #define BFILE 0x00 /* Buffer contains a file */
- #define BDISK 0x01 /* Buffer points to a disk */
- #define BMEMORY 0x02 /* Buffer points to memory */
- #define INMEM 0x04 /* File is entirely in memory */
-
- /* Values for 'b_flag' */
-
- #define BFCHG 0x01 /* Changed. */
- #define BFBAK 0x02 /* Need to make a backup. */
- #define BFBAD 0x04 /* may be trashed alloc error? */
- #define BFSAV 0x08 /* saved buffer from save-region */
- #define BFNWL 0x10 /* append newline to this buffer */
- #define BFVIEW 0x20 /* read only (jam) */
- #define BFLINK 0x40 /* Linked mode pvr */
- #define BFSLOCK 0x80 /* Lock buffer size pvr */
- /*
- * 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.
- * There have been some complaints that the short in this
- * structure is wrong; that a long would be more appropriate.
- * I'll await more comments from the folks with the little
- * machines; I have a VAX, and everything fits.
- */
- typedef struct reg {
- struct LINE *r_linep; /* Origin LINE address. */
- int r_offset; /* Origin LINE offset. */
- int r_size; /* Length in characters. */
- } REGION;
-
- /*
- * 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 */
- A32 l_file_offset; /* Offset from begining of file pvr */
- int l_size; /* Allocated size */
- int l_used; /* Used size */
- #if PCC
- char l_text[1]; /* A bunch of characters. */
- #else
- char l_text[]; /* A bunch of characters. */
- #endif
- } 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) ((lp)->l_text[(n)]&0xFF)
- #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
- #define llength(lp) ((lp)->l_used)
-
- /*
- * Externals.
- */
- extern int thisflag;
- extern int lastflag;
- extern int curgoal;
- extern int epresf;
- extern int sgarbf;
- extern WINDOW *curwp;
- extern BUFFER *curbp;
- extern WINDOW *wheadp;
- extern BUFFER *bheadp;
- extern BUFFER *blistp;
- extern short kbdm[];
- extern short *kbdmip;
- extern short *kbdmop;
- extern char pat[];
- extern SYMBOL *symbol[];
- extern SYMBOL *binding[];
- extern BUFFER *bfind();
- extern BUFFER *bcreate();
- extern WINDOW *wpopup();
- extern LINE *lalloc();
- extern int nrow;
- extern int ncol;
- extern char version[];
- extern int ttrow;
- extern int ttcol;
- extern int tceeol;
- extern int tcinsl;
- extern int tcdell;
- extern char cinfo[];
- extern SYMBOL *symlookup();
- extern int nmsg;
- extern int curmsgf;
- extern int newmsgf;
- extern char msg[];
-
- /* jam
- */
- extern char *okmsg;
- extern int insert_mode;
- extern int extend_buf;
- extern int flush_num;
- extern int auto_update;
- extern int flush_count;
- extern int rowb;
- extern char file_off_bad;
-
- /*
- * Standard I/O.
- */
- extern char *malloc();
- extern char *strcpy();
- extern char *strcat();
-