Synchronize with OpenBSD
Obtained from: OpenBSD
This commit is contained in:
parent
22dd259656
commit
af288ae5ce
@ -43,7 +43,6 @@ extern unsigned long expansion_id;
|
||||
|
||||
/* expr.c */
|
||||
extern int expr(const char *);
|
||||
extern int32_t end_result;
|
||||
|
||||
/* gnum4.c */
|
||||
extern void addtoincludepath(const char *);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: gnum4.c,v 1.46 2014/07/10 14:12:31 espie Exp $ */
|
||||
/* $OpenBSD: gnum4.c,v 1.50 2015/04/29 00:13:26 millert Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 Marc Espie
|
||||
@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
|
||||
* functions needed to support gnu-m4 extensions, including a fake freezing
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <ctype.h>
|
||||
@ -40,10 +39,12 @@ __FBSDID("$FreeBSD$");
|
||||
#include <regex.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include "mdef.h"
|
||||
#include "stdd.h"
|
||||
#include "extern.h"
|
||||
@ -76,9 +77,7 @@ new_path_entry(const char *dirname)
|
||||
n = malloc(sizeof(struct path_entry));
|
||||
if (!n)
|
||||
errx(1, "out of memory");
|
||||
n->name = strdup(dirname);
|
||||
if (!n->name)
|
||||
errx(1, "out of memory");
|
||||
n->name = xstrdup(dirname);
|
||||
n->next = 0;
|
||||
return n;
|
||||
}
|
||||
@ -113,9 +112,7 @@ ensure_m4path(void)
|
||||
if (!envpath)
|
||||
return;
|
||||
/* for portability: getenv result is read-only */
|
||||
envpath = strdup(envpath);
|
||||
if (!envpath)
|
||||
errx(1, "out of memory");
|
||||
envpath = xstrdup(envpath);
|
||||
for (sweep = envpath;
|
||||
(path = strsep(&sweep, ":")) != NULL;)
|
||||
addtoincludepath(path);
|
||||
@ -126,7 +123,7 @@ static
|
||||
struct input_file *
|
||||
dopath(struct input_file *i, const char *filename)
|
||||
{
|
||||
char path[MAXPATHLEN];
|
||||
char path[PATH_MAX];
|
||||
struct path_entry *pe;
|
||||
FILE *f;
|
||||
|
||||
@ -214,8 +211,11 @@ addchars(const char *c, size_t n)
|
||||
while (current + n > bufsize) {
|
||||
if (bufsize == 0)
|
||||
bufsize = 1024;
|
||||
else
|
||||
else if (bufsize <= SIZE_MAX/2) {
|
||||
bufsize *= 2;
|
||||
} else {
|
||||
errx(1, "size overflow");
|
||||
}
|
||||
buffer = xrealloc(buffer, bufsize, NULL);
|
||||
}
|
||||
memcpy(buffer+current, c, n);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: look.c,v 1.23 2014/05/12 19:11:19 espie Exp $ */
|
||||
/* $OpenBSD: look.c,v 1.24 2014/12/21 09:33:12 espie Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1989, 1993
|
||||
@ -56,6 +56,9 @@ static void hash_free(void *, void *);
|
||||
static void *element_alloc(size_t, void *);
|
||||
static void setup_definition(struct macro_definition *, const char *,
|
||||
const char *);
|
||||
static void free_definition(char *);
|
||||
static void keep(char *);
|
||||
static int string_in_use(const char *);
|
||||
|
||||
static struct ohash_info macro_info = {
|
||||
offsetof(struct ndblock, name),
|
||||
@ -155,7 +158,7 @@ macro_define(const char *name, const char *defn)
|
||||
ndptr n = create_entry(name);
|
||||
if (n->d != NULL) {
|
||||
if (n->d->defn != null)
|
||||
free(n->d->defn);
|
||||
free_definition(n->d->defn);
|
||||
} else {
|
||||
n->d = xalloc(sizeof(struct macro_definition), NULL);
|
||||
n->d->next = NULL;
|
||||
@ -273,3 +276,64 @@ macro_getbuiltin(const char *name)
|
||||
else
|
||||
return p;
|
||||
}
|
||||
|
||||
/* XXX things are slightly more complicated than they seem.
|
||||
* a macro may actually be "live" (in the middle of an expansion
|
||||
* on the stack.
|
||||
* So we actually may need to place it in an array for later...
|
||||
*/
|
||||
|
||||
static int kept_capacity = 0;
|
||||
static int kept_size = 0;
|
||||
static char **kept = NULL;
|
||||
|
||||
static void
|
||||
keep(char *ptr)
|
||||
{
|
||||
if (kept_capacity <= kept_size) {
|
||||
if (kept_capacity)
|
||||
kept_capacity *= 2;
|
||||
else
|
||||
kept_capacity = 50;
|
||||
kept = xreallocarray(kept, kept_capacity,
|
||||
sizeof(char *), "Out of memory while saving %d strings\n",
|
||||
kept_capacity);
|
||||
}
|
||||
kept[kept_size++] = ptr;
|
||||
}
|
||||
|
||||
static int
|
||||
string_in_use(const char *ptr)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i <= sp; i++) {
|
||||
if (sstack[i] == STORAGE_MACRO && mstack[i].sstr == ptr)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_definition(char *ptr)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* first try to free old strings */
|
||||
for (i = 0; i < kept_size; i++) {
|
||||
if (!string_in_use(kept[i])) {
|
||||
kept_size--;
|
||||
free(kept[i]);
|
||||
if (i != kept_size)
|
||||
kept[i] = kept[kept_size];
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
/* then deal with us */
|
||||
if (string_in_use(ptr))
|
||||
keep(ptr);
|
||||
else
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 12, 2014
|
||||
.Dd $Mdocdate: April 14 2014 $
|
||||
.Dt M4 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -98,7 +98,9 @@ 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 Pf = Ns Ar value
|
||||
.It Fl D Ns Ar name Ns Oo
|
||||
.Pf = Ns Ar value
|
||||
.Oc
|
||||
Define the symbol
|
||||
.Ar name
|
||||
to have some value (or
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: main.c,v 1.83 2014/05/12 19:11:19 espie Exp $ */
|
||||
/* $OpenBSD: main.c,v 1.84 2014/12/21 09:33:12 espie Exp $ */
|
||||
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
|
||||
|
||||
/*-
|
||||
@ -144,6 +144,9 @@ static struct keyblk keywrds[] = { /* m4 keywords to be installed */
|
||||
|
||||
#define MAXKEYS (sizeof(keywrds)/sizeof(struct keyblk))
|
||||
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
|
||||
#define MAXRECORD 50
|
||||
static struct position {
|
||||
char *name;
|
||||
@ -396,7 +399,7 @@ macro(void)
|
||||
/*
|
||||
* now push the string arguments:
|
||||
*/
|
||||
pushs1(macro_getdef(p)->defn); /* defn string */
|
||||
pushdef(p); /* defn string */
|
||||
pushs1((char *)macro_name(p)); /* macro name */
|
||||
pushs(ep); /* start next..*/
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: mdef.h,v 1.31 2011/09/27 07:24:02 espie Exp $ */
|
||||
/* $OpenBSD: mdef.h,v 1.32 2014/12/21 09:33:12 espie Exp $ */
|
||||
/* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
|
||||
|
||||
/*
|
||||
@ -164,6 +164,10 @@ struct input_file {
|
||||
int c;
|
||||
};
|
||||
|
||||
#define STORAGE_STRSPACE 0
|
||||
#define STORAGE_MACRO 1
|
||||
#define STORAGE_OTHER 2
|
||||
|
||||
#define CURRENT_NAME (infile[ilevel].name)
|
||||
#define CURRENT_LINE (infile[ilevel].lineno)
|
||||
/*
|
||||
@ -179,7 +183,7 @@ struct input_file {
|
||||
if (++sp == (int)STACKMAX) \
|
||||
enlarge_stack();\
|
||||
mstack[sp].sfra = (x); \
|
||||
sstack[sp] = 0; \
|
||||
sstack[sp] = STORAGE_OTHER; \
|
||||
} while (0)
|
||||
|
||||
#define pushs(x) \
|
||||
@ -187,7 +191,7 @@ struct input_file {
|
||||
if (++sp == (int)STACKMAX) \
|
||||
enlarge_stack();\
|
||||
mstack[sp].sstr = (x); \
|
||||
sstack[sp] = 1; \
|
||||
sstack[sp] = STORAGE_STRSPACE; \
|
||||
} while (0)
|
||||
|
||||
#define pushs1(x) \
|
||||
@ -195,9 +199,18 @@ struct input_file {
|
||||
if (++sp == (int)STACKMAX) \
|
||||
enlarge_stack();\
|
||||
mstack[sp].sstr = (x); \
|
||||
sstack[sp] = 0; \
|
||||
sstack[sp] = STORAGE_OTHER; \
|
||||
} while (0)
|
||||
|
||||
#define pushdef(p) \
|
||||
do { \
|
||||
if (++sp == (int)STACKMAX) \
|
||||
enlarge_stack();\
|
||||
mstack[sp].sstr = macro_getdef(p)->defn;\
|
||||
sstack[sp] = STORAGE_MACRO; \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*
|
||||
* . .
|
||||
* | . | <-- sp | . |
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: misc.c,v 1.44 2014/05/12 19:11:19 espie Exp $ */
|
||||
/* $OpenBSD: misc.c,v 1.45 2014/12/21 09:33:12 espie Exp $ */
|
||||
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
|
||||
|
||||
/*
|
||||
@ -64,6 +64,7 @@ unsigned char *bbase[MAXINP]; /* the base for each ilevel */
|
||||
unsigned char *bp; /* first available character */
|
||||
unsigned char *endpbb; /* end of push-back buffer */
|
||||
|
||||
|
||||
/*
|
||||
* find the index of second str in the first str.
|
||||
*/
|
||||
@ -186,7 +187,7 @@ enlarge_strspace(void)
|
||||
errx(1, "string space overflow");
|
||||
memcpy(newstrspace, strspace, strsize/2);
|
||||
for (i = 0; i <= sp; i++)
|
||||
if (sstack[i])
|
||||
if (sstack[i] == STORAGE_STRSPACE)
|
||||
mstack[i].sstr = (mstack[i].sstr - strspace)
|
||||
+ newstrspace;
|
||||
ep = (ep-strspace) + newstrspace;
|
||||
@ -264,7 +265,7 @@ killdiv(void)
|
||||
extern char *__progname;
|
||||
|
||||
void
|
||||
m4errx(int exitstatus, const char *fmt, ...)
|
||||
m4errx(int eval, const char *fmt, ...)
|
||||
{
|
||||
fprintf(stderr, "%s: ", __progname);
|
||||
fprintf(stderr, "%s at line %lu: ", CURRENT_NAME, CURRENT_LINE);
|
||||
@ -276,7 +277,7 @@ m4errx(int exitstatus, const char *fmt, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
exit(exitstatus);
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -19,15 +19,9 @@
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "mdef.h"
|
||||
#include "extern.h"
|
||||
|
||||
#define YYSTYPE int32_t
|
||||
|
||||
extern int32_t end_result;
|
||||
extern int yylex(void);
|
||||
extern int yyerror(const char *);
|
||||
%}
|
||||
|
Loading…
Reference in New Issue
Block a user