Remove local redefinition for err(). Add usage().

This commit is contained in:
charnier 1997-08-11 07:21:08 +00:00
parent 5555a73810
commit db6e9b0f81
7 changed files with 135 additions and 155 deletions

View File

@ -36,14 +36,18 @@
*/
#ifndef lint
#if 0
static char sccsid[] = "@(#)compile.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <errno.h>
#include <err.h>
#include <fcntl.h>
#include <limits.h>
#include <regex.h>
@ -158,7 +162,8 @@ compile_stream(link)
for (;;) {
if ((p = cu_fgets(lbuf, sizeof(lbuf))) == NULL) {
if (stack != 0)
err(COMPILE, "unexpected EOF (pending }'s)");
errx(1, "%lu: %s: unexpected EOF (pending }'s)",
linenum, fname);
return (link);
}
@ -192,16 +197,17 @@ semicolon: EATSPACE();
nonsel: /* Now parse the command */
if (!*p)
err(COMPILE, "command expected");
errx(1, "%lu: %s: command expected", linenum, fname);
cmd->code = *p;
for (fp = cmd_fmts; fp->code; fp++)
if (fp->code == *p)
break;
if (!fp->code)
err(COMPILE, "invalid command code %c", *p);
errx(1, "%lu: %s: invalid command code %c", linenum, fname, *p);
if (naddr > fp->naddr)
err(COMPILE,
"command %c expects up to %d address(es), found %d", *p, fp->naddr, naddr);
errx(1,
"%lu: %s: command %c expects up to %d address(es), found %d",
linenum, fname, *p, fp->naddr, naddr);
switch (fp->args) {
case NONSEL: /* ! */
p++;
@ -224,7 +230,7 @@ semicolon: EATSPACE();
*/
cmd->nonsel = 1;
if (stack == 0)
err(COMPILE, "unexpected }");
errx(1, "%lu: %s: unexpected }", linenum, fname);
cmd2 = stack;
stack = cmd2->next;
cmd2->next = cmd;
@ -238,20 +244,21 @@ semicolon: EATSPACE();
goto semicolon;
}
if (*p)
err(COMPILE,
"extra characters at the end of %c command", cmd->code);
errx(1, "%lu: %s: extra characters at the end of %c command",
linenum, fname, cmd->code);
break;
case TEXT: /* a c i */
p++;
EATSPACE();
if (*p != '\\')
err(COMPILE,
"command %c expects \\ followed by text", cmd->code);
errx(1,
"%lu: %s: command %c expects \\ followed by text", linenum, fname, cmd->code);
p++;
EATSPACE();
if (*p)
err(COMPILE,
"extra characters after \\ at the end of %c command", cmd->code);
errx(1,
"%lu: %s: extra characters after \\ at the end of %c command",
linenum, fname, cmd->code);
cmd->t = compile_text();
break;
case COMMENT: /* \0 # */
@ -260,20 +267,20 @@ semicolon: EATSPACE();
p++;
EATSPACE();
if (*p == '\0')
err(COMPILE, "filename expected");
errx(1, "%lu: %s: filename expected", linenum, fname);
cmd->t = duptoeol(p, "w command");
if (aflag)
cmd->u.fd = -1;
else if ((cmd->u.fd = open(p,
O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
DEFFILEMODE)) == -1)
err(FATAL, "%s: %s\n", p, strerror(errno));
err(1, "%s", p);
break;
case RFILE: /* r */
p++;
EATSPACE();
if (*p == '\0')
err(COMPILE, "filename expected");
errx(1, "%lu: %s: filename expected", linenum, fname);
else
cmd->t = duptoeol(p, "read command");
break;
@ -290,18 +297,20 @@ semicolon: EATSPACE();
EATSPACE();
cmd->t = duptoeol(p, "label");
if (strlen(p) == 0)
err(COMPILE, "empty label");
errx(1, "%lu: %s: empty label", linenum, fname);
enterlabel(cmd);
break;
case SUBST: /* s */
p++;
if (*p == '\0' || *p == '\\')
err(COMPILE,
"substitute pattern can not be delimited by newline or backslash");
errx(1,
"%lu: %s: substitute pattern can not be delimited by newline or backslash",
linenum, fname);
cmd->u.s = xmalloc(sizeof(struct s_subst));
p = compile_re(p, &cmd->u.s->re);
if (p == NULL)
err(COMPILE, "unterminated substitute pattern");
errx(1,
"%lu: %s: unterminated substitute pattern", linenum, fname);
--p;
p = compile_subst(p, cmd->u.s);
p = compile_flags(p, cmd->u.s);
@ -322,8 +331,8 @@ semicolon: EATSPACE();
goto semicolon;
}
if (*p)
err(COMPILE,
"extra text at the end of a transform command");
errx(1,
"%lu: %s: extra text at the end of a transform command", linenum, fname);
break;
}
}
@ -348,13 +357,15 @@ compile_delimited(p, d)
if (c == '\0')
return (NULL);
else if (c == '\\')
err(COMPILE, "\\ can not be used as a string delimiter");
errx(1, "%lu: %s: \\ can not be used as a string delimiter",
linenum, fname);
else if (c == '\n')
err(COMPILE, "newline can not be used as a string delimiter");
errx(1, "%lu: %s: newline can not be used as a string delimiter",
linenum, fname);
while (*p) {
if (*p == '[') {
if ((d = compile_ccl(&p, d)) == NULL)
err(COMPILE, "unbalanced brackets ([])");
errx(1, "%lu: %s: unbalanced brackets ([])", linenum, fname);
continue;
} else if (*p == '\\' && p[1] == '[') {
*d++ = *p++;
@ -425,7 +436,8 @@ compile_re(p, repp)
}
*repp = xmalloc(sizeof(regex_t));
if (p && (eval = regcomp(*repp, re, 0)) != 0)
err(COMPILE, "RE error: %s", strregerror(eval, *repp));
errx(1, "%lu: %s: RE error: %s",
linenum, fname, strregerror(eval, *repp));
if (maxnsub < (*repp)->re_nsub)
maxnsub = (*repp)->re_nsub;
return (p);
@ -464,8 +476,8 @@ compile_subst(p, s)
ref = *p - '0';
if (s->re != NULL &&
ref > s->re->re_nsub)
err(COMPILE,
"\\%c not defined in the RE", *p);
errx(1, "%lu: %s: \\%c not defined in the RE",
linenum, fname, *p);
if (s->maxbref < ref)
s->maxbref = ref;
} else if (*p == '&' || *p == '\\')
@ -477,8 +489,8 @@ compile_subst(p, s)
s->new = xrealloc(text, size);
return (p);
} else if (*p == '\n') {
err(COMPILE,
"unescaped newline inside substitute pattern");
errx(1,
"%lu: %s: unescaped newline inside substitute pattern", linenum, fname);
/* NOTREACHED */
}
*sp++ = *p;
@ -489,7 +501,8 @@ compile_subst(p, s)
text = xmalloc(asize);
}
} while (cu_fgets(p = lbuf, sizeof(lbuf)));
err(COMPILE, "unterminated substitute in regular expression");
errx(1, "%lu: %s: unterminated substitute in regular expression",
linenum, fname);
/* NOTREACHED */
}
@ -513,8 +526,8 @@ compile_flags(p, s)
switch (*p) {
case 'g':
if (gn)
err(COMPILE,
"more than one number or 'g' in substitute flags");
errx(1,
"%lu: %s: more than one number or 'g' in substitute flags", linenum, fname);
gn = 1;
s->n = 0;
break;
@ -529,8 +542,8 @@ compile_flags(p, s)
case '4': case '5': case '6':
case '7': case '8': case '9':
if (gn)
err(COMPILE,
"more than one number or 'g' in substitute flags");
errx(1,
"%lu: %s: more than one number or 'g' in substitute flags", linenum, fname);
gn = 1;
/* XXX Check for overflow */
s->n = (int)strtol(p, &p, 10);
@ -539,7 +552,7 @@ compile_flags(p, s)
p++;
#ifdef HISTORIC_PRACTICE
if (*p != ' ') {
err(WARNING, "space missing before w wfile");
warnx("%lu: %s: space missing before w wfile", linenum, fname);
return (p);
}
#endif
@ -552,16 +565,16 @@ compile_flags(p, s)
}
*q = '\0';
if (q == wfile)
err(COMPILE, "no wfile specified");
errx(1, "%lu: %s: no wfile specified", linenum, fname);
s->wfile = strdup(wfile);
if (!aflag && (s->wfd = open(wfile,
O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
DEFFILEMODE)) == -1)
err(FATAL, "%s: %s\n", wfile, strerror(errno));
err(1, "%s", wfile);
return (p);
default:
err(COMPILE,
"bad flag in substitute command: '%c'", *p);
errx(1, "%lu: %s: bad flag in substitute command: '%c'",
linenum, fname, *p);
break;
}
p++;
@ -582,23 +595,21 @@ compile_tr(p, transtab)
char new[_POSIX2_LINE_MAX + 1];
if (*p == '\0' || *p == '\\')
err(COMPILE,
"transform pattern can not be delimited by newline or backslash");
errx(1,
"%lu: %s: transform pattern can not be delimited by newline or backslash",
linenum, fname);
p = compile_delimited(p, old);
if (p == NULL) {
err(COMPILE, "unterminated transform source string");
return (NULL);
}
if (p == NULL)
errx(1, "%lu: %s: unterminated transform source string",
linenum, fname);
p = compile_delimited(--p, new);
if (p == NULL) {
err(COMPILE, "unterminated transform target string");
return (NULL);
}
if (p == NULL)
errx(1, "%lu: %s: unterminated transform target string",
linenum, fname);
EATSPACE();
if (strlen(new) != strlen(old)) {
err(COMPILE, "transform strings are not the same length");
return (NULL);
}
if (strlen(new) != strlen(old))
errx(1, "%lu: %s: transform strings are not the same length",
linenum, fname);
/* We assume characters are 8 bits */
lt = xmalloc(UCHAR_MAX);
for (i = 0; i <= UCHAR_MAX; i++)
@ -662,7 +673,7 @@ compile_addr(p, a)
case '/': /* Context address */
p = compile_re(p, &a->u.r);
if (p == NULL)
err(COMPILE, "unterminated regular expression");
errx(1, "%lu: %s: unterminated regular expression", linenum, fname);
a->type = AT_RE;
return (p);
@ -676,7 +687,7 @@ compile_addr(p, a)
a->u.l = strtol(p, &end, 10);
return (end);
default:
err(COMPILE, "expected context address");
errx(1, "%lu: %s: expected context address", linenum, fname);
return (NULL);
}
}
@ -699,7 +710,7 @@ duptoeol(s, ctype)
ws = isspace((unsigned char)*s);
*s = '\0';
if (ws)
err(WARNING, "whitespace after %s", ctype);
warnx("%lu: %s: whitespace after %s", linenum, fname, ctype);
len = s - start + 1;
return (memmove(xmalloc(len), start, len));
}
@ -730,7 +741,7 @@ fixuplabel(cp, end)
break;
}
if ((cp->u.c = findlabel(cp->t)) == NULL)
err(COMPILE2, "undefined label '%s'", cp->t);
errx(1, "%lu: %s: undefined label '%s'", linenum, fname, cp->t);
free(cp->t);
break;
case '{':
@ -756,7 +767,7 @@ enterlabel(cp)
lhp = &labels[h & LHMASK];
for (lh = *lhp; lh != NULL; lh = lh->lh_next)
if (lh->lh_hash == h && strcmp(cp->t, lh->lh_cmd->t) == 0)
err(COMPILE2, "duplicate label '%s'", cp->t);
errx(1, "%lu: %s: duplicate label '%s'", linenum, fname, cp->t);
lh = xmalloc(sizeof *lh);
lh->lh_next = *lhp;
lh->lh_hash = h;
@ -802,8 +813,8 @@ uselabel()
for (lh = labels[i]; lh != NULL; lh = next) {
next = lh->lh_next;
if (!lh->lh_ref)
err(WARNING, "unused label '%s'",
lh->lh_cmd->t);
warnx("%lu: %s: unused label '%s'",
linenum, fname, lh->lh_cmd->t);
free(lh);
}
}

View File

@ -134,12 +134,3 @@ typedef struct {
char *back; /* Backing memory. */
size_t blen; /* Backing memory length. */
} SPACE;
/*
* Error severity codes:
*/
#define FATAL 0 /* Exit immediately with 1 */
#define ERROR 1 /* Continue, but change exit value */
#define WARNING 2 /* Just print the warning */
#define COMPILE 3 /* Print error, count and finish script */
#define COMPILE2 3 /* Print error, count and finish script */

View File

@ -51,7 +51,6 @@ void cfclose __P((struct s_command *, struct s_command *));
void compile __P((void));
void cspace __P((SPACE *, char *, size_t, enum e_spflag));
char *cu_fgets __P((char *, int));
void err __P((int, const char *, ...));
int mf_fgets __P((SPACE *, enum e_spflag));
void process __P((void));
char *strregerror __P((int, regex_t *));

View File

@ -36,17 +36,22 @@
*/
#ifndef lint
static char copyright[] =
static const char copyright[] =
"@(#) Copyright (c) 1992, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94";
#endif
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <sys/types.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
@ -101,6 +106,7 @@ int lastline; /* TRUE on the last line of the last file */
static void add_compunit __P((enum e_cut, char *));
static void add_file __P((char *));
static void usage __P((void));
int
main(argc, argv)
@ -130,9 +136,7 @@ main(argc, argv)
break;
default:
case '?':
(void)fprintf(stderr,
"usage:\tsed script [-an] [file ...]\n\tsed [-an] [-e script] ... [-f script_file] ... [file ...]\n");
exit(1);
usage();
}
argc -= optind;
argv += optind;
@ -154,10 +158,19 @@ main(argc, argv)
process();
cfclose(prog, NULL);
if (fclose(stdout))
err(FATAL, "stdout: %s", strerror(errno));
err(1, "stdout");
exit (0);
}
static void
usage()
{
(void)fprintf(stderr, "%s\n%s\n",
"usage: sed script [-an] [file ...]",
" sed [-an] [-e script] ... [-f script_file] ... [file ...]");
exit(1);
}
/*
* Like fgets, but go through the chain of compilation units chaining them
* together. Empty strings and files are ignored.
@ -182,8 +195,7 @@ cu_fgets(buf, n)
switch (script->type) {
case CU_FILE:
if ((f = fopen(script->s, "r")) == NULL)
err(FATAL,
"%s: %s", script->s, strerror(errno));
err(1, "%s", script->s);
fname = script->s;
state = ST_FILE;
goto again;
@ -243,6 +255,7 @@ cu_fgets(buf, n)
}
}
/* NOTREACHED */
return (NULL);
}
/*
@ -272,8 +285,7 @@ mf_fgets(sp, spflag)
} else {
fname = files->fname;
if ((f = fopen(fname, "r")) == NULL)
err(FATAL, "%s: %s",
fname, strerror(errno));
err(1, "%s", fname);
}
if ((c = getc(f)) != EOF) {
(void)ungetc(c, f);
@ -295,7 +307,7 @@ mf_fgets(sp, spflag)
*/
p = fgetln(f, &len);
if (ferror(f))
err(FATAL, "%s: %s", fname, strerror(errno ? errno : EIO));
errx(1, "%s: %s", fname, strerror(errno ? errno : EIO));
cspace(sp, p, len, spflag);
linenum++;
@ -313,7 +325,7 @@ mf_fgets(sp, spflag)
} else {
fname = files->fname;
if ((f = fopen(fname, "r")) == NULL)
err(FATAL, "%s: %s", fname, strerror(errno));
err(1, "%s", fname);
}
}
(void)ungetc(c, f);

View File

@ -36,12 +36,16 @@
*/
#ifndef lint
#if 0
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <sys/types.h>
#include <errno.h>
#include <err.h>
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
@ -60,7 +64,7 @@ xmalloc(size)
void *p;
if ((p = malloc(size)) == NULL)
err(FATAL, "%s", strerror(errno));
err(1, "malloc");
return (p);
}
@ -76,7 +80,7 @@ xrealloc(p, size)
return (xmalloc(size));
if ((p = realloc(p, size)) == NULL)
err(FATAL, "%s", strerror(errno));
err(1, "realloc");
return (p);
}
@ -100,42 +104,3 @@ strregerror(errcode, preg)
(void)regerror(errcode, preg, oe, s);
return (oe);
}
#if __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/*
* Error reporting function
*/
void
#if __STDC__
err(int severity, const char *fmt, ...)
#else
err(severity, fmt, va_alist)
int severity;
char *fmt;
va_dcl
#endif
{
va_list ap;
#if __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
(void)fprintf(stderr, "sed: ");
switch (severity) {
case WARNING:
case COMPILE:
(void)fprintf(stderr, "%lu: %s: ", linenum, fname);
}
(void)vfprintf(stderr, fmt, ap);
va_end(ap);
(void)fprintf(stderr, "\n");
if (severity == WARNING)
return;
exit(1);
/* NOTREACHED */
}

View File

@ -36,7 +36,11 @@
*/
#ifndef lint
#if 0
static char sccsid[] = "@(#)process.c 8.6 (Berkeley) 4/20/94";
#endif
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <sys/types.h>
@ -45,6 +49,7 @@ static char sccsid[] = "@(#)process.c 8.6 (Berkeley) 4/20/94";
#include <sys/uio.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@ -220,11 +225,9 @@ process()
if (cp->u.fd == -1 && (cp->u.fd = open(cp->t,
O_WRONLY|O_APPEND|O_CREAT|O_TRUNC,
DEFFILEMODE)) == -1)
err(FATAL, "%s: %s\n",
cp->t, strerror(errno));
err(1, "%s", cp->t);
if (write(cp->u.fd, ps, psl) != psl)
err(FATAL, "%s: %s\n",
cp->t, strerror(errno));
err(1, "%s", cp->t);
break;
case 'x':
if (hs == NULL)
@ -323,8 +326,8 @@ substitute(cp)
if (re == NULL) {
if (defpreg != NULL && cp->u.s->maxbref > defpreg->re_nsub) {
linenum = cp->u.s->linenum;
err(COMPILE, "\\%d not defined in the RE",
cp->u.s->maxbref);
errx(1, "%lu: %s: \\%d not defined in the RE",
linenum, fname, cp->u.s->maxbref);
}
}
if (!regexec_e(re, s, 0, 0, psl))
@ -407,9 +410,9 @@ substitute(cp)
if (cp->u.s->wfile && !pd) {
if (cp->u.s->wfd == -1 && (cp->u.s->wfd = open(cp->u.s->wfile,
O_WRONLY|O_APPEND|O_CREAT|O_TRUNC, DEFFILEMODE)) == -1)
err(FATAL, "%s: %s\n", cp->u.s->wfile, strerror(errno));
err(1, "%s", cp->u.s->wfile);
if (write(cp->u.s->wfd, ps, psl) != psl)
err(FATAL, "%s: %s\n", cp->u.s->wfile, strerror(errno));
err(1, "%s", cp->u.s->wfile);
}
return (1);
}
@ -442,13 +445,13 @@ flush_appends()
*/
if ((f = fopen(appends[i].s, "r")) == NULL)
break;
while (count = fread(buf, sizeof(char), sizeof(buf), f))
while ((count = fread(buf, sizeof(char), sizeof(buf), f)))
(void)fwrite(buf, sizeof(char), count, stdout);
(void)fclose(f);
break;
}
if (ferror(stdout))
err(FATAL, "stdout: %s", strerror(errno ? errno : EIO));
errx(1, "stdout: %s", strerror(errno ? errno : EIO));
appendx = sdone = 0;
}
@ -462,7 +465,7 @@ lputs(s)
static int termwidth = -1;
if (termwidth == -1)
if (p = getenv("COLUMNS"))
if ((p = getenv("COLUMNS")))
termwidth = atoi(p);
else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) == 0 &&
win.ws_col > 0)
@ -481,7 +484,7 @@ lputs(s)
} else {
escapes = "\\\a\b\f\n\r\t\v";
(void)putchar('\\');
if (p = strchr(escapes, *s)) {
if ((p = strchr(escapes, *s))) {
(void)putchar("\\abfnrtv"[p - escapes]);
count += 2;
} else {
@ -493,7 +496,7 @@ lputs(s)
(void)putchar('$');
(void)putchar('\n');
if (ferror(stdout))
err(FATAL, "stdout: %s", strerror(errno ? errno : EIO));
errx(1, "stdout: %s", strerror(errno ? errno : EIO));
}
static inline int
@ -507,7 +510,7 @@ regexec_e(preg, string, eflags, nomatch, slen)
if (preg == NULL) {
if (defpreg == NULL)
err(FATAL, "first RE may not be empty");
errx(1, "first RE may not be empty");
} else
defpreg = preg;
@ -525,7 +528,7 @@ regexec_e(preg, string, eflags, nomatch, slen)
case REG_NOMATCH:
return (0);
}
err(FATAL, "RE error: %s", strregerror(eval, defpreg));
errx(1, "RE error: %s", strregerror(eval, defpreg));
/* NOTREACHED */
}
@ -615,13 +618,12 @@ cfclose(cp, end)
switch(cp->code) {
case 's':
if (cp->u.s->wfd != -1 && close(cp->u.s->wfd))
err(FATAL,
"%s: %s", cp->u.s->wfile, strerror(errno));
err(1, "%s", cp->u.s->wfile);
cp->u.s->wfd = -1;
break;
case 'w':
if (cp->u.fd != -1 && close(cp->u.fd))
err(FATAL, "%s: %s", cp->t, strerror(errno));
err(1, "%s", cp->t);
cp->u.fd = -1;
break;
case '{':

View File

@ -52,7 +52,7 @@
.Op Ar file ...
.Sh DESCRIPTION
The
.Nm sed
.Nm
utility reads the specified files, or the standard input if no files
are specified, modifying the input as specified by a list of commands.
The input is then written to the standard output.
@ -77,7 +77,7 @@ by default.
The
.Fl a
option causes
.Nm sed
.Nm
to delay opening each file until a command containing the related
.Dq w
function is applied to a line of input.
@ -100,7 +100,7 @@ option suppresses this behavior.
.El
.Pp
The form of a
.Nm sed
.Nm
command is as follows:
.sp
.Dl [address[,address]]function[arguments]
@ -109,7 +109,7 @@ Whitespace may be inserted before the first address and the function
portions of the command.
.Pp
Normally,
.Nm sed
.Nm
cyclically copies a line of input, not including its terminating newline
character, into a
.Em "pattern space" ,
@ -145,7 +145,7 @@ pattern space that matches the second.
(If the second address is a number less than or equal to the line number
first selected, only that line is selected.)
Starting at the first line following the selected range,
.Nm sed
.Nm
starts looking again for the first address.
.Pp
Editing commands can be applied to non-selected pattern spaces by use
@ -156,12 +156,12 @@ of the exclamation character
function.
.Sh "Sed Regular Expressions"
The
.Nm sed
.Nm
regular expressions are basic regular expressions (BRE's, see
.Xr regex 3
for more information).
In addition,
.Nm sed
.Nm
has the following two additions to BRE's:
.sp
.Bl -enum -compact
@ -189,7 +189,7 @@ in the substitute command.
.El
.Pp
One special feature of
.Nm sed
.Nm
regular expressions is that they can default to the last regular
expression used.
If a regular expression is empty, i.e. just the delimiter characters
@ -222,7 +222,7 @@ and
functions take an optional file parameter, which should be separated
from the function letter by white space.
Each file given as an argument to
.Nm sed
.Nm
is created (or its contents truncated) before any input processing begins.
.Pp
The
@ -241,7 +241,7 @@ the function letters by white space characters.
.Pp
Two of the functions take a function-list.
This is a list of
.Nm sed
.Nm
functions separated by newlines, as follows:
.Bd -literal -offset indent
{ function
@ -493,7 +493,7 @@ option on the command line.
.El
.Pp
The
.Nm sed
.Nm
utility exits 0 on success and >0 if an error occurs.
.Sh SEE ALSO
.Xr awk 1 ,
@ -503,12 +503,12 @@ utility exits 0 on success and >0 if an error occurs.
.Xr re_format 7
.Sh HISTORY
A
.Nm sed
.Nm
command appeared in
.At v7 .
.Sh STANDARDS
The
.Nm sed
.Nm
function is expected to be a superset of the
.St -p1003.2
specification.