summaryrefslogtreecommitdiff
path: root/ex.h
diff options
context:
space:
mode:
Diffstat (limited to 'ex.h')
-rw-r--r--ex.h583
1 files changed, 583 insertions, 0 deletions
diff --git a/ex.h b/ex.h
new file mode 100644
index 0000000..51ae267
--- /dev/null
+++ b/ex.h
@@ -0,0 +1,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
+ *
+ * @(#)ex.h 1.53 (gritter) 2/17/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)
+
+#ifndef MAXBSIZE
+#define MAXBSIZE 8192 /* Same as in 4.2BSD */
+#endif
+
+#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[MAXBSIZE]; /* 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[LBSIZE]; /* The primary line buffer */
+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) (*Pline)(no)
+#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 void (*Pline)(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 */