1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

let m4wrap handle multiple wraps, both in normal and gnu-mode.

based on Noah Misch's bug report.
okay otto, jmc.
This commit is contained in:
espie 2005-03-02 10:12:15 +00:00
parent a044487f1f
commit ad459a2362
4 changed files with 55 additions and 12 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: eval.c,v 1.54 2005/01/31 16:06:54 robert Exp $ */
/* $OpenBSD: eval.c,v 1.55 2005/03/02 10:12:15 espie Exp $ */
/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
/*
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
#else
static char rcsid[] = "$OpenBSD: eval.c,v 1.54 2005/01/31 16:06:54 robert Exp $";
static char rcsid[] = "$OpenBSD: eval.c,v 1.55 2005/03/02 10:12:15 espie Exp $";
#endif
#endif /* not lint */
@ -72,6 +72,7 @@ static void gnu_dochq(const char *[], int);
static void dochq(const char *[], int);
static void gnu_dochc(const char *[], int);
static void dochc(const char *[], int);
static void dom4wrap(const char *);
static void dodiv(int);
static void doundiv(const char *[], int);
static void dosub(const char *[], int);
@ -434,7 +435,8 @@ expand_builtin(const char *argv[], int argc, int td)
* dom4wrap - set up for
* wrap-up/wind-down activity
*/
m4wraps = (argc > 2) ? xstrdup(argv[2]) : null;
if (argc > 2)
dom4wrap(argv[2]);
break;
case EXITTYPE:
@ -805,6 +807,23 @@ dochc(const char *argv[], int argc)
}
}
/*
* dom4wrap - expand text at EOF
*/
static void
dom4wrap(const char *text)
{
if (wrapindex >= maxwraps) {
if (maxwraps == 0)
maxwraps = 16;
else
maxwraps *= 2;
m4wraps = xrealloc(m4wraps, maxwraps * sizeof(*m4wraps),
"too many m4wraps");
}
m4wraps[wrapindex++] = xstrdup(text);
}
/*
* dodivert - divert the output to a temporary file
*/

View File

@ -1,4 +1,4 @@
/* $OpenBSD: extern.h,v 1.39 2003/11/17 17:12:10 espie Exp $ */
/* $OpenBSD: extern.h,v 1.40 2005/03/02 10:12:15 espie Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@ -159,7 +159,10 @@ extern char *bbase[]; /* buffer base per ilevel */
extern char ecommt[MAXCCHARS+1];/* end character for comment */
extern char *ep; /* first free char in strspace */
extern char lquote[MAXCCHARS+1];/* left quote character (`) */
extern char *m4wraps; /* m4wrap string default. */
extern char **m4wraps; /* m4wrap string default. */
extern int maxwraps; /* size of m4wraps array */
extern int wrapindex; /* current index in m4wraps */
extern char *null; /* as it says.. just a null. */
extern char rquote[MAXCCHARS+1];/* right quote character (') */
extern char scommt[MAXCCHARS+1];/* start character for comment */

View File

@ -1,4 +1,4 @@
.\" @(#) $OpenBSD: m4.1,v 1.37 2004/05/25 20:24:24 jmc Exp $
.\" @(#) $OpenBSD: m4.1,v 1.38 2005/03/02 10:12:15 espie Exp $
.\"
.\" Copyright (c) 1989, 1993
.\" The Regents of the University of California. All rights reserved.
@ -138,6 +138,7 @@ Activate GNU-m4 compatibility mode.
In this mode, changequote with
two empty parameters deactivates quotes, translit handles simple character
ranges (e.g., a-z), regular expressions mimic emacs behavior,
multiple m4wrap calls are handled as a stack,
and the number of diversions is unlimited.
.It Fl s
Output line synchronization directives, suitable for
@ -294,6 +295,11 @@ usually for cleanup purposes (e.g.,
.Ic m4wrap("cleanup(tempfile)")
causes the macro cleanup to be
invoked after all other processing is done).
.Pp
Multiple calls to
.Fn m4wrap
get inserted in sequence at the final
.Dv EOF .
.It Fn maketemp template
Invokes
.Xr mkstemp 3

View File

@ -1,4 +1,4 @@
/* $OpenBSD: main.c,v 1.65 2005/01/20 23:47:04 espie Exp $ */
/* $OpenBSD: main.c,v 1.66 2005/03/02 10:12:15 espie Exp $ */
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
/*-
@ -43,7 +43,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#else
static char rcsid[] = "$OpenBSD: main.c,v 1.65 2005/01/20 23:47:04 espie Exp $";
static char rcsid[] = "$OpenBSD: main.c,v 1.66 2005/03/02 10:12:15 espie Exp $";
#endif
#endif /* not lint */
@ -83,7 +83,9 @@ FILE *active; /* active output file pointer */
int ilevel = 0; /* input file stack pointer */
int oindex = 0; /* diversion index.. */
char *null = ""; /* as it says.. just a null.. */
char *m4wraps = ""; /* m4wrap string default.. */
char **m4wraps = NULL; /* m4wraps array. */
int maxwraps = 0; /* size of m4wraps array */
int wrapindex = 0; /* current offset in m4wraps */
char lquote[MAXCCHARS+1] = {LQUOTE}; /* left quote character (`) */
char rquote[MAXCCHARS+1] = {RQUOTE}; /* right quote character (') */
char scommt[MAXCCHARS+1] = {SCOMMT}; /* start character for comment */
@ -258,11 +260,24 @@ main(int argc, char *argv[])
release_input(infile);
}
if (*m4wraps) { /* anything for rundown ?? */
if (wrapindex) {
int i;
ilevel = 0; /* in case m4wrap includes.. */
bufbase = bp = buf; /* use the entire buffer */
pbstr(m4wraps); /* user-defined wrapup act */
macro(); /* last will and testament */
if (mimic_gnu) {
while (wrapindex != 0) {
for (i = 0; i < wrapindex; i++)
pbstr(m4wraps[i]);
wrapindex =0;
macro();
}
} else {
for (i = 0; i < wrapindex; i++) {
pbstr(m4wraps[i]);
macro();
}
}
}
if (active != stdout)