|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.