Blame | Last modification | View Log | RSS feed
/*
* 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 */