|
|
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.