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