Remove local redefinition for err(). Add usage().
This commit is contained in:
parent
5555a73810
commit
db6e9b0f81
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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 *));
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
}
|
||||
|
@ -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 '{':
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user