git: 2c1f52c11f17 - stable/13 - m4: Support long options.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 03 Jul 2023 15:14:57 UTC
The branch stable/13 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=2c1f52c11f175c8da3e6c59e967d9807dfbc28b7 commit 2c1f52c11f175c8da3e6c59e967d9807dfbc28b7 Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2023-06-21 20:58:40 +0000 Commit: Dag-Erling Smørgrav <des@FreeBSD.org> CommitDate: 2023-07-03 15:13:11 +0000 m4: Support long options. The option names are identical to those of the equivalent options in GNU m4, except of course for --gnu which does not exist in GNU m4. While here, make the argument to -d / --debug optional, with the same default behavior as in GNU m4, and document it properly. Sponsored by: Klara, Inc. Reviewed by: kevans, imp Differential Revision: https://reviews.freebsd.org/D40694 (cherry picked from commit 47b32f8f93b46ce2c7fe3973c331a40096b529da) m4: Add -G option which reverses -g. This matches GNU m4's -G / --traditional option, and although BSD m4 in non-GNU mode is not exactly identical to GNU mode in traditional mode, it's close enough. Sponsored by: Klara, Inc. Reviewed by: kevans, imp Differential Revision: https://reviews.freebsd.org/D40697 (cherry picked from commit 6c9ed64c94f192eda8c8b5e9e2b92ff93da36de2) m4: Miscellaneous man page fixes. Sponsored by: Klara, Inc. Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D40701 (cherry picked from commit db4c5b8a05bbd54a00dad145a91902d71c1f92a1) Fix spelling of "behavior" to be consistent with the rest of the file (cherry picked from commit 764464af49688e74fd6d803df0404ca4726dd460) --- usr.bin/m4/m4.1 | 70 +++++++++++++++++++++++++++++++++++++------------------ usr.bin/m4/main.c | 24 +++++++++++++++++-- 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/usr.bin/m4/m4.1 b/usr.bin/m4/m4.1 index 83f124dd3dfc..ffc60af22d30 100644 --- a/usr.bin/m4/m4.1 +++ b/usr.bin/m4/m4.1 @@ -33,7 +33,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 8, 2021 +.Dd June 21, 2023 .Dt M4 1 .Os .Sh NAME @@ -41,13 +41,13 @@ .Nd macro language processor .Sh SYNOPSIS .Nm -.Op Fl EgPs +.Op Fl EGgPs .Oo .Sm off .Fl D Ar name Op No = Ar value .Sm on .Oc -.Op Fl d Ar flags +.Op Fl d Oo Oo +- Oc Ns Ar flags Oc .Op Fl I Ar dirname .Op Fl o Ar filename .Op Fl t Ar macro @@ -98,15 +98,14 @@ recognized as special when not followed by an open parenthesis. .Pp The options are as follows: .Bl -tag -width Ds -.It Fl D Ns Ar name Ns Op = Ns Ar value +.It Fl D Ns Ar name Ns Oo = Ns Ar value Oc , Fl -define Ns = Ns Ar name Ns Oo = Ns Ar value Oc Define the symbol .Ar name to have some value (or .Dv NULL ) . -.It Fl d Ar "flags" -Set trace flags. -.Ar flags -may hold the following: +.It Fl d Oo Oo +|- Oc Ns Ar flags Oc , Fl -debug Ns = Ns Oo Oo +|- Oc Ns Ar flags Oc +Set or unset trace flags. +The trace flags are as follows: .Bl -tag -width Ds .It Ar a print macro arguments. @@ -128,9 +127,21 @@ number macro expansions. turn on all options. .El .Pp +If +.Qq + +or +.Qq - +is used, the specified flags are added to or removed from the set of +active trace flags, respectively; otherwise, the specified flags +replace the set of active trace flags. +.Pp +Specifying this option without an argument is equivalent to specifying +it with the argument +.Qq aeq . +.Pp By default, trace is set to .Qq eq . -.It Fl E +.It Fl E , Fl -fatal-warnings Set warnings to be fatal. When a single .Fl E @@ -144,38 +155,51 @@ 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 -ranges (e.g., a-z), regular expressions mimic emacs behavior, -multiple m4wrap calls are handled as a stack, +This behavior matches GNU m4 1.4.9 and later. +.It Fl G , Fl -traditional +Disable GNU compatibility mode (see +.Fl g +below). +.It Fl g , Fl -gnu +Enable GNU compatibility mode. +In this mode, +.Ic translit +handles simple character ranges (e.g., +.Sq a-z ) , +regular expressions mimic Emacs behavior, +multiple +.Ic m4wrap +calls are handled as a stack, the number of diversions is unlimited, empty names for macro definitions are allowed, -and eval understands +.Ic undivert +can be used to include files, +and +.Ic eval +understands .Sq 0rbase:value numbers. -.It Fl I Ar "dirname" +.It Fl I Ar dirname , Fl -include Ns = Ns Ar dirname Add directory .Ar dirname to the include path. -.It Fl o Ar filename +.It Fl o Ar filename , Fl -error-output Ns = Ns Ar filename Send trace output to .Ar filename . -.It Fl P +.It Fl P , Fl -prefix-builtins Prefix all built-in macros with .Sq m4_ . For example, instead of writing .Ic define , use .Ic m4_define . -.It Fl s +.It Fl s , Fl -synclines Output line synchronization directives, suitable for .Xr cpp 1 . -.It Fl t Ar macro +.It Fl t Ar macro , Fl -trace Ns = Ns Ar macro Turn tracing on for .Ar macro . -.It Fl "U" Ns Ar "name" +.It Fl U Ns Ar name , Fl -undefine Ns = Ns Ar name Undefine the symbol .Ar name . .El @@ -474,7 +498,7 @@ utility is compliant with the specification. .Pp The flags -.Op Fl dEgIPot +.Op Fl dEGgIPot and the macros .Ic builtin , .Ic esyscmd , diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c index 292dc5eb3f76..f776ca8594e4 100644 --- a/usr.bin/m4/main.c +++ b/usr.bin/m4/main.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include <signal.h> #include <err.h> #include <errno.h> +#include <getopt.h> #include <unistd.h> #include <stdio.h> #include <ctype.h> @@ -60,6 +61,22 @@ __FBSDID("$FreeBSD$"); #include "extern.h" #include "pathnames.h" +static const char *shortopts = "+D:d::EGgI:o:Pst:U:"; +static const struct option longopts[] = { + { "define", required_argument, NULL, 'D' }, + { "debug", optional_argument, NULL, 'd' }, + { "fatal-warnings", no_argument, NULL, 'E' }, + { "traditional", no_argument, NULL, 'G' }, + { "gnu", no_argument, NULL, 'g' }, + { "include", required_argument, NULL, 'I' }, + { "error-output", required_argument, NULL, 'o' }, + { "prefix-builtins", no_argument, NULL, 'P' }, + { "synclines", no_argument, NULL, 's' }, + { "trace", required_argument, NULL, 't' }, + { "undefine", required_argument, NULL, 'U' }, + { NULL, 0, NULL, 0 }, +}; + stae *mstack; /* stack of m4 machine */ char *sstack; /* shadow stack, for string space extension */ static size_t STACKMAX; /* current maximum size of stack */ @@ -188,7 +205,7 @@ main(int argc, char *argv[]) outfile = NULL; resizedivs(MAXOUT); - while ((c = getopt(argc, argv, "gst:d:D:EU:o:I:P")) != -1) + while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) switch(c) { case 'D': /* define something..*/ @@ -214,11 +231,14 @@ main(int argc, char *argv[]) case 'U': /* undefine... */ macro_popdef(optarg); break; + case 'G': + mimic_gnu = 0; + break; case 'g': mimic_gnu = 1; break; case 'd': - set_trace_flags(optarg); + set_trace_flags(optarg ? optarg : "aeq"); break; case 's': synch_lines = 1;