Annotation of coherent/g/usr/bin/me/ed.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * This file is the general header file for all parts of the MicroEMACS
        !             3:  * display editor.  It contains definitions used by everyone, and it
        !             4:  * contains the stuff you have to edit to create a version of the editor for
        !             5:  * a specific operating system and terminal.
        !             6:  */
        !             7: #ifdef COHERENT
        !             8: #define        V7      1                       /* V7 UN*X or Coherent          */
        !             9: #define        VMS     0                       /* VAX/VMS                      */
        !            10: #define        CPM     0                       /* CP/M-86                      */
        !            11: #define        MSDOS   0                       /* MS-DOS                       */
        !            12: #define        GEM     0                       /* GEMDOS                       */
        !            13: #define        PROMPT  " Coherent MicroEMACS -- "
        !            14: #define ANSI   0
        !            15: #define VT52   0                       /* VT52 terminal (Zenith).      */
        !            16: #define        VT100   1                       /* Handle VT100 style keypad.   */
        !            17: #define        LK201   0                       /* Handle LK201 style keypad.   */
        !            18: #define        RAINBOW 0                       /* Use Rainbow fast video.      */
        !            19: #define TERMCAP 0                      /* Use TERMCAP                  */
        !            20: #define TERMNFO 1                      /* Use TERMINFO                 */
        !            21: #define        NATIVE  0                       /* Native ATARI ST screen       */
        !            22: #define        EXKEYS  0                       /* Extended keys                */
        !            23: #endif
        !            24: 
        !            25: #ifdef GEMDOS
        !            26: #define        V7      0                       /* V7 UN*X or Coherent          */
        !            27: #define        VMS     0                       /* VAX/VMS                      */
        !            28: #define        CPM     0                       /* CP/M-86                      */
        !            29: #define        GEM     1                       /* GEMDOS                       */
        !            30: #define        MSDOS   0                       /* MS-DOS                       */
        !            31: #define        UPPERNM 0                       /* if 0 names in all lower case */
        !            32: #define        PROMPT  " ST MicroEMACS 1.8 -- "
        !            33: #define ANSI   0
        !            34: #define VT52   0                       /* VT52 terminal (Zenith).      */
        !            35: #define        VT100   0                       /* Handle VT100 style keypad.   */
        !            36: #define        LK201   0                       /* Handle LK201 style keypad.   */
        !            37: #define        RAINBOW 0                       /* Use Rainbow fast video.      */
        !            38: #define TERMCAP 0                      /* Use TERMCAP                  */
        !            39: #define TERMNFO 0                      /* Use TERMINFO                 */
        !            40: #define        NATIVE  1                       /* Native ATARI ST screen       */
        !            41: #define        EXKEYS  1                       /* Extended keys                */
        !            42: #endif
        !            43: 
        !            44: #if    MSDOS
        !            45: #define        V7      0                       /* V7 UN*X or Coherent          */
        !            46: #define        VMS     0                       /* VAX/VMS                      */
        !            47: #define        CPM     0                       /* CP/M-86                      */
        !            48: #define        GEM     0                       /* GEMDOS                       */
        !            49: #define        PROMPT  " DOS MicroEMACS V4.0.16 -- "
        !            50: #ifndef        IBM
        !            51: #define        ANSI    1                       /* Use ANSI.SYS                 */
        !            52: #else
        !            53: #define ANSI   0                       /* don't use ANSI.SYS           */
        !            54: #endif
        !            55: #define VT52   0                       /* VT52 terminal (Zenith).      */
        !            56: #define        VT100   0                       /* Handle VT100 style keypad.   */
        !            57: #define        LK201   0                       /* Handle LK201 style keypad.   */
        !            58: #define        RAINBOW 0                       /* Use Rainbow fast video.      */
        !            59: #define TERMCAP 0                      /* Use TERMCAP                  */
        !            60: #define TERMNFO 0                      /* Use TERMINFO                 */
        !            61: #define        NATIVE  0                       /* Native ATARI ST screen       */
        !            62: #define        EXKEYS  1                       /* Extended keys                */
        !            63: #endif
        !            64: 
        !            65: #ifndef        PROMPT
        !            66: #define        PROMPT  " MicroEMACS -- "
        !            67: #endif
        !            68: 
        !            69: /* 
        !            70:  * NORMAL_CHARS will be 1 when the ctype.h problems are solved
        !            71:  * for internationalization or when international characters are
        !            72:  * not required.
        !            73:  */
        !            74: #define NORMAL_CHARS 0
        !            75: 
        !            76: #define        CVMVAS  1                       /* C-V, M-V arg. in screens.    */
        !            77: #define        LIBHELP 1                       /* Use help stuff               */
        !            78: 
        !            79: #define  MAXMAC 10                     /* Max # of macros bound to keybindings */
        !            80: #define  MAXREB 50                     /* Size of rebind table */
        !            81: #define  HASHP  41                     /* Prime for hashing main table */
        !            82: #define         BINDID ((MAXREB << 8) ^ (HASHP << 4) ^ MAXMAC)
        !            83: #define        NCFILES 5                       /* Max # of files on command line */
        !            84: #define        NFILEN  80                      /* # of bytes, file name        */
        !            85: #define        NBUFN   16                      /* # of bytes, buffer name      */
        !            86: #define        NLINE   256                     /* # of bytes, line             */
        !            87: #define        NKBDM   256                     /* # of strokes, keyboard macro */
        !            88: #define        NPAT    80                      /* # of bytes, pattern          */
        !            89: #define        HUGE    1000                    /* Huge number                  */
        !            90: #define        NSRCH   128                     /* undoable search command len  */
        !            91: #define        ERRLINES 3                      /* error window lines displayed */
        !            92: 
        !            93: #define        AGRAVE  0x60                    /* M- prefix,   Grave (LK201)   */
        !            94: #define        METACH  0x1B                    /* M- prefix,   Control-[, ESC  */
        !            95: #define        CTMECH  0x1C                    /* C-M- prefix, Control-\       */
        !            96: #define        EXITCH  0x1D                    /* Exit level,  Control-]       */
        !            97: #define        CTRLCH  0x1E                    /* C- prefix,   Control-^       */
        !            98: #define        HELPCH  0x1F                    /* Help key,    Control-_       */
        !            99: 
        !           100: #define        FALSE   0                       /* False, no, bad, etc.         */
        !           101: #define        TRUE    1                       /* True, yes, good, etc.        */
        !           102: #define        ABORT   2                       /* Death, ^G, abort, etc.       */
        !           103: 
        !           104: #define        FIOSUC  0                       /* File I/O, success.           */
        !           105: #define        FIOFNF  1                       /* File I/O, file not found.    */
        !           106: #define        FIOEOF  2                       /* File I/O, end of file.       */
        !           107: #define        FIOERR  3                       /* File I/O, error.             */
        !           108: 
        !           109: #define        CFCPCN  0x0001                  /* Last command was C-P, C-N    */
        !           110: #define        CFKILL  0x0002                  /* Last command was a kill      */
        !           111: 
        !           112: 
        !           113: #if    EXKEYS
        !           114: /*
        !           115:  * The following codes should be bound to the function keys in the system
        !           116:  * specific keyboard handling (mostly in termio.c).
        !           117:  *
        !           118:  * When used in the key table in main.c, the same functions should be
        !           119:  * available through other key sequences.
        !           120:  */
        !           121: #define        FN0     0x80                    /* Function key 0       */
        !           122: #define        FN1     0x81                    /* Function key 1       */
        !           123: #define        FN2     0x82                    /* Function key 2       */
        !           124: #define        FN3     0x83                    /* Function key 3       */
        !           125: #define        FN4     0x84                    /* Function key 4       */
        !           126: #define        FN5     0x85                    /* Function key 5       */
        !           127: #define        FN6     0x86                    /* Function key 6       */
        !           128: #define        FN7     0x87                    /* Function key 7       */
        !           129: #define        FN8     0x88                    /* Function key 8       */
        !           130: #define        FN9     0x89                    /* Function key 9       */
        !           131: #define        FNA     0x8A                    /* Function key 10      */
        !           132: #define        FNB     0x8B                    /* Function key 11      */
        !           133: #define        FNC     0x8C                    /* Function key 12      */
        !           134: #define        FND     0x8D                    /* Function key 13      */
        !           135: #define        FNE     0x8E                    /* Function key 14      */
        !           136: #define        FNF     0x8F                    /* Function key 15      */
        !           137: #define        FN10    0x90                    /* Function key 16      */
        !           138: #define        FN11    0x91                    /* Function key 17      */
        !           139: #define        FN12    0x92                    /* Function key 18      */
        !           140: #define        FN13    0x93                    /* Function key 19      */
        !           141: #define        FN14    0x94                    /* Function key 20      */
        !           142: #define        FN15    0x95                    /* Function key 21      */
        !           143: #define        FN16    0x96                    /* Function key 22      */
        !           144: #define        FN17    0x97                    /* Function key 23      */
        !           145: #define        FN18    0x98                    /* Function key 24      */
        !           146: #define        FN19    0x99                    /* Function key 25      */
        !           147: #define        FN1A    0x9A                    /* Function key 26      */
        !           148: #define        FN1B    0x9B                    /* Function key 27      */
        !           149: #define        FN1C    0x9C                    /* Function key 28      */
        !           150: #define        FN1D    0x9D                    /* Function key 29      */
        !           151: #define        FN1E    0x9E                    /* Function key 30      */
        !           152: #define        FN1F    0x9F                    /* Function key 31      */
        !           153: #endif
        !           154: 
        !           155: #define        CTRL    0x0100                  /* Control flag, or'ed in       */
        !           156: #define        META    0x0200                  /* Meta flag, or'ed in          */
        !           157: #define        PFX1    0x0400                  /* prefix 1 flag, or'ed in      */
        !           158: #define        PFX2    0x0800                  /* prefix 2 flag, or'ed in      */
        !           159: #define        PFX3    0x1000                  /* prefix 3 flag, or'ed in      */
        !           160: #define OBND   0x2000                  /* original binding only        */
        !           161: 
        !           162: typedef unsigned char uchar;
        !           163: 
        !           164: /*
        !           165:  * Key bindings point into a function table which
        !           166:  * contains function names.
        !           167:  */
        !           168: typedef struct KEYTAB KEYTAB;
        !           169: struct KEYTAB {
        !           170:        short   k_code;                 /* Key code                     */
        !           171:        char    k_fun;          /* Function number */
        !           172:        char    k_synonym;      /* Next at this hash value */
        !           173: };
        !           174: 
        !           175: typedef struct FUNTAB FUNTAB;
        !           176: struct FUNTAB {
        !           177:        int     (*f_fp)();              /* Routine to handle it */
        !           178: };
        !           179: 
        !           180: /*
        !           181:  * flexable bindings data.
        !           182:  */
        !           183: typedef struct BIND {
        !           184:        KEYTAB  table[MAXREB];          /* overlay keybind table        */
        !           185:        uchar   *macs[MAXMAC + 2];      /* list of kbd macros           */
        !           186:        short   maclen[MAXMAC + 2];     /* lengths of kbd macros        */
        !           187:        short   pfx1;                   /* prefix 1 char                */
        !           188:        short   pfx2;                   /* prefix 2 char                */
        !           189:        short   pfx3;                   /* prefix 3 char                */
        !           190:        short   repeat;                 /* repeat argument char         */
        !           191:        int     ffold;                  /* Fold Flag                    */
        !           192:        int     fillcol;                /* Current fill column          */
        !           193:        int     bracket;                /* Bracket Mode switch          */
        !           194:        int     tabsiz;                 /* tabsize                      */
        !           195:        int     tabsize;                /* Tab size (0: use real tabs)  */
        !           196:        int     autoindent;             /* Autoindent                   */
        !           197:        int     dispmode;               /* display char < ' ' directly  */
        !           198: } BIND;
        !           199: extern BIND bind;
        !           200: 
        !           201: /*
        !           202:  * There is a window structure allocated for every active display window.
        !           203:  * The windows are kept in a big list, in top to bottom screen order, with
        !           204:  * the listhead at "wheadp".  Each window contains its own values of dot and
        !           205:  * mark.  The flag field contains some bits that are set by commands to guide
        !           206:  * redisplay; although this is a bit of a compromise in terms of decoupling,
        !           207:  * the full blown redisplay is just too expensive to run for every input
        !           208:  * character. 
        !           209:  */
        !           210: typedef        struct  WINDOW {
        !           211:        struct  WINDOW *w_wndp;         /* Next window                  */
        !           212:        struct  BUFFER *w_bufp;         /* Buffer displayed in window   */
        !           213:        struct  LINE *w_linep;          /* Top line in the window       */
        !           214:        struct  LINE *w_dotp;           /* Line containing "."          */
        !           215:        short   w_doto;                 /* Byte offset for "."          */
        !           216:        struct  LINE *w_markp;          /* Line containing "mark"       */
        !           217:        short   w_marko;                /* Byte offset for "mark"       */
        !           218:        char    w_toprow;               /* Origin 0 top row of window   */
        !           219:        char    w_ntrows;               /* # of rows of text in window  */
        !           220:        char    w_force;                /* If NZ, forcing row.          */
        !           221:        char    w_flag;                 /* Flags.                       */
        !           222: }      WINDOW;
        !           223: 
        !           224: #define        WFFORCE 0x01                    /* Window needs forced reframe  */
        !           225: #define        WFMOVE  0x02                    /* Movement from line to line   */
        !           226: #define        WFEDIT  0x04                    /* Editing within a line        */
        !           227: #define        WFHARD  0x08                    /* Better to a full display     */
        !           228: #define        WFMODE  0x10                    /* Update mode line.            */
        !           229: 
        !           230: /*
        !           231:  * Text is kept in buffers. A buffer header, described
        !           232:  * below, exists for every buffer in the system. The buffers are
        !           233:  * kept in a big list, so that commands that search for a buffer by
        !           234:  * name can find the buffer header. There is a safe store for the
        !           235:  * dot and mark in the header, but this is only valid if the buffer
        !           236:  * is not being displayed (that is, if "b_nwnd" is 0). The text for
        !           237:  * the buffer is kept in a circularly linked list of lines, with
        !           238:  * a pointer to the header line in "b_linep".
        !           239:  */
        !           240: typedef        struct  BUFFER {
        !           241:        struct  BUFFER *b_bufp;         /* Link to next BUFFER          */
        !           242:        struct  LINE *b_dotp;           /* Link to "." LINE structure   */
        !           243:        short   b_doto;                 /* Offset of "." in above LINE  */
        !           244:        struct  LINE *b_markp;          /* The same as the above two,   */
        !           245:        short   b_marko;                /* but for the "mark"           */
        !           246:        struct  LINE *b_linep;          /* Link to the header LINE      */
        !           247:        char    b_nwnd;                 /* Count of windows on buffer   */
        !           248:        char    b_flag;                 /* Flags                        */
        !           249:        uchar   b_fname[NFILEN];        /* File name                    */
        !           250:        uchar   b_bname[NBUFN];         /* Buffer name                  */
        !           251: }      BUFFER;
        !           252: 
        !           253: #define        BFTEMP  0x01                    /* Internal temporary buffer    */
        !           254: #define        BFCHG   0x02                    /* Changed since last write     */
        !           255: #define        BFERROR 0x04                    /* Error file buffer            */
        !           256: #define        BFNOWRT 0x08                    /* Don't write this buffer      */
        !           257: #define        BFBACKP 0x10                    /* Rename file before write     */
        !           258: #define        BFWRITE 0x20                    /* Written since read           */
        !           259: #define        BFTRUNC 0x40                    /* File truncated               */
        !           260: #define        BFHELP  0x80                    /* Buffer is a help buffer      */
        !           261: 
        !           262: /*
        !           263:  * The starting position of a
        !           264:  * region, and the size of the region in
        !           265:  * characters, is kept in a region structure.
        !           266:  * Used by the region commands.
        !           267:  */
        !           268: typedef        struct  {
        !           269:        struct  LINE *r_linep;          /* Origin LINE address.         */
        !           270:        short   r_offset;               /* Origin LINE offset.          */
        !           271:        short   r_size;                 /* Length in characters.        */
        !           272: }      REGION;
        !           273: 
        !           274: /*
        !           275:  * All text is kept in circularly linked
        !           276:  * lists of "LINE" structures. These begin at the
        !           277:  * header line (which is the blank line beyond the
        !           278:  * end of the buffer). This line is pointed to by
        !           279:  * the "BUFFER". Each line contains a the number of
        !           280:  * bytes in the line (the "used" size), the size
        !           281:  * of the text array, and the text. The end of line
        !           282:  * is not stored as a byte; its implied. Future
        !           283:  * additions will include update hints, and a
        !           284:  * list of marks into the line.
        !           285:  */
        !           286: typedef        struct  LINE {
        !           287:        struct  LINE *l_fp;             /* Link to the next line        */
        !           288:        struct  LINE *l_bp;             /* Link to the previous line    */
        !           289:        short   l_size;                 /* Allocated size               */
        !           290:        short   l_used;                 /* Used size                    */
        !           291:        long    l_lnumber;              /* Line number in original file */
        !           292:        uchar   l_text[];               /* A bunch of characters.       */
        !           293: }      LINE;
        !           294: 
        !           295: #define        lforw(lp)       ((lp)->l_fp)
        !           296: #define        lback(lp)       ((lp)->l_bp)
        !           297: #define        lgetc(lp, n)    ((lp)->l_text[(n)]&0xFF)
        !           298: #define        lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
        !           299: #define        llength(lp)     ((lp)->l_used)
        !           300: #define        l_number(lp)    ((lp)->l_lnumber)
        !           301: /*
        !           302:  * The editor communicates with the display
        !           303:  * using a high level interface. A "TERM" structure
        !           304:  * holds useful variables, and indirect pointers to
        !           305:  * routines that do useful operations. The low level get
        !           306:  * and put routines are here too. This lets a terminal,
        !           307:  * in addition to having non standard commands, have
        !           308:  * funny get and put character code too. The calls
        !           309:  * might get changed to "termp->t_field" style in
        !           310:  * the future, to make it possible to run more than
        !           311:  * one terminal type.
        !           312:  */  
        !           313: typedef        struct  {
        !           314:        short   t_nrow;                 /* Number of rows.              */
        !           315:        short   t_ncol;                 /* Number of columns.           */
        !           316:        int     (*t_open)();            /* Open terminal at the start.  */
        !           317:        int     (*t_close)();           /* Close terminal at end.       */
        !           318:        int     (*t_getchar)();         /* Get character from keyboard. */
        !           319:        int     (*t_putchar)();         /* Put character to display.    */
        !           320:        int     (*t_flush)();           /* Flush output buffers.        */
        !           321:        int     (*t_move)();            /* Move the cursor, origin 0.   */
        !           322:        int     (*t_eeol)();            /* Erase to end of line.        */
        !           323:        int     (*t_eeop)();            /* Clear screen                 */
        !           324:        int     (*t_beep)();            /* Beep.                        */
        !           325:        int     (*t_stand)();           /* Standout mode.               */
        !           326: }      TERM;
        !           327: 
        !           328: /* Shorthand for terminal routines...  */
        !           329: #define        tputc(X)        (*term.t_putchar)(X)    /* Put a character      */
        !           330: #define        tgetc           (*term.t_getchar)       /* Get a character      */
        !           331: #define        tbeep           (*term.t_beep)          /* Beep the bell        */
        !           332: #define        tstand(X)       (*term.t_stand)(X)      /* Standout mode        */
        !           333: #define        topen           (*term.t_open)          /* Open the terminal    */
        !           334: #define        tclose          (*term.t_close)         /* Close the terminal   */
        !           335: #define        tmove(X,Y)      (*term.t_move)((X),(Y)) /* Move cursor          */
        !           336: #define        teeol           (*term.t_eeol)          /* Erase to end of line */
        !           337: #define        teeop           (*term.t_eeop)          /* Clear screen         */
        !           338: #define        tflush          (*term.t_flush)         /* Flush output buff    */
        !           339: 
        !           340: /* Command line switch flags -- set in runswitch       */
        !           341: #define        CF_ERROR        (0x0001)        /* Error edit switch specified  */
        !           342: #define        CF_WARN         (0x0004)        /* Warn user before overwrite   */
        !           343: #define CF_GRABMEM     (0x0008)        /* GEM grab memory              */
        !           344: #define        CF_VLONG        (0x2000)        /* Very long screen flag        */
        !           345: #define        CF_LONGSCR      (0x4000)        /* Long screen flag             */
        !           346: #define        CF_DEBUG        (0x8000)        /* Debugging flag               */
        !           347: 
        !           348: #define taber(c) ((c) += ((bind.tabsiz - (c % bind.tabsiz)) - 1))
        !           349: 
        !           350: extern unsigned int runswitch;         /* Switch flags                 */
        !           351: 
        !           352: extern int     currow;                 /* Cursor row                   */
        !           353: extern int     curcol;                 /* Cursor column                */
        !           354: extern int     thisflag;               /* Flags, this command          */
        !           355: extern int     lastflag;               /* Flags, last command          */
        !           356: extern int     curgoal;                /* Goal for C-P, C-N            */
        !           357: extern int     mpresf;                 /* Stuff in message line        */
        !           358: extern int     sgarbf;                 /* State of screen unknown      */
        !           359: extern WINDOW  *curwp;                 /* Current window               */
        !           360: extern BUFFER  *curbp;                 /* Current buffer               */
        !           361: extern WINDOW  *wheadp;                /* Head of list of windows      */
        !           362: extern BUFFER  *bheadp;                /* Head of list of buffers      */
        !           363: extern BUFFER  *blistp;                /* Buffer for C-X C-B           */
        !           364: #if    LIBHELP
        !           365: extern BUFFER  *helpbp;                /* Buffer for help              */
        !           366: #endif
        !           367: extern BUFFER  *errbp;                 /* Error file buffer            */
        !           368: extern short   *kbdm;                  /* Holds kayboard macro data    */
        !           369: extern short   *kbdmip;                /* Input pointer for above      */
        !           370: extern short   *kbdmop;                /* Output pointer for above     */
        !           371: extern uchar   pat[];                  /* Search pattern               */
        !           372: extern TERM    term;                   /* Terminal information.        */
        !           373: extern uchar   *ufiles[];              /* command-line specified files */
        !           374: extern uchar   errfile[];              /* error file name              */
        !           375: #if    LIBHELP
        !           376: extern uchar   hfname[];               /* Help file name buffer        */
        !           377: extern uchar   hiname[];               /* Help index name buffer       */
        !           378: extern uchar   *helpfile;              /* Help file name               */
        !           379: extern uchar   *helpindex;             /* Help index file name         */
        !           380: #endif
        !           381: extern BUFFER  *bfind();               /* Lookup a buffer by name      */
        !           382: extern WINDOW  *wpopup();              /* Pop up window creation       */
        !           383: extern LINE    *lalloc();              /* Allocate a line              */
        !           384: 
        !           385: extern KEYTAB keytab[];
        !           386: extern FUNTAB funtab[];
        !           387: 
        !           388: /* A major optimization for native GEMDOS situations...        */
        !           389: #if    GEM && NATIVE
        !           390: #undef tputc
        !           391: extern long    bios();
        !           392: #define        tputc(X)        bios(3, 2, (X)) /* Faster output                */
        !           393: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.