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

from netbsd:

Handle multichar comment and quote delimiters (up to 5 characters, per the
manual page). Takes care of PR#485.
This commit is contained in:
deraadt 1996-01-15 01:12:11 +00:00
parent 7b421e29b2
commit 29a0bfdc53
4 changed files with 100 additions and 38 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: eval.c,v 1.4 1995/09/28 05:37:28 tls Exp $ */
/* $NetBSD: eval.c,v 1.5 1996/01/13 23:25:23 pk Exp $ */
/*
* Copyright (c) 1989, 1993
@ -40,7 +40,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
#else
static char rcsid[] = "$NetBSD: eval.c,v 1.4 1995/09/28 05:37:28 tls Exp $";
static char rcsid[] = "$NetBSD: eval.c,v 1.5 1996/01/13 23:25:23 pk Exp $";
#endif
#endif /* not lint */
@ -236,15 +236,24 @@ register int td;
* argv[2])
*/
if (argc > 3) {
int k;
for (n = argc - 1; n > 3; n--) {
putback(rquote);
k = strlen(rquote);
while (k--)
putback(rquote[k]);
pbstr(argv[n]);
putback(lquote);
k = strlen(lquote);
while (k--)
putback(lquote[k]);
putback(',');
}
putback(rquote);
k = strlen(rquote);
while (k--)
putback(rquote[k]);
pbstr(argv[3]);
putback(lquote);
k = strlen(lquote);
while (k--)
putback(lquote[k]);
}
break;
@ -473,9 +482,13 @@ char *name;
register ndptr p;
if ((p = lookup(name)) != nil && p->defn != null) {
putback(rquote);
int n = strlen(rquote);
while (n--)
putback(rquote[n]);
pbstr(p->defn);
putback(lquote);
n = strlen(lquote);
while (n--)
putback(lquote[n]);
}
}
@ -605,17 +618,17 @@ register int argc;
{
if (argc > 2) {
if (*argv[2])
lquote = *argv[2];
strncpy(lquote, argv[2], MAXCCHARS);
if (argc > 3) {
if (*argv[3])
rquote = *argv[3];
strncpy(rquote, argv[3], MAXCCHARS);
}
else
rquote = lquote;
strcpy(rquote, lquote);
}
else {
lquote = LQUOTE;
rquote = RQUOTE;
lquote[0] = LQUOTE, lquote[1] = '\0';
rquote[0] = RQUOTE, rquote[1] = '\0';
}
}
@ -629,17 +642,17 @@ register int argc;
{
if (argc > 2) {
if (*argv[2])
scommt = *argv[2];
strncpy(scommt, argv[2], MAXCCHARS);
if (argc > 3) {
if (*argv[3])
ecommt = *argv[3];
strncpy(ecommt, argv[3], MAXCCHARS);
}
else
ecommt = ECOMMT;
ecommt[0] = ECOMMT, ecommt[1] = '\0';
}
else {
scommt = SCOMMT;
ecommt = ECOMMT;
scommt[0] = SCOMMT, scommt[1] = '\0';
ecommt[0] = ECOMMT, ecommt[1] = '\0';
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: extern.h,v 1.2 1995/09/28 05:37:34 tls Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -85,14 +85,14 @@ extern char *bp; /* first available character */
extern char buf[]; /* push-back buffer */
extern char *bufbase; /* buffer base for this ilevel */
extern char *bbase[]; /* buffer base per ilevel */
extern char ecommt; /* end character for comment */
extern char ecommt[]; /* end character for comment */
extern char *endest; /* end of string space */
extern char *endpbb; /* end of push-back buffer */
extern char *ep; /* first free char in strspace */
extern char lquote; /* left quote character (`) */
extern char lquote[]; /* left quote character (`) */
extern char *m4temp; /* filename for diversions */
extern char *m4wraps; /* m4wrap string default. */
extern char *null; /* as it says.. just a null. */
extern char *progname; /* program name */
extern char rquote; /* right quote character (') */
extern char scommt; /* start character for comment */
extern char rquote[]; /* right quote character (') */
extern char scommt[]; /* start character for comment */

View File

@ -1,4 +1,4 @@
/* $NetBSD: main.c,v 1.10 1995/09/29 00:27:51 cgd Exp $ */
/* $NetBSD: main.c,v 1.11 1996/01/13 23:25:26 pk Exp $ */
/*-
* Copyright (c) 1989, 1993
@ -46,7 +46,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#else
static char rcsid[] = "$NetBSD: main.c,v 1.10 1995/09/29 00:27:51 cgd Exp $";
static char rcsid[] = "$NetBSD: main.c,v 1.11 1996/01/13 23:25:26 pk Exp $";
#endif
#endif /* not lint */
@ -89,10 +89,10 @@ int oindex = 0; /* diversion index.. */
char *null = ""; /* as it says.. just a null.. */
char *m4wraps = ""; /* m4wrap string default.. */
char *progname; /* name of this program */
char lquote = LQUOTE; /* left quote character (`) */
char rquote = RQUOTE; /* right quote character (') */
char scommt = SCOMMT; /* start character for comment */
char ecommt = ECOMMT; /* end character for comment */
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 */
char ecommt[MAXCCHARS+1] = {ECOMMT}; /* end character for comment */
struct keyblk keywrds[] = { /* m4 keywords to be installed */
"include", INCLTYPE,
@ -242,6 +242,38 @@ main(argc,argv)
ndptr inspect();
/*
* Look ahead (at most MAXCCHARS characters) for `token'.
* (on input `t == token[0]')
* Used for comment and quoting delimiters.
* Returns 1 if `token' present; copied to output.
* 0 if `token' not found; all characters pushed back
*/
int
do_look_ahead(t, token)
int t;
char *token;
{
int i;
if (t != token[0])
oops("internal error", "");
for (i = 1; *++token; i++) {
t = gpbc();
if (t == EOF || t != *token) {
if (t != EOF)
putback(t);
while (--i)
putback(*--token);
return 0;
}
}
return 1;
}
#define LOOK_AHEAD(t, token) ((t)==(token)[0] && do_look_ahead(t,token))
/*
* macro - the work horse..
*/
@ -254,7 +286,8 @@ macro() {
register int nlpar;
cycle {
if ((t = gpbc()) == '_' || isalpha(t)) {
t = gpbc();
if (t == '_' || isalpha(t)) {
putback(t);
if ((p = inspect(s = token)) == nil) {
if (sp < 0)
@ -300,12 +333,13 @@ macro() {
* non-alpha single-char token seen..
* [the order of else if .. stmts is important.]
*/
else if (t == lquote) { /* strip quotes */
else if (LOOK_AHEAD(t,lquote)) { /* strip quotes */
nlpar = 1;
do {
if ((l = gpbc()) == rquote)
l = gpbc();
if (LOOK_AHEAD(l,rquote))
nlpar--;
else if (l == lquote)
else if (LOOK_AHEAD(l,lquote))
nlpar++;
else if (l == EOF)
oops("missing right quote", "");
@ -319,12 +353,26 @@ macro() {
while (nlpar != 0);
}
else if (sp < 0) { /* not in a macro at all */
if (t == scommt) { /* comment handling here */
else if (sp < 0 && LOOK_AHEAD(t, scommt)) {
int i;
for (i = 0; i < MAXCCHARS && scommt[i]; i++)
putc(scommt[i], active);
for(;;) {
t = gpbc();
if (LOOK_AHEAD(t, ecommt)) {
for (i = 0; i < MAXCCHARS && ecommt[i];
i++)
putc(ecommt[i], active);
break;
}
if (t == EOF)
break;
putc(t, active);
while ((t = gpbc()) != ecommt)
putc(t, active);
}
}
else if (sp < 0) { /* not in a macro at all */
putc(t, active); /* output directly.. */
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: mdef.h,v 1.6 1995/09/28 05:37:39 tls Exp $ */
/* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
/*
* Copyright (c) 1989, 1993
@ -104,6 +104,7 @@
#define STRSPMAX 4096 /* size of string space */
#define MAXTOK MAXSTR /* maximum chars in a tokn */
#define HASHSIZE 199 /* maximum size of hashtab */
#define MAXCCHARS 5 /* max size of comment/quote delim */
#define ALL 1
#define TOP 0