mirror of
https://github.com/openbsd/src.git
synced 2025-01-10 06:47:55 -08:00
Remove STRSPACE limitations.
A bit wasteful, but not too intrusive. Also remove pushback buffer limitations, as this would be mostly useless otherwise. Incidentally, pushback buffer overflow detection in pbstr was wrong.
This commit is contained in:
parent
f04846313c
commit
1a15cbca7d
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: extern.h,v 1.7 1999/09/06 13:20:40 espie Exp $ */
|
||||
/* $OpenBSD: extern.h,v 1.8 1999/09/06 13:29:32 espie Exp $ */
|
||||
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
|
||||
|
||||
/*-
|
||||
@ -70,6 +70,8 @@ void pbstr __P((char *));
|
||||
void putback __P((int));
|
||||
void remhash __P((char *, int));
|
||||
void usage __P((void));
|
||||
void initspaces __P((void));
|
||||
char *compute_prevep __P((void));
|
||||
|
||||
extern ndptr hashtab[]; /* hash table for macros etc. */
|
||||
extern stae mstack[]; /* stack of m4 machine */
|
||||
@ -81,12 +83,10 @@ extern int ilevel; /* input file stack pointer */
|
||||
extern int oindex; /* diversion index. */
|
||||
extern int sp; /* current m4 stack pointer */
|
||||
extern pbent *bp; /* first available character */
|
||||
extern pbent buf[]; /* push-back buffer */
|
||||
extern pbent *buf; /* push-back buffer */
|
||||
extern pbent *bufbase; /* buffer base for this ilevel */
|
||||
extern pbent *bbase[]; /* buffer base per ilevel */
|
||||
extern char ecommt[]; /* end character for comment */
|
||||
extern char *endest; /* end of string space */
|
||||
extern pbent *endpbb; /* end of push-back buffer */
|
||||
extern char *ep; /* first free char in strspace */
|
||||
extern char lquote[]; /* left quote character (`) */
|
||||
extern char *m4wraps; /* m4wrap string default. */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: main.c,v 1.13 1999/09/06 13:24:59 espie Exp $ */
|
||||
/* $OpenBSD: main.c,v 1.14 1999/09/06 13:29:32 espie Exp $ */
|
||||
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
|
||||
|
||||
/*-
|
||||
@ -47,7 +47,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.13 1999/09/06 13:24:59 espie Exp $";
|
||||
static char rcsid[] = "$OpenBSD: main.c,v 1.14 1999/09/06 13:29:32 espie Exp $";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -72,15 +72,7 @@ static char rcsid[] = "$OpenBSD: main.c,v 1.13 1999/09/06 13:24:59 espie Exp $";
|
||||
#include "pathnames.h"
|
||||
|
||||
ndptr hashtab[HASHSIZE]; /* hash table for macros etc. */
|
||||
pbent buf[BUFSIZE]; /* push-back buffer */
|
||||
pbent *bufbase = buf; /* the base for current ilevel */
|
||||
pbent *bbase[MAXINP]; /* the base for each ilevel */
|
||||
pbent *bp = buf; /* first available character */
|
||||
pbent *endpbb = buf+BUFSIZE; /* end of push-back buffer */
|
||||
stae mstack[STACKMAX+1]; /* stack of m4 machine */
|
||||
char strspace[STRSPMAX+1]; /* string space for evaluation */
|
||||
char *ep = strspace; /* first free char in strspace */
|
||||
char *endest= strspace+STRSPMAX;/* end of string space */
|
||||
int sp; /* current m4 stack pointer */
|
||||
int fp; /* m4 call frame pointer */
|
||||
FILE *infile[MAXINP]; /* input file stack (0=stdin) */
|
||||
@ -164,6 +156,7 @@ main(argc,argv)
|
||||
signal(SIGINT, onintr);
|
||||
|
||||
initkwds();
|
||||
initspaces();
|
||||
|
||||
while ((c = getopt(argc, argv, "tD:U:o:")) != -1)
|
||||
switch(c) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: mdef.h,v 1.5 1999/09/06 13:10:48 espie Exp $ */
|
||||
/* $OpenBSD: mdef.h,v 1.6 1999/09/06 13:29:32 espie Exp $ */
|
||||
/* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
|
||||
|
||||
/*
|
||||
@ -97,15 +97,15 @@
|
||||
*/
|
||||
|
||||
#define EOS '\0'
|
||||
#define MAXINP 10 /* maximum include files */
|
||||
#define MAXOUT 10 /* maximum # of diversions */
|
||||
#define MAXSTR 512 /* maximum size of string */
|
||||
#define BUFSIZE 4096 /* size of pushback buffer */
|
||||
#define STACKMAX 1024 /* size of call stack */
|
||||
#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 MAXINP 10 /* maximum include files */
|
||||
#define MAXOUT 10 /* maximum # of diversions */
|
||||
#define MAXSTR 512 /* maximum size of string */
|
||||
#define BUFSIZE 4096 /* starting size of pushback buffer */
|
||||
#define STACKMAX 1024 /* size of call stack */
|
||||
#define STRSPMAX 4096 /* starting 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
|
||||
@ -177,6 +177,6 @@ typedef short pbent; /* pushback entry; needs to hold chars + EOF */
|
||||
*/
|
||||
#define PARLEV (mstack[fp].sfra)
|
||||
#define CALTYP (mstack[fp-1].sfra)
|
||||
#define PREVEP (mstack[fp+3].sstr)
|
||||
#define PREVEP compute_prevep()
|
||||
#define PREVSP (fp-3)
|
||||
#define PREVFP (mstack[fp-2].sfra)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: misc.c,v 1.8 1999/09/06 13:20:40 espie Exp $ */
|
||||
/* $OpenBSD: misc.c,v 1.9 1999/09/06 13:29:32 espie Exp $ */
|
||||
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
|
||||
|
||||
/*
|
||||
@ -41,7 +41,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
|
||||
#else
|
||||
static char rcsid[] = "$OpenBSD: misc.c,v 1.8 1999/09/06 13:20:40 espie Exp $";
|
||||
static char rcsid[] = "$OpenBSD: misc.c,v 1.9 1999/09/06 13:29:32 espie Exp $";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -58,6 +58,23 @@ static char rcsid[] = "$OpenBSD: misc.c,v 1.8 1999/09/06 13:20:40 espie Exp $";
|
||||
#include "extern.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
|
||||
char *ep; /* first free char in strspace */
|
||||
static char *strspace; /* string space for evaluation */
|
||||
static char *endest; /* end of string space */
|
||||
static size_t strsize = STRSPMAX;
|
||||
static size_t bufsize = BUFSIZE;
|
||||
static int low_sp = 0;
|
||||
|
||||
pbent *buf; /* push-back buffer */
|
||||
pbent *bufbase; /* the base for current ilevel */
|
||||
pbent *bbase[MAXINP]; /* the base for each ilevel */
|
||||
pbent *bp; /* first available character */
|
||||
static pbent *endpbb; /* end of push-back buffer */
|
||||
|
||||
|
||||
static void enlarge_bufspace();
|
||||
static void enlarge_strspace();
|
||||
/*
|
||||
* find the index of second str in the first str.
|
||||
*/
|
||||
@ -81,10 +98,9 @@ void
|
||||
putback(c)
|
||||
pbent c;
|
||||
{
|
||||
if (bp < endpbb)
|
||||
*bp++ = c;
|
||||
else
|
||||
errx(1, "too many characters pushed back");
|
||||
if (bp >= endpbb)
|
||||
enlarge_bufspace();
|
||||
*bp++ = c;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -96,20 +112,13 @@ void
|
||||
pbstr(s)
|
||||
register char *s;
|
||||
{
|
||||
register char *es;
|
||||
pbent *zp;
|
||||
size_t n;
|
||||
|
||||
es = s;
|
||||
zp = bp;
|
||||
|
||||
while (*es)
|
||||
es++;
|
||||
es--;
|
||||
while (es >= s)
|
||||
if (zp < endpbb)
|
||||
*zp++ = *es--;
|
||||
if ((bp = zp) == endpbb)
|
||||
errx(1, "too many characters pushed back");
|
||||
n = strlen(s);
|
||||
while (endpbb - bp < n)
|
||||
enlarge_bufspace();
|
||||
while (n > 0)
|
||||
*bp++ = s[--n];
|
||||
}
|
||||
|
||||
/*
|
||||
@ -131,6 +140,66 @@ int n;
|
||||
putback('-');
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
initspaces()
|
||||
{
|
||||
int i;
|
||||
|
||||
strspace = xalloc(strsize+1);
|
||||
ep = strspace;
|
||||
endest = strspace+strsize;
|
||||
buf = (pbent *)xalloc(bufsize * sizeof(pbent));
|
||||
bufbase = buf;
|
||||
bp = buf;
|
||||
endpbb = buf + bufsize;
|
||||
for (i = 0; i < MAXINP; i++)
|
||||
bbase[i] = buf;
|
||||
}
|
||||
|
||||
/* XXX when chrsave is called, the current argument is
|
||||
* always topmost on the stack. We make use of this to
|
||||
* duplicate it transparently, and to reclaim the correct
|
||||
* space when the stack is unwound.
|
||||
*/
|
||||
static
|
||||
void enlarge_strspace()
|
||||
{
|
||||
char *newstrspace;
|
||||
|
||||
low_sp = sp;
|
||||
strsize *= 2;
|
||||
newstrspace = malloc(strsize + 1);
|
||||
if (!newstrspace)
|
||||
errx(1, "string space overflow");
|
||||
memcpy(newstrspace, strspace, strsize/2);
|
||||
/* reclaim memory in the easy, common case. */
|
||||
if (ep == strspace)
|
||||
free(strspace);
|
||||
mstack[sp].sstr = (mstack[sp].sstr-strspace) + newstrspace;
|
||||
ep = (ep-strspace) + newstrspace;
|
||||
strspace = newstrspace;
|
||||
endest = strspace + strsize;
|
||||
}
|
||||
|
||||
static
|
||||
void enlarge_bufspace()
|
||||
{
|
||||
pbent *newbuf;
|
||||
int i;
|
||||
|
||||
bufsize *= 2;
|
||||
newbuf = realloc(buf, bufsize*sizeof(pbent));
|
||||
if (!newbuf)
|
||||
errx(1, "too many characters pushed back");
|
||||
for (i = 0; i < MAXINP; i++)
|
||||
bbase[i] = (bbase[i]-buf)+newbuf;
|
||||
bp = (bp-buf)+newbuf;
|
||||
bufbase = (bufbase-buf)+newbuf;
|
||||
buf = newbuf;
|
||||
endpbb = buf+strsize;
|
||||
}
|
||||
|
||||
/*
|
||||
* chrsave - put single char on string space
|
||||
*/
|
||||
@ -138,10 +207,25 @@ void
|
||||
chrsave(c)
|
||||
char c;
|
||||
{
|
||||
if (ep < endest)
|
||||
*ep++ = c;
|
||||
if (ep >= endest)
|
||||
enlarge_strspace();
|
||||
*ep++ = c;
|
||||
}
|
||||
|
||||
/*
|
||||
* so we reclaim what string space we can
|
||||
*/
|
||||
char *
|
||||
compute_prevep()
|
||||
{
|
||||
if (fp+3 <= low_sp)
|
||||
{
|
||||
return strspace;
|
||||
}
|
||||
else
|
||||
errx(1, "string space overflow");
|
||||
{
|
||||
return mstack[fp+3].sstr;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user