mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-29 06:42:45 +00:00
Fix some problems that affect multiple file inclusion. Bruce found
this bug and submitted these patches to dunstan@. He sent them to me to test, and I discovered they were needed for the atmel kernel config files. Since we were playing with them in the terminal room after the developer's summit today, I thought I'd go ahead and commit them to allow those folks that now have atmel hardware (thanks Andre) a chance to try it out w/o my help. Since dunstan@ is asleep right now, risk stepping on his toes a little by going ahead and committing this change. Submitted by: dunstan@, bde@ Tested by: bde@
This commit is contained in:
parent
7db977fb07
commit
c1f4dd9355
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=169647
@ -177,7 +177,7 @@ void headers(void);
|
||||
void cfgfile_add(const char *);
|
||||
void cfgfile_removeall(void);
|
||||
|
||||
extern STAILQ_HEAD(device_head, device) dtab, rmdtab;
|
||||
extern STAILQ_HEAD(device_head, device) dtab;
|
||||
|
||||
extern char errbuf[80];
|
||||
extern int yyline;
|
||||
|
@ -78,7 +78,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
struct device_head dtab, rmdtab;
|
||||
struct device_head dtab;
|
||||
char *ident;
|
||||
char *env;
|
||||
int envmode;
|
||||
@ -105,9 +105,6 @@ devopt(char *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rmoptall(struct opt_head *list, struct opt_head *torem);
|
||||
static void rmdevall(struct device_head *dh, struct device_head *torem);
|
||||
|
||||
%}
|
||||
%%
|
||||
Configuration:
|
||||
@ -177,7 +174,7 @@ Config_spec:
|
||||
OPTIONS Opt_list
|
||||
|
|
||||
NOOPTION Save_id
|
||||
= { rmopt_schedule(&rmopts, $2); } |
|
||||
= { rmopt_schedule(&opt, $2); } |
|
||||
MAKEOPTIONS Mkopt_list
|
||||
|
|
||||
NOMAKEOPTION Save_id
|
||||
@ -305,10 +302,10 @@ NoDevice:
|
||||
= {
|
||||
char *s = devopt($1);
|
||||
|
||||
rmopt_schedule(&rmopts, s);
|
||||
rmopt_schedule(&opt, s);
|
||||
free(s);
|
||||
/* and the device part */
|
||||
rmdev_schedule(&rmdtab, $1);
|
||||
rmdev_schedule(&dtab, $1);
|
||||
} ;
|
||||
|
||||
%%
|
||||
@ -323,17 +320,14 @@ yyerror(const char *s)
|
||||
int
|
||||
yywrap(void)
|
||||
{
|
||||
|
||||
if (found_defaults == 0 && incignore == 0) {
|
||||
if (freopen("DEFAULTS", "r", stdin) == NULL)
|
||||
return 1;
|
||||
yyfile = "DEFAULTS";
|
||||
if (found_defaults) {
|
||||
if (freopen(PREFIX, "r", stdin) == NULL)
|
||||
err(2, "%s", PREFIX);
|
||||
yyfile = PREFIX;
|
||||
yyline = 0;
|
||||
found_defaults = 1;
|
||||
found_defaults = 0;
|
||||
return 0;
|
||||
}
|
||||
rmoptall(&opt, &rmopts);
|
||||
rmdevall(&dtab, &rmdtab);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -391,29 +385,10 @@ rmdev_schedule(struct device_head *dh, char *name)
|
||||
{
|
||||
struct device *dp;
|
||||
|
||||
dp = calloc(1, sizeof(struct device));
|
||||
dp->d_name = strdup(name);
|
||||
assert(dp->d_name != NULL);
|
||||
STAILQ_INSERT_HEAD(dh, dp, d_next);
|
||||
}
|
||||
|
||||
/*
|
||||
* Take care a devices previously scheduled for removal.
|
||||
*/
|
||||
static void
|
||||
rmdevall(struct device_head *dh, struct device_head *torem)
|
||||
{
|
||||
struct device *dp, *rdp;
|
||||
|
||||
while (!STAILQ_EMPTY(torem)) {
|
||||
dp = STAILQ_FIRST(torem);
|
||||
STAILQ_REMOVE_HEAD(torem, d_next);
|
||||
rdp = finddev(dh, dp->d_name);
|
||||
if (rdp != NULL) {
|
||||
STAILQ_REMOVE(dh, rdp, device, d_next);
|
||||
free(rdp->d_name);
|
||||
free(rdp);
|
||||
}
|
||||
dp = finddev(dh, name);
|
||||
if (dp != NULL) {
|
||||
STAILQ_REMOVE(dh, dp, device, d_next);
|
||||
free(dp->d_name);
|
||||
free(dp);
|
||||
}
|
||||
}
|
||||
@ -469,31 +444,10 @@ rmopt_schedule(struct opt_head *list, char *name)
|
||||
{
|
||||
struct opt *op;
|
||||
|
||||
op = calloc(1, sizeof(*op));
|
||||
op->op_name = ns(name);
|
||||
SLIST_INSERT_HEAD(list, op, op_next);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove all options that were scheduled for removal.
|
||||
*/
|
||||
static void
|
||||
rmoptall(struct opt_head *list, struct opt_head *torem)
|
||||
{
|
||||
struct opt *op, *rop;
|
||||
|
||||
op = rop = NULL;
|
||||
while (!SLIST_EMPTY(torem)) {
|
||||
op = SLIST_FIRST(torem);
|
||||
SLIST_REMOVE_HEAD(torem, op_next);
|
||||
rop = findopt(list, op->op_name);
|
||||
if (rop != NULL) {
|
||||
SLIST_REMOVE(list, rop, opt, op_next);
|
||||
free(rop->op_name);
|
||||
if (rop->op_value != NULL)
|
||||
free(rop->op_value);
|
||||
free(rop);
|
||||
}
|
||||
op = findopt(list, name);
|
||||
if (op != NULL) {
|
||||
SLIST_REMOVE(list, op, opt, op_next);
|
||||
free(op->op_name);
|
||||
free(op);
|
||||
}
|
||||
}
|
||||
|
@ -150,14 +150,14 @@ main(int argc, char **argv)
|
||||
usage();
|
||||
|
||||
PREFIX = *argv;
|
||||
/*
|
||||
* We mark lack of DEFAULTS here. Once we hit EOF in PREFIX, yywrap()
|
||||
* will try to bring DEFAULTS to the playground, if this exists.
|
||||
*/
|
||||
found_defaults = 0;
|
||||
if (freopen(PREFIX, "r", stdin) == NULL)
|
||||
err(2, "%s", PREFIX);
|
||||
yyfile = PREFIX;
|
||||
if (freopen("DEFAULTS", "r", stdin) != NULL) {
|
||||
found_defaults = 1;
|
||||
yyfile = "DEFAULTS";
|
||||
} else {
|
||||
if (freopen(PREFIX, "r", stdin) == NULL)
|
||||
err(2, "%s", PREFIX);
|
||||
yyfile = PREFIX;
|
||||
}
|
||||
if (*destdir != '\0') {
|
||||
len = strlen(destdir);
|
||||
while (len > 1 && destdir[len - 1] == '/')
|
||||
@ -184,7 +184,6 @@ main(int argc, char **argv)
|
||||
STAILQ_INIT(&fntab);
|
||||
STAILQ_INIT(&ftab);
|
||||
STAILQ_INIT(&hints);
|
||||
STAILQ_INIT(&rmdtab);
|
||||
if (yyparse())
|
||||
exit(3);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user