-
Notifications
You must be signed in to change notification settings - Fork 1
/
ex.h
583 lines (530 loc) · 18.8 KB
/
ex.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
/*
* This code contains changes by
* Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved.
*
* Conditions 1, 2, and 4 and the no-warranty notice below apply
* to these changes.
*
*
* Copyright (c) 1980, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*
* Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Redistributions of source code and documentation must retain the
* above copyright notice, this list of conditions and the following
* disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed or owned by Caldera
* International, Inc.
* Neither the name of Caldera International, Inc. nor the names of
* other contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
* INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE
* LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* from ex.h 7.7.1.1 (Berkeley) 8/12/86
*
* Sccsid @(#)ex.h 1.57 (gritter) 8/6/05
*/
/*
* Ex version 3 (see exact version in ex_version.c).
*
* Mark Horton, UC Berkeley
* Bill Joy, UC Berkeley
* November 1979
*
* Changes by Gunnar Ritter, Freiburg i. Br., Germany
* May 2000
*
* This file contains most of the declarations common to a large number
* of routines. The file ex_vis.h contains declarations
* which are used only inside the screen editor.
* The file config.h contains parameters which can be diddled per installation.
* The file ex_tune.h contains parameters which should be changed by
* maintainers only.
*
* The declarations relating to the argument list, regular expressions,
* the temporary file data structure used by the editor
* and the data describing terminals are each fairly substantial and
* are kept in the files ex_{argv,re,temp,tty}.h which
* we #include separately.
*
* If you are going to dig into ex, you should look at the outline of the
* distribution of the code into files at the beginning of ex.c and ex_v.c.
* Code which is similar to that of ed is lightly or undocumented in spots
* (e.g. the regular expression code). Newer code (e.g. open and visual)
* is much more carefully documented, and still rough in spots.
*
* Please forward bug reports to
*
* Mark Horton
* Computer Science Division, EECS
* EVANS HALL
* U.C. Berkeley 94704
* (415) 642-4948
* (415) 642-1024 (dept. office)
*
* or to csvax.mark@berkeley on the ARPA-net. I would particularly like to hear
* of additional terminal descriptions you add to the termcap data base.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#ifdef BIT8
#ifndef ISO8859_1
#include <locale.h>
#endif
#endif
#ifdef MB
#include <wchar.h>
#include <wctype.h>
#endif
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#ifndef TIOCGWINSZ
#include <sys/ioctl.h>
#endif
#include "config.h"
typedef void (*shand)(int);
#ifdef signal
#undef signal
#endif
#define signal(a, b) setsig((a), (b))
/*
* Avoid clobbering of automatic variables with an ANSI C compiler.
*/
#define CLOBBGRD(a) (void)(&(a));
#ifndef MB_LEN_MAX
#define MB_LEN_MAX 1
#endif
/*
* Feature dependency checks.
*/
#ifdef ISO8859_1
#ifndef BIT8
#define BIT8
#endif
#endif
#ifndef LISPCODE
#define LISPCODE
#endif
#ifndef CHDIR
#define CHDIR
#endif
#ifndef var
#define var extern
#endif
#ifndef VMUNIX
typedef short line;
#else
typedef int line;
#endif
typedef short bool;
#ifdef LARGEF
typedef off_t bloc;
#else
typedef short bloc;
#endif
#ifdef VMUNIX
#ifdef LARGEF
typedef off_t bbloc;
#else
typedef int bbloc;
#endif
#else
typedef short bbloc;
#endif
/*
* The editor does not normally use the standard i/o library. Because
* we expect the editor to be a heavily used program and because it
* does a substantial amount of input/output processing it is appropriate
* for it to call low level read/write primitives directly. In fact,
* when debugging the editor we use the standard i/o library. In any
* case the editor needs a printf which prints through "putchar" ala the
* old version 6 printf. Thus we normally steal a copy of the "printf.c"
* and "strout" code from the standard i/o library and mung it for our
* purposes to avoid dragging in the stdio library headers, etc if we
* are not debugging. Such a modified printf exists in "printf.c" here.
*/
#ifdef TRACE
# include <stdio.h>
var FILE *trace;
var bool trubble;
var bool techoin;
var char tracbuf[BUFSIZ];
# undef putchar
# undef getchar
#else /* !TRACE */
#ifndef BUFSIZ
#ifdef LINE_MAX
#define BUFSIZ LINE_MAX /* POSIX line size */
#else /* !LINE_MAX */
#ifdef VMUNIX
#define BUFSIZ 1024
#else /* !VMUNIX */
#ifdef u370
#define BUFSIZ 4096
#else /* !u370 */
#define BUFSIZ 512
#endif /* !u370 */
#endif
#endif /* !VMUNIX */
#endif /* !LINE_MAX */
#ifdef NULL
#undef NULL
#endif
#ifdef EOF
#undef EOF
#endif
#ifdef printf
#undef printf
#endif
#ifdef vprintf
#undef vprintf
#endif
#ifdef getchar
#undef getchar
#endif
#ifdef putchar
#undef putchar
#endif
#define NULL 0
#define EOF -1
#endif /* !TRACE */
typedef sigjmp_buf JMP_BUF;
#define SETJMP(a) sigsetjmp(a, 1)
#define LONGJMP(a, b) siglongjmp(a, b)
#undef MAXBSIZE
#define MAXBSIZE (2*LBSIZE)
#include "ex_tune.h"
#include "ex_vars.h"
/*
* Options in the editor are referred to usually by "value(name)" where
* name is all uppercase, i.e. "value(PROMPT)". This is actually a macro
* which expands to a fixed field in a static structure and so generates
* very little code. The offsets for the option names in the structure
* are generated automagically from the structure initializing them in
* ex_data.c... see the shell script "makeoptions".
*/
struct option {
char *oname;
char *oabbrev;
short otype; /* Types -- see below */
short odefault; /* Default value */
short ovalue; /* Current value */
char *osvalue;
};
#define ONOFF 0
#define NUMERIC 1
#define STRING 2 /* SHELL or DIRECTORY */
#define OTERM 3
#define value(a) options[a].ovalue
#define svalue(a) options[a].osvalue
extern struct option options[NOPTS + 1];
/*
* Character constants and bits
*
* The editor uses the QUOTE bit as a flag to pass on with characters
* e.g. to the putchar routine. The editor never uses a simple char variable.
* Only arrays of and pointers to characters are used and parameters and
* registers are never declared character.
*/
#ifdef CTRL
#undef CTRL
#endif
#define CTRL(c) ((c) & 037)
#define NL CTRL('j')
#define CR CTRL('m')
#define DELETE 0177 /* See also ATTN, QUIT in ex_tune.h */
#define ESCAPE 033
/*
* BIT8 and MB routines by Gunnar Ritter 2000, 2004.
*
* -DISO8859_1 enables all characters >= 0240 regardless of
* LC_CTYPE.
*/
#define INVBIT 0x20000000
#define MULTICOL 0x40000000
#if defined (MB)
/*
* This type is used to represent a single character cell.
*/
typedef int cell;
var int TRIM;
var int QUOTE;
#define printable(c) (((c)&INVBIT) == 0 && \
(mb_cur_max > 1 ? iswprint((c)&TRIM) : isprint((c)&TRIM)))
#define ext(c) (((c) & 0177) == 0)
#elif defined (BIT8)
typedef short cell;
#define QUOTE 0400
#define TRIM 0377
#ifndef ISO8859_1
#define printable(c) isprint((c)&TRIM)
#else /* ISO8859_1 */
#define printable(c) (((c) & 0140) && (c) != DELETE)
#endif /* ISO8859_1 */
#else /* !BIT8 */
typedef char cell;
#define QUOTE 0200
#define TRIM 0177
#endif /* !BIT8 */
/*
* Miscellaneous random variables used in more than one place
*/
var bool aiflag; /* Append/change/insert with autoindent */
var bool anymarks; /* We have used '[a-z] */
var int bsize; /* Block size for disk i/o */
var int chng; /* Warn "No write" */
var char *Command;
var short defwind; /* -w# change default window size */
var int dirtcnt; /* When >= MAXDIRT, should sync temporary */
var bool dosusp; /* Do SIGTSTP in visual when ^Z typed */
var bool edited; /* Current file is [Edited] */
var line *endcore; /* Last available core location */
extern bool endline; /* Last cmd mode command ended with \n */
#ifndef VMUNIX
var short erfile; /* Error message file unit */
#endif
var line *fendcore; /* First address in line pointer space */
var char file[FNSIZE]; /* Working file name */
var bool fixedzero; /* zero file size was fixed (for visual) */
var char *genbuf; /* Working buffer when manipulating linebuf */
var bool hush; /* Command line option - was given, hush up! */
var char *globp; /* (Untyped) input string to command mode */
var bool holdcm; /* Don't cursor address */
var bool inappend; /* in ex command append mode */
var bool inglobal; /* Inside g//... or v//... */
var char *initev; /* Initial : escape for visual */
var bool inopen; /* Inside open or visual */
var char *input; /* Current position in cmd line input buffer */
var bool intty; /* Input is a tty */
var short io; /* General i/o unit (auto-closed on error!) */
extern int lastc; /* Last character ret'd from cmd input */
var bool laste; /* Last command was an "e" (or "rec") */
var char lastmac; /* Last macro called for ** */
var char lasttag[TAGSIZE]; /* Last argument to a tag command */
var char *linebp; /* Used in substituting in \n */
var char *linebuf; /* The primary line buffer */
var int LBSIZE; /* Size of linebuf */
var bool listf; /* Command should run in list mode */
var line names['z'-'a'+2]; /* Mark registers a-z,' */
var int notecnt; /* Count for notify (to visual from cmd) */
var bool numberf; /* Command should run in number mode */
var char obuf[BUFSIZ]; /* Buffer for tty output */
var shand oldhup; /* Previous SIGHUP handler */
var shand oldquit; /* Previous SIGQUIT handler */
#ifdef SIGXFSZ
var shand oldxfsz; /* Previous SIGXFSZ handler */
#endif
var short oprompt; /* Saved during source */
extern unsigned short ospeed; /* Output speed (from gtty) */
var int otchng; /* Backup tchng to find changes in macros */
var int peekc; /* Peek ahead character (cmd mode input) */
var char *pkill[2]; /* Trim for put with ragged (LISP) delete */
var bool pfast; /* Have stty -nl'ed to go faster */
var pid_t pid; /* Process id of child */
var pid_t ppid; /* Process id of parent (e.g. main ex proc) */
var JMP_BUF resetlab; /* For error throws to top level (cmd mode) */
var pid_t rpid; /* Pid returned from wait() */
var bool recov; /* A `n' command is executed as `recov' */
var bool ruptible; /* Interruptible is normal state */
var bool seenprompt; /* 1 if have gotten user input */
var bool shudclob; /* Have a prompt to clobber (e.g. on ^D) */
var int status; /* Status returned from wait() */
var int tchng; /* If nonzero, then [Modified] */
extern int tfile; /* Temporary file unit */
var bool tflag; /* -t option given on command line */
var bool vcatch; /* Want to catch an error (open/visual) */
var bool verbose; /* -V option; print command input to stderr */
var JMP_BUF vreslab; /* For error throws to a visual catch */
var bool writing; /* 1 if in middle of a file write */
var int xchng; /* Suppresses multiple "No writes" in !cmd */
var int failed; /* exit with a non-zero status */
var int exitoneof; /* exit command loop on EOF */
/*
* Macros
*/
#define CP(a, b) (ignore(movestr(a, b)))
/*
* FIXUNDO: do we want to mung undo vars?
* Usually yes unless in a macro or global.
*/
#define FIXUNDO (inopen >= 0 && (inopen || !inglobal))
#define ckaw() {if (chng && value(AUTOWRITE)) wop(0);}
#define copy(a,b,c) Copy((char *) (a), (char *) (b), (c))
#define eq(a, b) ((a) && (b) && strcmp(a, b) == 0)
#define getexit(a) copy(a, resetlab, sizeof (JMP_BUF))
#define lastchar() lastc
#define outchar(c) (*Outchar)(c)
#define pastwh() (ignore(skipwh()))
#define pline(no, max) (*Pline)(no, max)
#define reset() LONGJMP(resetlab,1)
#define resexit(a) copy(resetlab, a, sizeof (JMP_BUF))
#define setexit() SETJMP(resetlab)
#define setlastchar(c) lastc = c
#define ungetchar(c) peekc = c
#define CATCH vcatch = 1; if (SETJMP(vreslab) == 0) {
#define ONERR } else { vcatch = 0;
#define ENDCATCH } vcatch = 0;
/*
* Environment like memory
*/
var char altfile[FNSIZE]; /* Alternate file name */
extern char direct[ONMSZ]; /* Temp file goes here */
extern char shell[ONMSZ]; /* Copied to be settable */
extern char ttylongname[ONMSZ]; /* A long and pretty name */
var char uxb[UXBSIZE + 2]; /* Last !command for !! */
/*
* The editor data structure for accessing the current file consists
* of an incore array of pointers into the temporary file tfile.
* Each pointer is 15 bits (the low bit is used by global) and is
* padded with zeroes to make an index into the temp file where the
* actual text of the line is stored.
*
* To effect undo, copies of affected lines are saved after the last
* line considered to be in the buffer, between dol and unddol.
* During an open or visual, which uses the command mode undo between
* dol and unddol, a copy of the entire, pre-command buffer state
* is saved between unddol and truedol.
*/
var line *addr1; /* First addressed line in a command */
var line *addr2; /* Second addressed line */
var line *dol; /* Last line in buffer */
var line *dot; /* Current line */
var line *one; /* First line */
var line *truedol; /* End of all lines, including saves */
var line *unddol; /* End of undo saved lines */
var line *zero; /* Points to empty slot before one */
/*
* Undo information
*
* For most commands we save lines changed by salting them away between
* dol and unddol before they are changed (i.e. we save the descriptors
* into the temp file tfile which is never garbage collected). The
* lines put here go back after unddel, and to complete the undo
* we delete the lines [undap1,undap2).
*
* Undoing a move is much easier and we treat this as a special case.
* Similarly undoing a "put" is a special case for although there
* are lines saved between dol and unddol we don't stick these back
* into the buffer.
*/
var short undkind;
var line *unddel; /* Saved deleted lines go after here */
var line *undap1; /* Beginning of new lines */
var line *undap2; /* New lines end before undap2 */
var line *undadot; /* If we saved all lines, dot reverts here */
#define UNDCHANGE 0
#define UNDMOVE 1
#define UNDALL 2
#define UNDNONE 3
#define UNDPUT 4
extern int (*Outchar)(int);
extern int (*Pline)(int, int);
extern int (*Putchar)(int);
#define NOSTR (char *) 0
#define NOLINE (line *) 0
#define ignore(a) a
#define ignorf(a) a
#ifdef LANGMSG
#include <nl_types.h>
var nl_catd catd;
#else /* !LANGMSG */
#define catgets(a, b, c, d) (d)
#endif /* !LANGMSG */
var char *cntrlhm;
#include "ex_proto.h"
var int mb_cur_max;
#ifdef MB
#define nextc(c, s, n) (mb_cur_max > 1 && *(s) & 0200 ? \
((n) = mbtowi(&(c), (s), mb_cur_max), \
(n) = ((n) > 0 ? (n) : (n) < 0 ? (c=WEOF, 1) : 1)) :\
((c) = *(s) & 0377, (n) = 1))
#define colsc(c) (mb_cur_max > 1 && ((c)&0177) != (c) ? wcwidth(c) : 1)
#define skipleft(l, p) (mb_cur_max > 1 && ((p)[0]&0200 || \
(p)>(l) && (p)[-1]&0200) ? wskipleft(l, p) : -1)
#define skipright(l, p) (mb_cur_max > 1 && (p)>=(l) && (p)[0]&0200 ? \
wskipright(l, p) : 1)
#define samechar(cp, c) (mb_cur_max > 1 && *(cp)&0200 ? wsamechar(cp, c) : \
(*(cp)&0377) == c)
#define xisdigit(c) (mb_cur_max > 1 ? iswdigit(c) : isdigit(c))
#define xisalpha(c) (mb_cur_max > 1 ? iswalpha(c) : isalpha(c))
#define xisalnum(c) (mb_cur_max > 1 ? iswalnum(c) : isalnum(c))
#define xisspace(c) (mb_cur_max > 1 ? iswspace(c) : isspace(c))
#define xisupper(c) (mb_cur_max > 1 ? iswupper(c) : isupper(c))
#define xislower(c) (mb_cur_max > 1 ? iswlower(c) : islower(c))
#define xtolower(c) (mb_cur_max > 1 ? towlower(c) : tolower(c))
#define xtoupper(c) (mb_cur_max > 1 ? towupper(c) : toupper(c))
#else /* !MB */
#define nextc(c, s, n) ((c) = *(s) & 0377, (n) = 1)
#define colsc(c) (1)
#define skipleft(l, p) (-1)
#define skipright(l, p) (1)
#define samechar(cp, c) (*(cp)&0377 == c)
#define xisdigit(c) isdigit(c)
#define xisalpha(c) isalpha(c)
#define xisalnum(c) isalnum(c)
#define xisspace(c) isspace(c)
#define xisupper(c) isupper(c)
#define xislower(c) islower(c)
#define xtolower(c) tolower(c)
#define xtoupper(c) toupper(c)
#endif /* !MB */