MFC r352065-r352070

Sync with OpenBSD, in particular this adds support for -E flags
(GNU compatibility)
This commit is contained in:
Baptiste Daroussin 2019-09-13 07:22:09 +00:00
parent 871dba750d
commit 3787caf46e
8 changed files with 118 additions and 45 deletions

View File

@ -8,7 +8,7 @@
PROG= m4
CFLAGS+=-DEXTENDED -I${.CURDIR} -I${SRCTOP}/lib/libopenbsd
LIBADD= y l m openbsd
LIBADD= m openbsd
NO_WMISSING_VARIABLE_DECLARATIONS=

View File

@ -1,4 +1,4 @@
/* $OpenBSD: eval.c,v 1.74 2015/02/05 12:59:57 millert Exp $ */
/* $OpenBSD: eval.c,v 1.78 2019/06/28 05:35:34 deraadt Exp $ */
/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
/*
@ -124,6 +124,7 @@ void
expand_builtin(const char *argv[], int argc, int td)
{
int c, n;
const char *errstr;
int ac;
static int sysval = 0;
@ -184,13 +185,15 @@ expand_builtin(const char *argv[], int argc, int td)
if (argc > 3) {
base = strtonum(argv[3], 2, 36, &errstr);
if (errstr) {
m4errx(1, "expr: base %s invalid.", argv[3]);
m4errx(1, "expr: base is %s: %s.",
errstr, argv[3]);
}
}
if (argc > 4) {
maxdigits = strtonum(argv[4], 0, INT_MAX, &errstr);
if (errstr) {
m4errx(1, "expr: maxdigits %s invalid.", argv[4]);
m4errx(1, "expr: maxdigits is %s: %s.",
errstr, argv[4]);
}
}
if (argc > 2)
@ -199,8 +202,7 @@ expand_builtin(const char *argv[], int argc, int td)
}
case IFELTYPE:
if (argc > 4)
doifelse(argv, argc);
doifelse(argv, argc);
break;
case IFDFTYPE:
@ -230,8 +232,13 @@ expand_builtin(const char *argv[], int argc, int td)
* doincr - increment the value of the
* argument
*/
if (argc > 2)
pbnum(atoi(argv[2]) + 1);
if (argc > 2) {
n = strtonum(argv[2], INT_MIN, INT_MAX-1, &errstr);
if (errstr != NULL)
m4errx(1, "incr: argument is %s: %s.",
errstr, argv[2]);
pbnum(n + 1);
}
break;
case DECRTYPE:
@ -239,8 +246,13 @@ expand_builtin(const char *argv[], int argc, int td)
* dodecr - decrement the value of the
* argument
*/
if (argc > 2)
pbnum(atoi(argv[2]) - 1);
if (argc > 2) {
n = strtonum(argv[2], INT_MIN+1, INT_MAX, &errstr);
if (errstr)
m4errx(1, "decr: argument is %s: %s.",
errstr, argv[2]);
pbnum(n - 1);
}
break;
case SYSCTYPE:
@ -273,6 +285,10 @@ expand_builtin(const char *argv[], int argc, int td)
warn("%s at line %lu: include(%s)",
CURRENT_NAME, CURRENT_LINE, argv[2]);
exit_code = 1;
if (fatal_warns) {
killdiv();
exit(exit_code);
}
} else
err(1, "%s at line %lu: include(%s)",
CURRENT_NAME, CURRENT_LINE, argv[2]);
@ -337,12 +353,18 @@ expand_builtin(const char *argv[], int argc, int td)
break;
case DIVRTYPE:
if (argc > 2 && (n = atoi(argv[2])) != 0)
dodiv(n);
else {
active = stdout;
oindex = 0;
if (argc > 2) {
n = strtonum(argv[2], INT_MIN, INT_MAX, &errstr);
if (errstr)
m4errx(1, "divert: argument is %s: %s.",
errstr, argv[2]);
if (n != 0) {
dodiv(n);
break;
}
}
active = stdout;
oindex = 0;
break;
case UNDVTYPE:
@ -689,17 +711,17 @@ dotrace(const char *argv[], int argc, int on)
static void
doifelse(const char *argv[], int argc)
{
cycle {
if (STREQ(argv[2], argv[3]))
while (argc > 4) {
if (STREQ(argv[2], argv[3])) {
pbstr(argv[4]);
else if (argc == 6)
break;
} else if (argc == 6) {
pbstr(argv[5]);
else if (argc > 6) {
break;
} else {
argv += 3;
argc -= 3;
continue;
}
break;
}
}
@ -822,7 +844,7 @@ dodiv(int n)
if (outfile[n] == NULL) {
char fname[] = _PATH_DIVNAME;
if ((fd = mkstemp(fname)) < 0 ||
if ((fd = mkstemp(fname)) == -1 ||
unlink(fname) == -1 ||
(outfile[n] = fdopen(fd, "w+")) == NULL)
err(1, "%s: cannot divert", fname);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: extern.h,v 1.54 2014/05/12 19:11:19 espie Exp $ */
/* $OpenBSD: extern.h,v 1.55 2017/06/15 13:48:42 bcallah Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@ -59,6 +59,8 @@ extern void doesyscmd(const char *);
extern void getdivfile(const char *);
extern void doformat(const char *[], int);
extern void m4_warnx(const char *, ...);
/* look.c */
#define FLAG_UNTRACED 0
@ -176,4 +178,5 @@ extern int synch_lines; /* line synchronisation directives */
extern int mimic_gnu; /* behaves like gnu-m4 */
extern int prefix_builtins; /* prefix builtin macros with m4_ */
extern int error_warns; /* make warnings cause exit_code = 1 */
extern int fatal_warns; /* make warnings fatal */

View File

@ -1,4 +1,4 @@
/* $OpenBSD: gnum4.c,v 1.50 2015/04/29 00:13:26 millert Exp $ */
/* $OpenBSD: gnum4.c,v 1.52 2017/08/21 21:41:13 deraadt Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause
@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <paths.h>
#include <regex.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
@ -259,11 +260,29 @@ exit_regerror(int er, regex_t *re, const char *source)
m4errx(1, "regular expression error in %s: %s.", source, errbuf);
}
/* warnx() plus check to see if we need to change exit code or exit .
* -E flag functionality.
*/
void
m4_warnx(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
warnx(fmt, ap);
va_end(ap);
if (fatal_warns)
exit(1);
if (error_warns)
exit_code = 1;
}
static void
add_sub(int n, const char *string, regex_t *re, regmatch_t *pm)
{
if (n > (int)re->re_nsub)
warnx("No subexpression %d", n);
m4_warnx("No subexpression %d", n);
/* Subexpressions that did not match are
* not an error. */
else if (pm[n].rm_so != -1 &&
@ -446,7 +465,7 @@ void
dopatsubst(const char *argv[], int argc)
{
if (argc <= 3) {
warnx("Too few arguments to patsubst");
m4_warnx("Too few arguments to patsubst");
return;
}
/* special case: empty regexp */
@ -498,7 +517,7 @@ doregexp(const char *argv[], int argc)
const char *source;
if (argc <= 3) {
warnx("Too few arguments to regexp");
m4_warnx("Too few arguments to regexp");
return;
}
/* special gnu case */
@ -615,7 +634,7 @@ void
doesyscmd(const char *cmd)
{
int p[2];
pid_t pid, cpid;
pid_t cpid;
char *argv[4];
int cc;
int status;
@ -653,8 +672,10 @@ doesyscmd(const char *cmd)
} while (cc > 0 || (cc == -1 && errno == EINTR));
(void) close(p[0]);
while ((pid = wait(&status)) != cpid && pid >= 0)
continue;
while (waitpid(cpid, &status, 0) == -1) {
if (errno != EINTR)
break;
}
pbstr(getstring());
}
}

View File

@ -1,5 +1,5 @@
.\" $NetBSD: m4.1,v 1.23 2012/04/08 22:00:39 wiz Exp $
.\" @(#) $OpenBSD: m4.1,v 1.63 2015/09/14 20:06:58 schwarze Exp $
.\" @(#) $OpenBSD: m4.1,v 1.64 2017/06/15 13:48:42 bcallah Exp $
.\"
.\" Copyright (c) 1989, 1993
.\" The Regents of the University of California. All rights reserved.
@ -33,7 +33,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd $Mdocdate: September 14 2015 $
.Dd $Mdocdate: June 15 2017 $
.Dt M4 1
.Os
.Sh NAME
@ -41,7 +41,7 @@
.Nd macro language processor
.Sh SYNOPSIS
.Nm
.Op Fl gPs
.Op Fl EgPs
.Oo
.Sm off
.Fl D Ar name Op No = Ar value
@ -130,6 +130,21 @@ turn on all options.
.Pp
By default, trace is set to
.Qq eq .
.It Fl E
Set warnings to be fatal.
When a single
.Fl E
flag is specified, if warnings are issued, execution
continues but
.Nm
will exit with a non-zero exit status.
When multiple
.Fl E
flags are specified, execution will halt upon issuing the
first warning and
.Nm
will exit with a non-zero exit status.
This behaviour matches GNU-m4 1.4.9 and later.
.It Fl g
Activate GNU-m4 compatibility mode.
In this mode, translit handles simple character
@ -437,7 +452,9 @@ Returns the current file's name.
.Pp
But note that the
.Ic m4exit
macro can modify the exit status.
macro can modify the exit status, as can the
.Fl E
flag.
.Sh STANDARDS
The
.Nm
@ -446,7 +463,7 @@ utility is compliant with the
specification.
.Pp
The flags
.Op Fl dgIPot
.Op Fl dEgIPot
and the macros
.Ic builtin ,
.Ic esyscmd ,

View File

@ -1,4 +1,4 @@
/* $OpenBSD: main.c,v 1.86 2015/11/03 16:21:47 deraadt Exp $ */
/* $OpenBSD: main.c,v 1.87 2017/06/15 13:48:42 bcallah Exp $ */
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
/*-
@ -79,6 +79,8 @@ char scommt[MAXCCHARS+1] = {SCOMMT}; /* start character for comment */
char ecommt[MAXCCHARS+1] = {ECOMMT}; /* end character for comment */
int synch_lines = 0; /* line synchronisation for C preprocessor */
int prefix_builtins = 0; /* -P option to prefix builtin keywords */
int error_warns = 0; /* -E option to make warnings exit_code = 1 */
int fatal_warns = 0; /* -E -E option to make warnings fatal */
struct keyblk {
const char *knam; /* keyword name */
@ -184,7 +186,7 @@ main(int argc, char *argv[])
outfile = NULL;
resizedivs(MAXOUT);
while ((c = getopt(argc, argv, "gst:d:D:U:o:I:P")) != -1)
while ((c = getopt(argc, argv, "gst:d:D:EU:o:I:P")) != -1)
switch(c) {
case 'D': /* define something..*/
@ -195,6 +197,12 @@ main(int argc, char *argv[])
*p++ = EOS;
dodefine(optarg, p);
break;
case 'E': /* like GNU m4 1.4.9+ */
if (error_warns == 0)
error_warns = 1;
else
fatal_warns = 1;
break;
case 'I':
addtoincludepath(optarg);
break;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: misc.c,v 1.46 2015/12/07 14:12:46 espie Exp $ */
/* $OpenBSD: misc.c,v 1.47 2017/06/15 13:48:42 bcallah Exp $ */
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
/*
@ -384,7 +384,7 @@ xstrdup(const char *s)
void
usage(void)
{
fprintf(stderr, "usage: m4 [-gPs] [-Dname[=value]] [-d flags] "
fprintf(stderr, "usage: m4 [-EgPs] [-Dname[=value]] [-d flags] "
"[-I dirname] [-o filename]\n"
"\t[-t macro] [-Uname] [file ...]\n");
exit(1);

View File

@ -1,6 +1,6 @@
%option nounput noinput
%{
/* $OpenBSD: tokenizer.l,v 1.8 2012/04/12 17:00:11 espie Exp $ */
/* $OpenBSD: tokenizer.l,v 1.9 2017/06/15 13:48:42 bcallah Exp $ */
/*
* Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
*
@ -25,6 +25,7 @@
#include <stdint.h>
#include <limits.h>
extern void m4_warnx(const char *, ...);
extern int mimic_gnu;
extern int32_t yylval;
@ -42,6 +43,8 @@ oct 0[0-7]*
dec [1-9][0-9]*
radix 0[rR][0-9]+:[0-9a-zA-Z]+
%option noyywrap
%%
{ws} {/* just skip it */}
{hex}|{oct}|{dec} { yylval = number(); return(NUMBER); }
@ -72,7 +75,7 @@ number(void)
l = strtol(yytext, NULL, 0);
if (((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE) ||
l > INT32_MAX || l < INT32_MIN) {
fprintf(stderr, "m4: numeric overflow in expr: %s\n", yytext);
m4_warnx("numeric overflow in expr: %s", yytext);
}
return l;
}
@ -88,7 +91,7 @@ parse_radix(void)
l = 0;
base = strtol(yytext+2, &next, 0);
if (base > 36 || next == NULL) {
fprintf(stderr, "m4: error in number %s\n", yytext);
m4_warnx("error in number %s", yytext);
} else {
next++;
while (*next != 0) {
@ -101,8 +104,7 @@ parse_radix(void)
d = *next - 'A' + 10;
}
if (d >= base) {
fprintf(stderr,
"m4: error in number %s\n", yytext);
m4_warnx("error in number %s", yytext);
return 0;
}
l = base * l + d;