[BACK]Return to def.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

Annotation of src/usr.bin/mg/def.h, Revision 1.2

1.1       deraadt     1: /*
                      2:  * This file is the general header file for all parts
                      3:  * of the MicroEMACS display editor. It contains all of the
                      4:  * general definitions and macros. It also contains some
                      5:  * conditional compilation flags. All of the per-system and
                      6:  * per-terminal definitions are in special header files.
                      7:  * The most common reason to edit this file would be to zap
                      8:  * the definition of CVMVAS or BACKUP.
                      9:  */
                     10: #include       "sysdef.h"              /* Order is critical.           */
                     11: #include       "ttydef.h"
                     12: #include       "chrdef.h"
                     13:
                     14: /*
                     15:  * If your system and/or compiler does not support the "void" type
                     16:  * then define NO_VOID_TYPE in sysdef.h.  In the absence of some
                     17:  * other definition for VOID, the default in that case will be to
                     18:  * turn it into an int, which works with most compilers that don't
                     19:  * support void.  In the absence of any definition of VOID or
                     20:  * NO_VOID_TYPE, the default is to assume void is supported, which
                     21:  * should be the case for most modern C compilers.
                     22:  */
                     23:
                     24: #ifdef NO_VOID_TYPE
                     25: #  undef VOID
                     26: #  define VOID int                     /* Default for no void is int */
                     27: #else
                     28: #ifndef VOID
                     29: #  define VOID void                    /* Just use normal void */
                     30: #endif /* VOID */
                     31: #endif /* NO_VOID_TYPE */
                     32:
                     33: #ifdef NO_MACRO
                     34: #ifndef NO_STARTUP
                     35: #define NO_STARTUP                     /* NO_MACRO implies NO_STARTUP */
                     36: #endif
                     37: #endif
                     38:
                     39: typedef int (*PF)();                   /* generaly useful type */
                     40:
                     41: /*
                     42:  * Table sizes, etc.
                     43:  */
                     44: #define NFILEN 80                      /* Length, file name.           */
                     45: #define NBUFN  24                      /* Length, buffer name.         */
                     46: #define NLINE  256                     /* Length, line.                */
                     47: #define PBMODES 4                      /* modes per buffer             */
                     48: #define NKBDM  256                     /* Length, keyboard macro.      */
                     49: #define NPAT   80                      /* Length, pattern.             */
                     50: #define HUGE   1000                    /* A rather large number.       */
                     51: #define NSRCH  128                     /* Undoable search commands.    */
                     52: #define NXNAME 64                      /* Length, extended command.    */
                     53: #define NKNAME 20                      /* Length, key names            */
                     54: /*
                     55:  * Universal.
                     56:  */
                     57: #define FALSE  0                       /* False, no, bad, etc.         */
                     58: #define TRUE   1                       /* True, yes, good, etc.        */
                     59: #define ABORT  2                       /* Death, ^G, abort, etc.       */
                     60:
                     61: #define KPROMPT 2                      /* keyboard prompt              */
                     62:
                     63: /*
                     64:  * These flag bits keep track of
                     65:  * some aspects of the last command. The CFCPCN
                     66:  * flag controls goal column setting. The CFKILL
                     67:  * flag controls the clearing versus appending
                     68:  * of data in the kill buffer.
                     69:  */
                     70: #define CFCPCN 0x0001                  /* Last command was C-P, C-N    */
                     71: #define CFKILL 0x0002                  /* Last command was a kill      */
                     72: #define CFINS  0x0004                  /* Last command was self-insert */
                     73:
                     74: /*
                     75:  * File I/O.
                     76:  */
                     77: #define FIOSUC 0                       /* Success.                     */
                     78: #define FIOFNF 1                       /* File not found.              */
                     79: #define FIOEOF 2                       /* End of file.                 */
                     80: #define FIOERR 3                       /* Error.                       */
                     81: #define FIOLONG 4                      /* long line partially read     */
                     82:
                     83: /*
                     84:  * Directory I/O.
                     85:  */
                     86: #define DIOSUC 0                       /* Success.                     */
                     87: #define DIOEOF 1                       /* End of file.                 */
                     88: #define DIOERR 2                       /* Error.                       */
                     89:
                     90: /*
                     91:  * Display colors.
                     92:  */
                     93: #define CNONE  0                       /* Unknown color.               */
                     94: #define CTEXT  1                       /* Text color.                  */
                     95: #define CMODE  2                       /* Mode line color.             */
                     96:
                     97: /* Flags for keyboard involked functions */
                     98:
                     99: #define FFUNIV         1               /* universal argument           */
                    100: #define FFNEGARG       2               /* negitive only argument       */
                    101: #define FFOTHARG       4               /* other argument               */
                    102: #define FFARG          7               /* any argument                 */
                    103: #define FFRAND         8               /* Called by other function     */
                    104:
                    105: /*
                    106:  * Flags for "eread".
                    107:  */
                    108: #define EFFUNC 0x0001                  /* Autocomplete functions.      */
                    109: #define EFBUF  0x0002                  /* Autocomplete buffers.        */
                    110: #define EFFILE 0x0004                  /* " files (maybe someday)      */
                    111: #define EFAUTO 0x0007                  /* Some autocompleteion on      */
                    112: #define EFNEW  0x0008                  /* New prompt.                  */
                    113: #define EFCR   0x0010                  /* Echo CR at end; last read.   */
                    114:
                    115: /*
                    116:  * Flags for "ldelete"/"kinsert"
                    117:  */
                    118:
                    119: #define KNONE  0
                    120: #define KFORW  1
                    121: #define KBACK  2
                    122:
                    123: /*
                    124:  * All text is kept in circularly linked
                    125:  * lists of "LINE" structures. These begin at the
                    126:  * header line (which is the blank line beyond the
                    127:  * end of the buffer). This line is pointed to by
                    128:  * the "BUFFER". Each line contains a the number of
                    129:  * bytes in the line (the "used" size), the size
                    130:  * of the text array, and the text. The end of line
                    131:  * is not stored as a byte; it's implied. Future
                    132:  * additions will include update hints, and a
                    133:  * list of marks into the line.
                    134:  */
                    135: typedef struct LINE {
                    136:        struct  LINE *l_fp;             /* Link to the next line        */
                    137:        struct  LINE *l_bp;             /* Link to the previous line    */
                    138:        int     l_size;                 /* Allocated size               */
                    139:        int     l_used;                 /* Used size                    */
                    140: #ifndef ZEROARRAY
                    141:        char    l_text[1];              /* A bunch of characters.       */
                    142: #else
                    143:        char    l_text[];               /* A bunch of characters.       */
                    144: #endif
                    145: }      LINE;
                    146:
                    147: /*
                    148:  * The rationale behind these macros is that you
                    149:  * could (with some editing, like changing the type of a line
                    150:  * link from a "LINE *" to a "REFLINE", and fixing the commands
                    151:  * like file reading that break the rules) change the actual
                    152:  * storage representation of lines to use something fancy on
                    153:  * machines with small address spaces.
                    154:  */
                    155: #define lforw(lp)      ((lp)->l_fp)
                    156: #define lback(lp)      ((lp)->l_bp)
                    157: #define lgetc(lp, n)   (CHARMASK((lp)->l_text[(n)]))
                    158: #define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
                    159: #define llength(lp)    ((lp)->l_used)
                    160: #define ltext(lp)      ((lp)->l_text)
                    161:
                    162: /*
                    163:  * All repeated structures are kept as linked lists of structures.
                    164:  * All of these start with a LIST structure (except lines, which
                    165:  * have their own abstraction). This will allow for
                    166:  * later conversion to generic list manipulation routines should
                    167:  * I decide to do that. it does mean that there are four extra
                    168:  * bytes per window. I feel that this is an acceptable price,
                    169:  * considering that there are usually only one or two windows.
                    170:  */
                    171: typedef struct LIST {
                    172:        union {
                    173:                struct WINDOW   *l_wp;
                    174:                struct BUFFER   *x_bp;  /* l_bp is used by LINE */
                    175:                struct LIST     *l_nxt;
                    176:        } l_p;
                    177:        char    *l_name;
                    178: } LIST;
                    179: /*
                    180:  * Usual hack - to keep from uglifying the code with lotsa
                    181:  * references through the union, we #define something for it.
                    182:  */
                    183: #define l_next l_p.l_nxt
                    184:
                    185: /*
                    186:  * There is a window structure allocated for
                    187:  * every active display window. The windows are kept in a
                    188:  * big list, in top to bottom screen order, with the listhead at
                    189:  * "wheadp". Each window contains its own values of dot and mark.
                    190:  * The flag field contains some bits that are set by commands
                    191:  * to guide redisplay; although this is a bit of a compromise in
                    192:  * terms of decoupling, the full blown redisplay is just too
                    193:  * expensive to run for every input character.
                    194:  */
                    195: typedef struct WINDOW {
                    196:        LIST    w_list;                 /* List header                 */
                    197:        struct  BUFFER *w_bufp;         /* Buffer displayed in window   */
                    198:        struct  LINE *w_linep;          /* Top line in the window       */
                    199:        struct  LINE *w_dotp;           /* Line containing "."          */
                    200:        struct  LINE *w_markp;          /* Line containing "mark"       */
                    201:        int     w_doto;                 /* Byte offset for "."          */
                    202:        int     w_marko;                /* Byte offset for "mark"       */
                    203:        char    w_toprow;               /* Origin 0 top row of window   */
                    204:        char    w_ntrows;               /* # of rows of text in window  */
                    205:        char    w_force;                /* If NZ, forcing row.          */
                    206:        char    w_flag;                 /* Flags.                       */
                    207: }      WINDOW;
                    208: #define w_wndp w_list.l_p.l_wp
                    209: #define w_name w_list.l_name
                    210:
                    211: /*
                    212:  * Window flags are set by command processors to
                    213:  * tell the display system what has happened to the buffer
                    214:  * mapped by the window. Setting "WFHARD" is always a safe thing
                    215:  * to do, but it may do more work than is necessary. Always try
                    216:  * to set the simplest action that achieves the required update.
                    217:  * Because commands set bits in the "w_flag", update will see
                    218:  * all change flags, and do the most general one.
                    219:  */
                    220: #define WFFORCE 0x01                   /* Force reframe.               */
                    221: #define WFMOVE 0x02                    /* Movement from line to line.  */
                    222: #define WFEDIT 0x04                    /* Editing within a line.       */
                    223: #define WFHARD 0x08                    /* Better to a full display.    */
                    224: #define WFMODE 0x10                    /* Update mode line.            */
                    225:
                    226: /*
                    227:  * Text is kept in buffers. A buffer header, described
                    228:  * below, exists for every buffer in the system. The buffers are
                    229:  * kept in a big list, so that commands that search for a buffer by
                    230:  * name can find the buffer header. There is a safe store for the
                    231:  * dot and mark in the header, but this is only valid if the buffer
                    232:  * is not being displayed (that is, if "b_nwnd" is 0). The text for
                    233:  * the buffer is kept in a circularly linked list of lines, with
                    234:  * a pointer to the header line in "b_linep".
                    235:  */
                    236: typedef struct BUFFER {
                    237:        LIST    b_list;                 /* buffer list pointer          */
                    238:        struct  BUFFER *b_altb;         /* Link to alternate buffer     */
                    239:        struct  LINE *b_dotp;           /* Link to "." LINE structure   */
                    240:        struct  LINE *b_markp;          /* ditto for mark               */
                    241:        struct  LINE *b_linep;          /* Link to the header LINE      */
                    242:        struct  MAPS_S *b_modes[PBMODES]; /* buffer modes               */
                    243:        int     b_doto;                 /* Offset of "." in above LINE  */
                    244:        int     b_marko;                /* ditto for the "mark"         */
                    245:        short   b_nmodes;               /* number of non-fundamental modes */
                    246:        char    b_nwnd;                 /* Count of windows on buffer   */
                    247:        char    b_flag;                 /* Flags                        */
                    248:        char    b_fname[NFILEN];        /* File name                    */
                    249:        struct  fileinfo b_fi;          /* File attributes              */
                    250: }      BUFFER;
                    251: #define b_bufp b_list.l_p.x_bp
                    252: #define b_bname b_list.l_name
                    253:
                    254: #define BFCHG  0x01                    /* Changed.                     */
                    255: #define BFBAK  0x02                    /* Need to make a backup.       */
                    256: #ifdef NOTAB
                    257: #define BFNOTAB 0x04                   /* no tab mode                  */
                    258: #endif
                    259: #define BFOVERWRITE 0x08               /* overwrite mode               */
                    260:
                    261: /*
                    262:  * This structure holds the starting position
                    263:  * (as a line/offset pair) and the number of characters in a
                    264:  * region of a buffer. This makes passing the specification
                    265:  * of a region around a little bit easier.
                    266:  */
                    267: typedef struct {
                    268:        struct  LINE *r_linep;          /* Origin LINE address.         */
                    269:        int     r_offset;               /* Origin LINE offset.          */
                    270:        RSIZE   r_size;                 /* Length in characters.        */
                    271: }      REGION;
                    272:
                    273: /*
                    274:  * Externals.
                    275:  */
                    276: extern int     thisflag;
                    277: extern int     lastflag;
                    278: extern int     curgoal;
                    279: extern int     epresf;
                    280: extern int     sgarbf;
                    281: extern int     mode;
                    282: extern WINDOW  *curwp;
                    283: extern BUFFER  *curbp;
                    284: extern WINDOW  *wheadp;
                    285: extern BUFFER  *bheadp;
                    286: extern char    pat[];
                    287: extern BUFFER  *bfind();
                    288: extern WINDOW  *popbuf();
                    289: extern WINDOW  *wpopup();
                    290: extern LINE    *lalloc();
                    291: extern LINE    *lallocx();
                    292: extern VOID    ewprintf();
                    293: extern int     nrow;
                    294: extern int     ncol;
                    295: extern int     ttrow;
                    296: extern int     ttcol;
                    297: extern int     tceeol;
                    298: extern int     tcinsl;
                    299: extern int     tcdell;
                    300: extern char    cinfo[];
                    301: extern char    *keystrings[];
                    302: extern VOID    update();
                    303: extern char    *keyname();
                    304: extern char    *adjustname();
                    305: extern VOID    kdelete();
                    306: extern VOID    lchange();