|
|
1.1 ! root 1: /*************************************************************************** ! 2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE * ! 3: * is provided to you without charge, and with no warranty. You may give * ! 4: * away copies of JOVE, including sources, provided that this notice is * ! 5: * included in all the files. * ! 6: ***************************************************************************/ ! 7: ! 8: /* jove.h header file to be included by EVERYONE */ ! 9: ! 10: ! 11: #include <setjmp.h> ! 12: ! 13: #ifndef TUNED ! 14: # include "tune.h" ! 15: #endif ! 16: ! 17: #ifndef MAC ! 18: # include <sys/types.h> ! 19: #else ! 20: # include <types.h> ! 21: #endif ! 22: ! 23: ! 24: #ifdef MSDOS ! 25: #include <string.h> ! 26: #endif ! 27: ! 28: ! 29: #if !(defined(MSDOS) || defined(MAC)) ! 30: #define void int ! 31: #endif ! 32: ! 33: #if !(defined(IBMPC) || defined(MAC)) ! 34: # define TERMCAP ! 35: # define ASCII ! 36: #endif ! 37: ! 38: #ifdef ASCII /* seven bit characters */ ! 39: # define NCHARS 0200 ! 40: #else ! 41: # define NCHARS 0400 ! 42: #endif ! 43: #define CHARMASK (NCHARS -1) ! 44: ! 45: #define private static ! 46: ! 47: #ifndef BSD4_2 ! 48: # ifdef MENLO_JCL ! 49: # ifndef EUNICE ! 50: # define signal sigset ! 51: # endif ! 52: # endif /* MENLO_JCL */ ! 53: #endif ! 54: ! 55: #define EOF -1 ! 56: ! 57: #ifdef MSDOS ! 58: # define NULL ((char *)0) ! 59: # define NIL ((char *)0) ! 60: #else ! 61: # ifdef MAC ! 62: # define NULL 0L ! 63: # define NIL 0L ! 64: # else ! 65: # define NULL 0 ! 66: # define NIL 0 ! 67: # endif /* MAC */ ! 68: #endif /* MSDOS */ ! 69: /* kinds of regular expression compiles */ ! 70: #define NORM 0 /* nothing special */ ! 71: #define OKAY_RE 1 /* allow regular expressions */ ! 72: #define IN_CB 2 /* in curly brace; implies OKAY_RE */ ! 73: ! 74: /* return codes for command completion (all < 0 because >= 0 are ! 75: legitimate offsets into array of strings */ ! 76: ! 77: #define AMBIGUOUS -2 /* matches more than one at this point */ ! 78: #define UNIQUE -3 /* matches only one string */ ! 79: #define ORIGINAL -4 /* matches no strings at all! */ ! 80: #define NULLSTRING -5 /* just hit return without typing anything */ ! 81: ! 82: /* values for the `flags' argument to complete */ ! 83: #define NOTHING 0 /* opposite of RET_STATE */ ! 84: #define RET_STATE 1 /* return state when we hit return */ ! 85: #define RCOMMAND 2 /* we are reading a joverc file */ ! 86: #define CASEIND 4 /* map all to lower case */ ! 87: ! 88: #define SAVE 01 /* this macro needs saving to a file */ ! 89: ! 90: #define LBSIZE BUFSIZ /* same as a logical disk block */ ! 91: #ifndef MSDOS ! 92: #define FILESIZE 256 ! 93: #else /* MSDOS */ ! 94: #define FILESIZE 64 ! 95: #endif /* MSDOS */ ! 96: ! 97: #define FORWARD 1 ! 98: #define BACKWARD -1 ! 99: ! 100: #define CTL(c) (c & 037) ! 101: #define META(c) (c | 0200) ! 102: #define RUBOUT '\177' ! 103: #define LF CTL('J') ! 104: #define CR CTL('M') ! 105: #define BS CTL('H') ! 106: #define ESC '\033' ! 107: ! 108: #define HALF(wp) ((wp->w_height - 1) / 2) ! 109: #define IsModified(b) (b->b_modified) ! 110: #define SIZE(wp) (wp->w_height - 1) ! 111: #define SavLine(a, b) (a->l_dline = putline(b)) ! 112: #define SetLine(line) DotTo(line, 0) ! 113: #define bobp() (firstp(curline) && bolp()) ! 114: #define bolp() (curchar == 0) ! 115: #define eobp() (lastp(curline) && eolp()) ! 116: #define eolp() (linebuf[curchar] == '\0') ! 117: #define firstp(line) (line == curbuf->b_first) ! 118: #define getDOT() getline(curline->l_dline, linebuf) ! 119: #define isdirty(line) (line->l_dline & DIRTY) ! 120: #define lastp(line) (line == curbuf->b_last) ! 121: #define makedirty(line) line->l_dline |= DIRTY ! 122: #define one_windp() (fwind->w_next == fwind) ! 123: ! 124: #define CharUpcase(c) (CaseEquiv[c]) ! 125: ! 126: extern int BufSize; ! 127: ! 128: #define ARG_CMD 1 ! 129: #define LINECMD 2 ! 130: #define KILLCMD 3 /* so we can merge kills */ ! 131: #define YANKCMD 4 /* so we can do ESC Y (yank-pop) */ ! 132: ! 133: /* Buffer type */ ! 134: ! 135: #define B_SCRATCH 1 /* for internal things, e.g. minibuffer ... */ ! 136: #define B_FILE 2 /* normal file (We Auto-save these.) */ ! 137: #define B_PROCESS 3 /* process output in this buffer */ ! 138: ! 139: /* Major modes */ ! 140: #define FUNDAMENTAL 0 /* Fundamental mode */ ! 141: #define TEXT 1 /* Text mode */ ! 142: #define CMODE 2 /* C mode */ ! 143: #ifdef LISP ! 144: # define LISPMODE 3 /* Lisp mode */ ! 145: # define NMAJORS 4 ! 146: #else ! 147: # define NMAJORS 3 ! 148: #endif ! 149: ! 150: /* Minor Modes */ ! 151: #define Indent (1 << 0) /* indent same as previous line after return */ ! 152: #define ShowMatch (1 << 1) /* paren flash mode */ ! 153: #define Fill (1 << 2) /* text fill mode */ ! 154: #define OverWrite (1 << 3) /* over write mode */ ! 155: #define Abbrev (1 << 4) /* abbrev mode */ ! 156: ! 157: #define BufMinorMode(b, x) (b->b_minor & x) ! 158: ! 159: #define MinorMode(x) BufMinorMode(curbuf, x) ! 160: #define MajorMode(x) (curbuf->b_major == x) ! 161: #define SetMajor(x) ((curbuf->b_major = x), UpdModLine = YES) ! 162: ! 163: extern char CharTable[NMAJORS][NCHARS]; ! 164: extern char CaseEquiv[NCHARS]; ! 165: ! 166: /* setjmp/longjmp args for DoKeys() mainjmp */ ! 167: #define FIRSTCALL 0 ! 168: #define ERROR 1 ! 169: #define COMPLAIN 2 /* do the error without a getDOT */ ! 170: #define QUIT 3 /* leave this level of recursion */ ! 171: ! 172: #define QUIET 1 /* sure, why not? */ ! 173: ! 174: #define YES 1 ! 175: #define NO 0 ! 176: #define TRUE 1 ! 177: #define FALSE 0 ! 178: #define ON 1 ! 179: #define OFF 0 ! 180: #define YES_NODIGIT 2 ! 181: ! 182: #define INT_OKAY 0 ! 183: #define INT_BAD -1 ! 184: ! 185: extern char *Mainbuf, ! 186: *HomeDir, /* home directory */ ! 187: key_strokes[], /* strokes that make up current command */ ! 188: *Inputp; ! 189: ! 190: extern int HomeLen; /* length of home directory */ ! 191: ! 192: extern char NullStr[]; ! 193: ! 194: #if defined(VMUNIX)||defined(MSDOS) ! 195: extern char genbuf[LBSIZE], ! 196: linebuf[LBSIZE], ! 197: iobuff[LBSIZE]; ! 198: #else ! 199: extern char *genbuf, /* scratch pad points at s_genbuf (see main()) */ ! 200: *linebuf, /* points at s_linebuf */ ! 201: *iobuff; /* for file reading ... points at s_iobuff */ ! 202: #endif ! 203: ! 204: extern int InJoverc, ! 205: Interactive; ! 206: ! 207: #define READ 0 ! 208: #define WRITE 1 ! 209: extern int errno; ! 210: ! 211: extern jmp_buf mainjmp; ! 212: ! 213: #ifdef IPROCS ! 214: typedef struct process Process; ! 215: #endif ! 216: typedef struct window Window; ! 217: typedef struct position Bufpos; ! 218: typedef struct mark Mark; ! 219: typedef struct buffer Buffer; ! 220: typedef struct line Line; ! 221: typedef struct iobuf IOBUF; ! 222: typedef struct data_obj { ! 223: int Type; ! 224: char *Name; ! 225: } data_obj; /* points to cmd, macro, or variable */ ! 226: ! 227: typedef data_obj *keymap[NCHARS]; ! 228: ! 229: struct line { ! 230: Line *l_prev, /* pointer to prev */ ! 231: *l_next; /* pointer to next */ ! 232: disk_line l_dline; /* pointer to disk location */ ! 233: }; ! 234: ! 235: #ifdef IPROCS ! 236: struct process { ! 237: Process *p_next; ! 238: #ifdef PIPEPROCS ! 239: int p_toproc, /* read p_fromproc and write p_toproc */ ! 240: p_portpid, /* pid of child (the portsrv) */ ! 241: p_pid; /* pid of real child i.e. not portsrv */ ! 242: #else ! 243: int p_fd, /* file descriptor of pty? opened r/w */ ! 244: p_pid; /* pid of child (the shell) */ ! 245: #endif ! 246: Buffer *p_buffer; /* add output to end of this buffer */ ! 247: char *p_name; /* ... */ ! 248: char p_state, /* State */ ! 249: p_howdied, /* Killed? or Exited? */ ! 250: p_reason; /* If signaled, p_reason is the signal; else ! 251: it is the the exit code */ ! 252: Mark *p_mark; /* where output left us */ ! 253: data_obj ! 254: *p_cmd; /* command to call when process dies */ ! 255: }; ! 256: #endif /* IPROCS */ ! 257: ! 258: struct window { ! 259: Window *w_prev, /* circular list */ ! 260: *w_next; ! 261: Buffer *w_bufp; /* buffer associated with this window */ ! 262: Line *w_top, /* top line */ ! 263: *w_line; /* current line */ ! 264: int w_char, ! 265: w_height, /* window height */ ! 266: w_topnum, /* line number of the topline */ ! 267: w_dotcol, /* UpdWindow sets this ... */ ! 268: w_dotline, /* ... and this */ ! 269: w_flags, ! 270: #define W_TOPGONE 01 ! 271: #define W_CURGONE 02 /* topline (curline) of window has been deleted ! 272: since the last time a redisplay was called */ ! 273: #define W_VISSPACE 04 ! 274: #define W_NUMLINES 010 ! 275: w_LRscroll; /* amount of LeftRight scrolling in window */ ! 276: #ifdef MAC ! 277: int w_topline; /* row number of top line in window */ ! 278: char **w_control; /* scroll bar for window */ ! 279: #endif ! 280: }; ! 281: ! 282: extern Window *fwind, /* first window in list */ ! 283: *curwind; /* current window */ ! 284: ! 285: struct position { ! 286: Line *p_line; ! 287: int p_char; ! 288: }; ! 289: ! 290: struct mark { ! 291: Line *m_line; ! 292: int m_char; ! 293: Mark *m_next; /* list of marks */ ! 294: #define M_FIXED 00 ! 295: #define M_FLOATER 01 ! 296: #define M_BIG_DELETE 02 ! 297: char m_flags; /* FLOATERing mark? */ ! 298: }; ! 299: ! 300: struct buffer { ! 301: #ifdef MAC ! 302: int Type; /* kludge... to look like a data_obj */ ! 303: char *Name; /* Name will not be used */ ! 304: #endif ! 305: Buffer *b_next; /* next buffer in chain */ ! 306: char *b_name, /* buffer name */ ! 307: *b_fname; /* file name associated with buffer */ ! 308: dev_t b_dev; /* device of file name. */ ! 309: ino_t b_ino; /* inode of file name */ ! 310: time_t b_mtime; /* last modify time ... ! 311: to detect two people writing ! 312: to the same file */ ! 313: Line *b_first, /* pointer to first line in list */ ! 314: *b_dot, /* current line */ ! 315: *b_last; /* last line in list */ ! 316: int b_char; /* current character in line */ ! 317: ! 318: #define NMARKS 8 /* number of marks in the ring */ ! 319: ! 320: Mark *b_markring[NMARKS], /* new marks are pushed here */ ! 321: *b_marks; /* all the marks for this buffer */ ! 322: char b_themark, /* current mark (in b_markring) */ ! 323: b_type, /* file, scratch, process, iprocess */ ! 324: b_ntbf, /* needs to be found when we ! 325: first select? */ ! 326: b_modified; /* is the buffer modified? */ ! 327: int b_major, /* major mode */ ! 328: b_minor; /* and minor mode */ ! 329: keymap *b_keybinds; /* local bindings (if any) */ ! 330: #ifdef IPROCS ! 331: Process *b_process; /* process we're attached to */ ! 332: #endif ! 333: }; ! 334: ! 335: struct macro { ! 336: int Type; /* in this case a macro */ ! 337: char *Name; /* name is always second ... */ ! 338: int m_len, /* length of macro so we can use ^@ */ ! 339: m_buflen, /* memory allocated for it */ ! 340: m_flags; ! 341: char *m_body; /* actual body of the macro */ ! 342: struct macro ! 343: *m_nextm; ! 344: }; ! 345: ! 346: struct variable { ! 347: int Type; /* in this case a variable */ ! 348: char *Name; /* name is always second */ ! 349: int *v_value, ! 350: v_flags; ! 351: }; ! 352: ! 353: struct cmd { ! 354: int Type; ! 355: char *Name; ! 356: #ifdef MAC ! 357: void (*c_proc)(); ! 358: #else ! 359: int (*c_proc)(); ! 360: #endif ! 361: #ifdef MAC ! 362: char c_map; /* prefix map for About Jove... */ ! 363: char c_key; /* key binding for About Jove... */ ! 364: #endif ! 365: }; ! 366: ! 367: extern keymap mainmap, /* various key maps */ ! 368: pref1map, ! 369: pref2map, ! 370: miscmap; ! 371: #ifdef MAC /* used in About Jove... */ ! 372: #define F_MAINMAP '\001' ! 373: #define F_PREF1MAP '\002' ! 374: #define F_PREF2MAP '\003' ! 375: #endif ! 376: ! 377: extern data_obj *LastCmd; /* last command invoked */ ! 378: ! 379: extern char *ProcFmt; ! 380: ! 381: extern struct cmd commands[]; ! 382: extern struct macro *macros; ! 383: extern struct variable variables[]; ! 384: ! 385: extern struct macro ! 386: *macstack[], ! 387: KeyMacro; ! 388: ! 389: #define FUNCTION 1 ! 390: #define VARIABLE 2 ! 391: #define MACRO 3 ! 392: #ifdef MAC ! 393: # define BUFFER 6 /* menus can point to buffers, too */ ! 394: # define STRING 7 /* a menu string or divider */ ! 395: #endif ! 396: ! 397: #define TYPEMASK 07 ! 398: #define MAJOR_MODE 010 ! 399: #define MINOR_MODE 020 ! 400: #define DefMajor(x) (FUNCTION|MAJOR_MODE|(x << 8)) ! 401: #define DefMinor(x) (FUNCTION|MINOR_MODE|(x << 8)) ! 402: ! 403: extern Buffer *world, /* first buffer */ ! 404: *curbuf; /* pointer into world for current buffer */ ! 405: ! 406: #define curline curbuf->b_dot ! 407: #define curchar curbuf->b_char ! 408: ! 409: #define NUMKILLS 10 /* number of kills saved in the kill ring */ ! 410: ! 411: #ifdef MAC /* when doing ~DIRTY, we need high bits set */ ! 412: # define DIRTY (disk_line) 01 /* just needs updating for some reason */ ! 413: #else ! 414: # define DIRTY 01 /* just needs updating for some reason */ ! 415: #endif ! 416: #define MODELINE 02 /* this is a modeline */ ! 417: #define L_MOD 04 /* this line has been modified internally */ ! 418: ! 419: struct scrimage { ! 420: int s_offset, /* offset to start printing at */ ! 421: s_flags, /* various flags */ ! 422: s_id, /* which buffer line */ ! 423: s_vln; /* Visible Line Number */ ! 424: Line *s_lp; /* so we can turn off red bit */ ! 425: Window *s_window; /* window that contains this line */ ! 426: }; ! 427: ! 428: extern struct scrimage ! 429: *DesiredScreen, /* what we want */ ! 430: *PhysScreen; /* what we got */ ! 431: ! 432: /* Variable flags (that can be set). */ ! 433: #define V_BASE10 01 /* is integer in base 10 */ ! 434: #define V_BASE8 02 /* is integer in base 8 */ ! 435: #define V_BOOL 04 /* is a boolean */ ! 436: #define V_STRING 010 /* is a string */ ! 437: #define V_CHAR 020 /* is a character */ ! 438: #define V_FILENAME 040 /* a file name (implies V_STRING) */ ! 439: #define V_TYPEMASK 077 /* mask off the extra bits */ ! 440: #define V_MODELINE 0100 /* update modeline */ ! 441: #define V_CLRSCREEN 0200 /* clear and redraw screen */ ! 442: #define V_TTY_RESET 0400 /* redo the tty modes */ ! 443: ! 444: #ifdef MAC ! 445: #ifdef TXT_TO_C ! 446: int /* kludge, so setmaps will compile with variables */ ! 447: #else ! 448: extern int ! 449: #endif /* TXT_TO_C */ ! 450: #else ! 451: extern int ! 452: #endif /* MAC */ ! 453: ! 454: OKXonXoff, /* disable start/stop characters */ ! 455: MetaKey, /* this terminal has a meta key */ ! 456: VisBell, /* use visible bell (if possible) */ ! 457: WrapScan, /* make searches wrap */ ! 458: #ifndef MAC ! 459: phystab, /* terminal's tabstop settings */ ! 460: #endif ! 461: tabstop, /* expand tabs to this number of spaces */ ! 462: #ifdef BACKUPFILES ! 463: BkupOnWrite, /* make backup files when writing */ ! 464: #endif ! 465: RMargin, /* right margin */ ! 466: LMargin, /* left margin */ ! 467: ScrollStep, /* how should we scroll */ ! 468: #ifndef MAC ! 469: WtOnMk, /* write files on compile-it command */ ! 470: #endif ! 471: EndWNewline, /* end files with a blank line */ ! 472: MarkThresh, /* moves greater than MarkThresh will SetMark */ ! 473: PDelay, /* paren flash delay in tenths of a second */ ! 474: CIndIncrmt, /* how much each indentation level pushes ! 475: over in C mode */ ! 476: CreatMode, /* default mode for creat'ing files */ ! 477: CaseIgnore, /* case ignore search */ ! 478: #ifdef ABBREV ! 479: AutoCaseAbbrev, /* automatically do case on abbreviations */ ! 480: #endif ! 481: MarksShouldFloat, /* adjust marks on insertion/deletion */ ! 482: UseRE, /* use regular expressions in search */ ! 483: SyncFreq, /* how often to sync the file pointers */ ! 484: BriteMode, /* make the mode line inverse? */ ! 485: OkayBadChars, /* allow bad characters in files created ! 486: by JOVE */ ! 487: UpdFreq, /* how often to update modeline */ ! 488: UseBuffers, /* use buffers with Typeout() */ ! 489: #ifdef BIFF ! 490: BiffChk, /* turn off/on biff with entering/exiting jove */ ! 491: #endif ! 492: MailInt, /* mail check interval */ ! 493: #ifdef ID_CHAR ! 494: UseIC, /* whether or not to use i/d char ! 495: processesing */ ! 496: #endif ! 497: SExitChar, /* type this to stop i-search */ ! 498: AbortChar, /* cancels command input */ ! 499: IntChar, /* ttysets this to generate QUIT */ ! 500: DoEVexpand, /* treat $foo as environment variable */ ! 501: #ifdef F_COMPLETION ! 502: DispBadFs, /* display filenames with bad extensions? */ ! 503: #endif ! 504: #ifdef IBMPC ! 505: Fgcolor, ! 506: Bgcolor, ! 507: Mdcolor, ! 508: #endif /* IBMPC */ ! 509: #ifdef F_COMPLETION ! 510: DispBadFs, /* display filenames with bad extensions? */ ! 511: #endif ! 512: ScrollAll, /* we current line scrolls, scroll whole window? */ ! 513: #ifndef MAC ! 514: EWSize; /* size to make the error window */ ! 515: #else ! 516: Macmode, /* see mac.c */ ! 517: Keyonly, ! 518: Bufchange, ! 519: Modechange, ! 520: Windchange, ! 521: EventCmd; ! 522: #endif /* MAC */ ! 523: ! 524: #ifdef MAC ! 525: # ifdef TXT_TO_C /* kludge, for setmaps with variables */ ! 526: char ! 527: # else ! 528: extern char ! 529: # endif /* TXT_TO_C */ ! 530: #else ! 531: extern char ! 532: #endif /* MAC */ ! 533: ! 534: #ifndef MAC ! 535: ErrFmtStr[256], /* format string for parse errors */ ! 536: #endif ! 537: #ifdef IPROCS ! 538: proc_prompt[128], /* process prompt */ ! 539: #endif ! 540: #ifdef F_COMPLETION ! 541: BadExtensions[128], /* extensions (e.g., ".o" to ignore) */ ! 542: #endif ! 543: #ifdef CMT_FMT ! 544: CmtFmt[80], ! 545: #endif ! 546: ModeFmt[120], /* mode line format string */ ! 547: #ifdef UNIX ! 548: Mailbox[FILESIZE], /* mailbox name */ ! 549: #endif /* UNIX */ ! 550: TmpFilePath[FILESIZE], /* directory/device to store tmp files */ ! 551: TagFile[FILESIZE], /* default tag file */ ! 552: Shell[FILESIZE]; /* shell to use */ ! 553: ! 554: extern int ! 555: TOabort, /* flag set by Typeout() */ ! 556: io, /* file descriptor for reading and writing files */ ! 557: errormsg, /* last message was an error message ! 558: so don't erase the error before it ! 559: has been read */ ! 560: this_cmd, /* ... */ ! 561: last_cmd, /* last command ... to implement appending ! 562: to kill buffer */ ! 563: RecDepth, /* recursion depth */ ! 564: InputPending, /* nonzero if there is input waiting to ! 565: be processed */ ! 566: killptr, /* index into killbuf */ ! 567: CanScroll, /* can this terminal scroll? */ ! 568: Crashing, /* we are in the middle of crashing */ ! 569: Asking, /* are we on read a string from the terminal? */ ! 570: inIOread; /* so we know whether we can do a redisplay. */ ! 571: ! 572: extern char Minibuf[LBSIZE]; ! 573: ! 574: #define curmark (curbuf->b_markring[curbuf->b_themark]) ! 575: #define b_curmark(b) (b->b_markring[b->b_themark]) ! 576: ! 577: extern Line *killbuf[NUMKILLS]; /* array of pointers to killed stuff */ ! 578: ! 579: #define MESG_SIZE 128 ! 580: extern char mesgbuf[MESG_SIZE]; ! 581: ! 582: struct screenline { ! 583: char *s_line, ! 584: *s_length; ! 585: }; ! 586: ! 587: extern int ! 588: LastKeyStruck; ! 589: ! 590: extern int ! 591: InMacDefine, /* are we defining a macro right now? */ ! 592: ! 593: CapLine, /* cursor line and cursor column */ ! 594: CapCol, ! 595: ! 596: UpdModLine, /* whether we want to update the mode line */ ! 597: UpdMesg; /* update the message line */ ! 598: ! 599: #define CATCH \ ! 600: {\ ! 601: jmp_buf sav_jmp; \ ! 602: \ ! 603: push_env(sav_jmp); \ ! 604: if (setjmp(mainjmp) == 0) { ! 605: ! 606: #define ONERROR \ ! 607: } else { \ ! 608: ! 609: #define ENDCATCH \ ! 610: } \ ! 611: pop_env(sav_jmp); \ ! 612: } ! 613: ! 614: #include "externs.h"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.