1: /************************************************************************* 2: * This program is copyright (C) 1985, 1986 by Jonathan Payne. It is * 3: * provided to you without charge for use only on a licensed Unix * 4: * system. You may copy JOVE provided that this notice is included with * 5: * the copy. You may not sell copies of this program or versions * 6: * modified for use on microcomputer systems, unless the copies are * 7: * included with a Unix system distribution and the source is provided. * 8: *************************************************************************/ 9: 10: /* jove.h header file to be included by EVERYONE */ 11: 12: #include <setjmp.h> 13: #include <sys/types.h> 14: 15: #ifndef TUNED 16: # include "tune.h" 17: #endif 18: 19: #define private static 20: 21: #ifndef BSD4_2 22: # ifdef MENLO_JCL 23: # ifndef EUNICE 24: # define signal sigset 25: # endif 26: # endif MENLO_JCL 27: #endif 28: 29: #define EOF -1 30: #define NULL 0 31: #define NIL 0 32: 33: /* kinds of regular expression compiles */ 34: #define NORM 0 /* nothing special */ 35: #define OKAY_RE 1 /* allow regular expressions */ 36: #define IN_CB 2 /* in curly brace; implies OKAY_RE */ 37: 38: /* return codes for command completion (all < 0 because >= 0 are 39: legitimate offsets into array of strings */ 40: 41: #define AMBIGUOUS -2 /* matches more than one at this point */ 42: #define UNIQUE -3 /* matches only one string */ 43: #define ORIGINAL -4 /* matches no strings at all! */ 44: #define NULLSTRING -5 /* just hit return without typing anything */ 45: 46: /* values for the `flags' argument to complete */ 47: #define NOTHING 0 /* opposite of RET_STATE */ 48: #define RET_STATE 1 /* return state when we hit return */ 49: #define RCOMMAND 2 /* we are reading a joverc file */ 50: 51: #define DEFINE 01 /* defining this macro */ 52: #define EXECUTE 02 /* executing this macro */ 53: #define SAVE 04 /* this macro needs saving to a file */ 54: 55: #define LBSIZE BUFSIZ /* same as a logical disk block */ 56: #define FILESIZE 256 57: 58: #define FORWARD 1 59: #define BACKWARD -1 60: 61: #define CTL(c) ('c' & 037) 62: #define META(c) ('c' | 0200) 63: #define RUBOUT '\177' 64: #define LF CTL(J) 65: #define CR CTL(M) 66: #define BS CTL(H) 67: #define ESC `\033' 68: 69: #define DoTimes(f, n) exp_p = 1, exp = n, f 70: #define HALF(wp) ((wp->w_height - 1) / 2) 71: #define IsModified(b) (b->b_modified) 72: #define SIZE(wp) (wp->w_height - 1) 73: #define SavLine(a, b) (a->l_dline = putline(b)) 74: #define SetLine(line) DotTo(line, 0) 75: #define bobp() (firstp(curline) && bolp()) 76: #define bolp() (curchar == 0) 77: #define eobp() (lastp(curline) && eolp()) 78: #define eolp() (linebuf[curchar] == '\0') 79: #define firstp(line) (line == curbuf->b_first) 80: #define getDOT() getline(curline->l_dline, linebuf) 81: #define isdirty(line) (line->l_dline & DIRTY) 82: #define lastp(line) (line == curbuf->b_last) 83: #define makedirty(line) line->l_dline |= DIRTY 84: #define one_windp() (fwind->w_next == fwind) 85: 86: extern int OkayAbort, /* okay to abort redisplay */ 87: BufSize; 88: 89: #define ARG_CMD 1 90: #define LINECMD 2 91: #define KILLCMD 3 /* so we can merge kills */ 92: #define YANKCMD 4 /* so we can do ESC Y (yank-pop) */ 93: 94: /* Buffer type */ 95: 96: #define B_SCRATCH 1 /* for internal things, e.g. minibuffer ... */ 97: #define B_FILE 2 /* normal file (We Auto-save these.) */ 98: #define B_PROCESS 3 /* process output in this buffer */ 99: #define B_IPROCESS 4 /* interactive process attached to this buffer */ 100: 101: /* Major modes */ 102: #define FUNDAMENTAL 0 /* Fundamental mode */ 103: #define TEXT 1 /* Text mode */ 104: #define CMODE 2 /* C mode */ 105: #ifdef LISP 106: # define LISPMODE 3 /* Lisp mode */ 107: # define NMAJORS 4 108: #else 109: # define NMAJORS 3 110: #endif 111: 112: /* Minor Modes */ 113: #define Indent (1 << 0) /* indent same as previous line after return */ 114: #define ShowMatch (1 << 1) /* paren flash mode */ 115: #define Fill (1 << 2) /* text fill mode */ 116: #define OverWrite (1 << 3) /* over write mode */ 117: #define Abbrev (1 << 4) /* abbrev mode */ 118: 119: #define BufMinorMode(b, x) (b->b_minor & x) 120: 121: #define MinorMode(x) BufMinorMode(curbuf, x) 122: #define MajorMode(x) (curbuf->b_major == x) 123: #define SetMajor(x) ((curbuf->b_major = x), UpdModLine++) 124: 125: extern char CharTable[NMAJORS][128]; 126: 127: /* setjmp/longjmp args for DoKeys() mainjmp */ 128: #define FIRSTCALL 0 129: #define ERROR 1 130: #define COMPLAIN 2 /* do the error without a getDOT */ 131: #define QUIT 3 /* leave this level of recusion */ 132: 133: #define QUIET 1 /* sure, why not? */ 134: 135: #define YES 1 136: #define NO 0 137: #define TRUE 1 138: #define FALSE 0 139: #define ON 1 140: #define OFF 0 141: 142: extern char *Mainbuf, 143: *HomeDir, /* home directory */ 144: key_strokes[], /* strokes that make up current command */ 145: *Inputp; 146: 147: extern int HomeLen; /* length of home directory */ 148: 149: extern char NullStr[]; 150: 151: #ifdef VMUNIX 152: extern char genbuf[LBSIZE], 153: linebuf[LBSIZE], 154: iobuff[LBSIZE]; 155: #else 156: extern char *genbuf, /* scratch pad points at s_genbuf (see main()) */ 157: *linebuf, /* points at s_linebuf */ 158: *iobuff; /* for file reading ... points at s_iobuff */ 159: #endif 160: 161: extern int InJoverc, 162: Interactive; 163: 164: #define READ 0 165: #define WRITE 1 166: extern int errno; 167: 168: extern jmp_buf mainjmp; 169: 170: typedef struct window Window; 171: typedef struct position Bufpos; 172: typedef struct mark Mark; 173: typedef struct buffer Buffer; 174: typedef struct line Line; 175: typedef struct iobuf IOBUF; 176: 177: struct line { 178: Line *l_prev, /* pointer to prev */ 179: *l_next; /* pointer to next */ 180: disk_line l_dline; /* pointer to disk location */ 181: }; 182: 183: struct window { 184: Window *w_prev, /* circular list */ 185: *w_next; 186: Buffer *w_bufp; /* buffer associated with this window */ 187: Line *w_top, /* top line */ 188: *w_line; /* current line */ 189: int w_char, 190: w_height, /* window height */ 191: w_topnum, /* line number of the topline */ 192: w_offset, /* currently unused */ 193: w_numlines, /* display line numbervs in this window? */ 194: w_visspace, /* display whitespace visibly? */ 195: w_dotcol, /* UpdWindow sets this ... */ 196: w_dotline, /* ... and this */ 197: w_flags; 198: #define TOPGONE 01 199: #define CURGONE 02 /* topline (curline) of window has been deleted 200: since the last time a redisplay was called */ 201: }; 202: 203: extern Window *fwind, /* first window in list */ 204: *curwind; /* current window */ 205: 206: struct position { 207: Line *p_line; 208: int p_char; 209: }; 210: 211: struct mark { 212: Line *m_line; 213: int m_char; 214: Mark *m_next; /* list of marks */ 215: #define FLOATER 1 216: char m_floater; /* FLOATERing mark? */ 217: }; 218: 219: struct buffer { 220: Buffer *b_next; /* next buffer in chain */ 221: char *b_name, /* buffer name */ 222: *b_fname; /* file name associated with buffer */ 223: ino_t b_ino; /* inode of file name */ 224: time_t b_mtime; /* last modify time ... 225: to detect two people writing 226: to the same file */ 227: Line *b_first, /* pointer to first line in list */ 228: *b_dot, /* current line */ 229: *b_last; /* last line in list */ 230: int b_char; /* current character in line */ 231: 232: #define NMARKS 16 /* number of marks in the ring */ 233: 234: Mark *b_markring[NMARKS], /* new marks are pushed saved here */ 235: *b_marks; /* all the marks for this buffer */ 236: int b_themark; /* current mark */ 237: char b_type, /* file, scratch, process, iprocess */ 238: b_ntbf, /* needs to be found when we 239: first select? */ 240: b_modified; /* is the buffer modified? */ 241: int b_major, /* major mode */ 242: b_minor; /* and minor mode */ 243: }; 244: 245: struct macro { 246: int Type; /* in this case a macro */ 247: char *Name; /* name is always second ... */ 248: int m_len, /* length of macro so we can use ^@ */ 249: m_buflen, /* memory allocated for it */ 250: m_offset, /* index into body for defining and running */ 251: m_flags, /* defining/running this macro? */ 252: m_ntimes; /* number of times to run this macro */ 253: char *m_body; /* actual body of the macro */ 254: struct macro 255: *m_nextm; 256: }; 257: 258: struct variable { 259: int Type; /* in this case a variable */ 260: char *Name; /* name is always second */ 261: int *v_value, 262: v_flags; 263: }; 264: 265: struct cmd { 266: int Type; 267: char *Name; 268: int (*c_proc)(); 269: }; 270: 271: typedef struct data_obj { 272: int Type; 273: char *Name; 274: } data_obj; /* points to cmd, macro, or variable */ 275: 276: extern data_obj 277: *mainmap[], /* various key maps */ 278: *pref1map[], 279: *pref2map[], 280: *miscmap[], 281: *LastCmd; /* Last command invoked */ 282: 283: extern char *ProcFmt; 284: 285: extern struct cmd commands[]; 286: extern struct macro *macros; 287: extern struct variable variables[]; 288: 289: extern struct macro 290: *macstack[], 291: KeyMacro; 292: 293: #define FUNCTION 1 294: #define VARIABLE 2 295: #define MACRO 3 296: #define TYPEMASK 07 297: #define MAJOR_MODE 010 298: #define MINOR_MODE 020 299: #define DefMajor(x) (FUNCTION|MAJOR_MODE|(x << 8)) 300: #define DefMinor(x) (FUNCTION|MINOR_MODE|(x << 8)) 301: 302: extern Buffer *world, /* first buffer */ 303: *curbuf; /* pointer into world for current buffer */ 304: 305: #define NUMKILLS 10 /* number of kills saved in the kill ring */ 306: 307: #define DIRTY 01 /* just needs updating for some reason */ 308: #define MODELINE 02 /* this is a modeline */ 309: #define L_MOD 04 /* this line has been modified internally */ 310: 311: struct scrimage { 312: int s_offset, /* offset to start printing at */ 313: s_flags, /* various flags */ 314: s_id, /* which buffer line */ 315: s_vln; /* Visible Line Number */ 316: Line *s_lp; /* so we can turn off red bit */ 317: Window *s_window; /* window that contains this line */ 318: }; 319: 320: extern struct scrimage 321: *DesiredScreen, /* what we want */ 322: *PhysScreen; /* what we got */ 323: 324: /* Variable flags (that can be set). */ 325: #define V_BASE10 01 /* is integer in base 10 */ 326: #define V_BASE8 02 /* is integer in base 8 */ 327: #define V_BOOL 04 /* is a boolean */ 328: #define V_STRING 010 /* is a string */ 329: #define V_CHAR 020 /* is a character */ 330: #define V_TYPEMASK 037 /* mask off the display bits */ 331: #define V_MODELINE 040 /* update modeline */ 332: #define V_CLRSCREEN 0100 /* clear and redraw screen */ 333: #define V_TTY_RESET 0200 /* redo the tty modes because we may want 334: to change some things */ 335: 336: extern int 337: OKXonXoff, /* disable start/stop characters */ 338: MetaKey, /* this terminal has a meta key */ 339: VisBell, /* use visible bell (if possible) */ 340: WrapScan, /* make searches wrap */ 341: phystab, /* terminal's tabstop settings */ 342: tabstop, /* expand tabs to this number of spaces */ 343: #ifdef BACKUPFILES 344: BkupOnWrite, /* make backup files when writing */ 345: #endif 346: RMargin, /* right margin */ 347: LMargin, /* left margin */ 348: ScrollStep, /* how should we scroll */ 349: WtOnMk, /* write files on compile-it command */ 350: EndWNewline, /* end files with a blank line */ 351: MarkThresh, /* moves greater than MarkThresh 352: will SetMark */ 353: PDelay, /* paren flash delay in tenths of a second */ 354: CIndIncrmt, /* how much each indentation level pushes 355: over in C mode */ 356: CreatMode, /* default mode for creat'ing files */ 357: CaseIgnore, /* case ignore search */ 358: #ifdef ABBREV 359: AutoCaseAbbrev, /* automatically do case on abbreviations */ 360: #endif 361: MarksShouldFloat, /* adjust marks on insertion/deletion */ 362: UseRE, /* use regular expressions in search */ 363: SyncFreq, /* how often to sync the file pointers */ 364: BriteMode, /* make the mode line inverse? */ 365: OkayBadChars, /* allow bad characters in files created 366: by JOVE */ 367: UpdFreq, /* how often to update modeline */ 368: UseBuffers, /* use buffers with Typeout() */ 369: #ifdef BIFF 370: BiffChk, /* turn off/on biff with entering/exiting jove */ 371: #endif 372: MailInt, /* mail check interval */ 373: #ifdef ID_CHAR 374: UseIC, /* whether or not to use i/d char 375: processesing */ 376: SExitChar, /* type this to stop i-search */ 377: #endif 378: EWSize; /* size to make the error window */ 379: 380: extern char 381: #ifdef IPROCS 382: proc_prompt[80], /* process prompt */ 383: #endif 384: #ifdef F_COMPLETION 385: BadExtensions[128], /* extensions (e.g., ".o" to ignore) */ 386: #endif 387: #ifdef CMT_FMT 388: CmtFmt[80], 389: #endif 390: ModeFmt[120], /* mode line format string */ 391: Mailbox[128], /* mailbox name */ 392: TagFile[128], /* default tag file */ 393: Shell[40]; /* shell to use */ 394: 395: extern int 396: exp, /* argument count */ 397: exp_p, /* argument count is supplied */ 398: 399: TOabort, /* flag set by Typeout() */ 400: io, /* file descriptor for reading and writing files */ 401: errormsg, /* last message was an error message 402: so don't erase the error before it 403: has been read */ 404: this_cmd, /* ... */ 405: last_cmd, /* last command ... to implement appending 406: to kill buffer */ 407: RecDepth, /* recursion depth */ 408: InputPending, /* nonzero if there is input waiting to 409: be processed */ 410: killptr, /* index into killbuf */ 411: CanScroll, /* can this terminal scroll? */ 412: Crashing, /* we are in the middle of crashing */ 413: Asking, /* are we on read a string from the terminal? */ 414: inIOread; /* so we know whether we can do a redisplay. */ 415: 416: extern char Minibuf[LBSIZE]; 417: 418: #define curline curbuf->b_dot 419: #define curchar curbuf->b_char 420: 421: #define curmark (curbuf->b_markring[curbuf->b_themark]) 422: #define b_curmark(b) (b->b_markring[b->b_themark]) 423: 424: extern Line *killbuf[NUMKILLS]; /* array of pointers to killed stuff */ 425: 426: #define MESG_SIZE 128 427: extern char mesgbuf[MESG_SIZE]; 428: 429: struct screenline { 430: char *s_line, 431: *s_length; 432: }; 433: 434: extern int 435: LastKeyStruck; 436: 437: extern int 438: stackp, 439: 440: CapLine, /* cursor line and cursor column */ 441: CapCol, 442: 443: UpdModLine, /* whether we want to update the mode line */ 444: UpdMesg; /* update the message line */ 445: 446: #define CATCH \ 447: {\ 448: jmp_buf sav_jmp; \ 449: \ 450: push_env(sav_jmp); \ 451: if (setjmp(mainjmp) == 0) { 452: 453: #define ONERROR \ 454: } else { \ 455: 456: #define ENDCATCH \ 457: } \ 458: pop_env(sav_jmp); \ 459: } 460: 461: extern int 462: read(), 463: write(); 464: getch(); 465: 466: extern time_t time(); 467: extern long lseek(); 468: 469: extern disk_line 470: putline(); 471: 472: extern data_obj 473: *findcom(), 474: *findvar(), 475: *findmac(); 476: 477: extern Line 478: *next_line(), 479: *prev_line(), 480: *nbufline(), 481: *reg_delete(), 482: *lastline(), 483: *listput(); 484: 485: extern char 486: *getsearch(), 487: *pwd(), 488: *itoa(), 489: *get_time(), 490: *copystr(), 491: *basename(), 492: *filename(), 493: *getblock(), 494: *IOerr(), 495: *index(), 496: *ask(), 497: *do_ask(), 498: *ask_buf(), 499: *ask_file(), 500: *getline(), 501: *lcontents(), 502: *getblock(), 503: *malloc(), 504: *emalloc(), 505: *mktemp(), 506: *realloc(), 507: *ltobuf(), 508: *lbptr(), 509: *rindex(), 510: *getenv(), 511: *tgoto(), 512: *pr_name(), 513: *sprint(), 514: *StrIndex(); 515: 516: extern Bufpos 517: *docompiled(), 518: *dosearch(), 519: *DoYank(), 520: *c_indent(), 521: #ifdef LISP 522: *lisp_indent(), 523: #endif 524: *m_paren(); 525: 526: extern Mark 527: *CurMark(), 528: *MakeMark(); 529: 530: extern Window 531: *windlook(), 532: *windbp(), 533: *div_wind(); 534: 535: extern data_obj 536: **IsPrefix(); 537: 538: extern Buffer 539: *do_find(), 540: *do_select(), 541: *mak_buf(), 542: *buf_exists(), 543: *file_exists(); 544: 545: struct cmd * 546: FindCmd();