config: make changes to allow some parts to build as C++
Highlights: - Avoid keywords (this, not) as variable names - Move yyparse into config.h with other declarations - All declarations in config.h are assumed guilty until proven innocent - Some const-correctness - Casting malloc/calloc returns Note that we're not building any C++ here yet, this will be introduced in other commits to replace some of the lib dependencies. Reducing the number of FreeBSD-specific dependencies we have reduces some friction for building our bootstrap tools independently in other environments. Reviewed by: imp Sponsored by: Klara, Inc. Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D38274
This commit is contained in:
parent
2e9d05fd68
commit
2ffdc21324
@ -35,12 +35,15 @@
|
||||
/*
|
||||
* Config.
|
||||
*/
|
||||
#include <sys/cdefs.h> /* __BEGIN_DECLS/__END_DECLS */
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
struct cfgfile {
|
||||
STAILQ_ENTRY(cfgfile) cfg_next;
|
||||
char *cfg_path;
|
||||
@ -190,6 +193,7 @@ char *raisestr(char *);
|
||||
void remember(const char *);
|
||||
void moveifchanged(const char *, const char *);
|
||||
int yylex(void);
|
||||
int yyparse(void);
|
||||
void options(void);
|
||||
void makefile(void);
|
||||
void makeenv(void);
|
||||
@ -218,5 +222,7 @@ extern int versreq;
|
||||
extern char *PREFIX; /* Config file name - for error messages */
|
||||
extern char srcdir[]; /* root of the kernel source tree */
|
||||
|
||||
__END_DECLS;
|
||||
|
||||
#define eq(a,b) (!strcmp(a,b))
|
||||
#define ns(s) strdup(s)
|
||||
|
@ -105,10 +105,9 @@ static void cleanheaders(char *);
|
||||
static void kernconfdump(const char *);
|
||||
static void badversion(void);
|
||||
static void checkversion(void);
|
||||
extern int yyparse(void);
|
||||
|
||||
struct hdr_list {
|
||||
char *h_name;
|
||||
const char *h_name;
|
||||
struct hdr_list *h_next;
|
||||
} *htab;
|
||||
|
||||
@ -620,10 +619,12 @@ moveifchanged(const char *from_name, const char *to_name)
|
||||
tsize = (size_t)from_sb.st_size;
|
||||
|
||||
if (!changed) {
|
||||
p = mmap(NULL, tsize, PROT_READ, MAP_SHARED, from_fd, (off_t)0);
|
||||
p = (char *)mmap(NULL, tsize, PROT_READ, MAP_SHARED, from_fd,
|
||||
(off_t)0);
|
||||
if (p == MAP_FAILED)
|
||||
err(EX_OSERR, "mmap %s", from_name);
|
||||
q = mmap(NULL, tsize, PROT_READ, MAP_SHARED, to_fd, (off_t)0);
|
||||
q = (char *)mmap(NULL, tsize, PROT_READ, MAP_SHARED, to_fd,
|
||||
(off_t)0);
|
||||
if (q == MAP_FAILED)
|
||||
err(EX_OSERR, "mmap %s", to_name);
|
||||
|
||||
@ -688,7 +689,7 @@ cleanheaders(char *p)
|
||||
void
|
||||
remember(const char *file)
|
||||
{
|
||||
char *s;
|
||||
const char *s;
|
||||
struct hdr_list *hl;
|
||||
|
||||
if ((s = strrchr(file, '/')) != NULL)
|
||||
@ -697,16 +698,16 @@ remember(const char *file)
|
||||
s = ns(file);
|
||||
|
||||
if (strchr(s, '_') && strncmp(s, "opt_", 4) != 0) {
|
||||
free(s);
|
||||
free(__DECONST(char *, s));
|
||||
return;
|
||||
}
|
||||
for (hl = htab; hl != NULL; hl = hl->h_next) {
|
||||
if (eq(s, hl->h_name)) {
|
||||
free(s);
|
||||
free(__DECONST(char *, s));
|
||||
return;
|
||||
}
|
||||
}
|
||||
hl = calloc(1, sizeof(*hl));
|
||||
hl = (struct hdr_list *)calloc(1, sizeof(*hl));
|
||||
if (hl == NULL)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
hl->h_name = s;
|
||||
@ -740,7 +741,7 @@ kernconfdump(const char *file)
|
||||
if (fp == NULL)
|
||||
err(EXIT_FAILURE, "fdopen() failed");
|
||||
osz = 1024;
|
||||
o = calloc(1, osz);
|
||||
o = (char *)calloc(1, osz);
|
||||
if (o == NULL)
|
||||
err(EXIT_FAILURE, "Couldn't allocate memory");
|
||||
/* ELF note section header. */
|
||||
|
@ -392,9 +392,9 @@ read_file(char *fname)
|
||||
struct file_list *tp;
|
||||
struct device *dp;
|
||||
struct opt *op;
|
||||
char *wd, *this, *compilewith, *depends, *clean, *warning;
|
||||
char *wd, *rfile, *compilewith, *depends, *clean, *warning;
|
||||
const char *objprefix;
|
||||
int compile, match, nreqs, std, filetype, not,
|
||||
int compile, match, nreqs, std, filetype, negate,
|
||||
imp_rule, no_ctfconvert, no_obj, before_depend, nowerror;
|
||||
|
||||
fp = fopen(fname, "r");
|
||||
@ -434,13 +434,13 @@ read_file(char *fname)
|
||||
;
|
||||
goto next;
|
||||
}
|
||||
this = ns(wd);
|
||||
rfile = ns(wd);
|
||||
wd = get_word(fp);
|
||||
if (wd == (char *)EOF)
|
||||
return;
|
||||
if (wd == NULL)
|
||||
errout("%s: No type for %s.\n", fname, this);
|
||||
tp = fl_lookup(this);
|
||||
errout("%s: No type for %s.\n", fname, rfile);
|
||||
tp = fl_lookup(rfile);
|
||||
compile = 0;
|
||||
match = 1;
|
||||
nreqs = 0;
|
||||
@ -454,25 +454,25 @@ read_file(char *fname)
|
||||
no_obj = 0;
|
||||
before_depend = 0;
|
||||
nowerror = 0;
|
||||
not = 0;
|
||||
negate = 0;
|
||||
filetype = NORMAL;
|
||||
objprefix = "";
|
||||
if (eq(wd, "standard"))
|
||||
std = 1;
|
||||
else if (!eq(wd, "optional"))
|
||||
errout("%s: \"%s\" %s must be optional or standard\n",
|
||||
fname, wd, this);
|
||||
fname, wd, rfile);
|
||||
for (wd = get_word(fp); wd; wd = get_word(fp)) {
|
||||
if (wd == (char *)EOF)
|
||||
return;
|
||||
if (eq(wd, "!")) {
|
||||
not = 1;
|
||||
negate = 1;
|
||||
continue;
|
||||
}
|
||||
if (eq(wd, "|")) {
|
||||
if (nreqs == 0)
|
||||
errout("%s: syntax error describing %s\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
compile += match;
|
||||
match = 1;
|
||||
nreqs = 0;
|
||||
@ -491,7 +491,7 @@ read_file(char *fname)
|
||||
errout("%s: alternate rule required when "
|
||||
"\"no-implicit-rule\" is specified for"
|
||||
" %s.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
imp_rule++;
|
||||
continue;
|
||||
}
|
||||
@ -503,7 +503,7 @@ read_file(char *fname)
|
||||
wd = get_quoted_word(fp);
|
||||
if (wd == (char *)EOF || wd == NULL)
|
||||
errout("%s: %s missing dependency string.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
depends = ns(wd);
|
||||
continue;
|
||||
}
|
||||
@ -511,7 +511,7 @@ read_file(char *fname)
|
||||
wd = get_quoted_word(fp);
|
||||
if (wd == (char *)EOF || wd == NULL)
|
||||
errout("%s: %s missing clean file list.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
clean = ns(wd);
|
||||
continue;
|
||||
}
|
||||
@ -519,7 +519,7 @@ read_file(char *fname)
|
||||
wd = get_quoted_word(fp);
|
||||
if (wd == (char *)EOF || wd == NULL)
|
||||
errout("%s: %s missing compile command string.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
compilewith = ns(wd);
|
||||
continue;
|
||||
}
|
||||
@ -527,7 +527,7 @@ read_file(char *fname)
|
||||
wd = get_quoted_word(fp);
|
||||
if (wd == (char *)EOF || wd == NULL)
|
||||
errout("%s: %s missing warning text string.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
warning = ns(wd);
|
||||
continue;
|
||||
}
|
||||
@ -535,7 +535,7 @@ read_file(char *fname)
|
||||
wd = get_quoted_word(fp);
|
||||
if (wd == (char *)EOF || wd == NULL)
|
||||
errout("%s: %s missing object prefix string.\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
objprefix = ns(wd);
|
||||
continue;
|
||||
}
|
||||
@ -554,10 +554,10 @@ read_file(char *fname)
|
||||
nreqs++;
|
||||
if (std)
|
||||
errout("standard entry %s has optional inclusion specifier %s!\n",
|
||||
this, wd);
|
||||
rfile, wd);
|
||||
STAILQ_FOREACH(dp, &dtab, d_next)
|
||||
if (eq(dp->d_name, wd)) {
|
||||
if (not)
|
||||
if (negate)
|
||||
match = 0;
|
||||
else
|
||||
dp->d_done |= DEVDONE;
|
||||
@ -566,21 +566,21 @@ read_file(char *fname)
|
||||
SLIST_FOREACH(op, &opt, op_next)
|
||||
if (op->op_value == 0 &&
|
||||
strcasecmp(op->op_name, wd) == 0) {
|
||||
if (not)
|
||||
if (negate)
|
||||
match = 0;
|
||||
goto nextparam;
|
||||
}
|
||||
match &= not;
|
||||
match &= negate;
|
||||
nextparam:;
|
||||
not = 0;
|
||||
negate = 0;
|
||||
}
|
||||
compile += match;
|
||||
if (compile && tp == NULL) {
|
||||
if (std == 0 && nreqs == 0)
|
||||
errout("%s: what is %s optional on?\n",
|
||||
fname, this);
|
||||
fname, rfile);
|
||||
tp = new_fent();
|
||||
tp->f_fn = this;
|
||||
tp->f_fn = rfile;
|
||||
tp->f_type = filetype;
|
||||
if (filetype == LOCAL)
|
||||
tp->f_srcprefix = "";
|
||||
|
@ -312,41 +312,41 @@ tooption(char *name)
|
||||
|
||||
|
||||
static void
|
||||
check_duplicate(const char *fname, const char *this)
|
||||
check_duplicate(const char *fname, const char *chkopt)
|
||||
{
|
||||
struct opt_list *po;
|
||||
|
||||
SLIST_FOREACH(po, &otab, o_next) {
|
||||
if (eq(po->o_name, this)) {
|
||||
if (eq(po->o_name, chkopt)) {
|
||||
fprintf(stderr, "%s: Duplicate option %s.\n",
|
||||
fname, this);
|
||||
fname, chkopt);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
insert_option(const char *fname, char *this, char *val)
|
||||
insert_option(const char *fname, char *optname, char *val)
|
||||
{
|
||||
struct opt_list *po;
|
||||
|
||||
check_duplicate(fname, this);
|
||||
check_duplicate(fname, optname);
|
||||
po = (struct opt_list *) calloc(1, sizeof *po);
|
||||
if (po == NULL)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
po->o_name = this;
|
||||
po->o_name = optname;
|
||||
po->o_file = val;
|
||||
po->o_flags = 0;
|
||||
SLIST_INSERT_HEAD(&otab, po, o_next);
|
||||
}
|
||||
|
||||
static void
|
||||
update_option(const char *this, char *val, int flags)
|
||||
update_option(const char *optname, char *val, int flags)
|
||||
{
|
||||
struct opt_list *po;
|
||||
|
||||
SLIST_FOREACH(po, &otab, o_next) {
|
||||
if (eq(po->o_name, this)) {
|
||||
if (eq(po->o_name, optname)) {
|
||||
free(po->o_file);
|
||||
po->o_file = val;
|
||||
po->o_flags = flags;
|
||||
@ -364,7 +364,7 @@ static int
|
||||
read_option_file(const char *fname, int flags)
|
||||
{
|
||||
FILE *fp;
|
||||
char *wd, *this, *val;
|
||||
char *wd, *optname, *val;
|
||||
char genopt[MAXPATHLEN];
|
||||
|
||||
fp = fopen(fname, "r");
|
||||
@ -378,17 +378,17 @@ read_option_file(const char *fname, int flags)
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
this = ns(wd);
|
||||
optname = ns(wd);
|
||||
val = get_word(fp);
|
||||
if (val == (char *)EOF)
|
||||
return (1);
|
||||
if (val == NULL) {
|
||||
if (flags) {
|
||||
fprintf(stderr, "%s: compat file requires two"
|
||||
" words per line at %s\n", fname, this);
|
||||
" words per line at %s\n", fname, optname);
|
||||
exit(1);
|
||||
}
|
||||
char *s = ns(this);
|
||||
char *s = ns(optname);
|
||||
(void)snprintf(genopt, sizeof(genopt), "opt_%s.h",
|
||||
lower(s));
|
||||
val = genopt;
|
||||
@ -396,9 +396,9 @@ read_option_file(const char *fname, int flags)
|
||||
}
|
||||
val = ns(val);
|
||||
if (flags == 0)
|
||||
insert_option(fname, this, val);
|
||||
insert_option(fname, optname, val);
|
||||
else
|
||||
update_option(this, val, flags);
|
||||
update_option(optname, val, flags);
|
||||
}
|
||||
(void)fclose(fp);
|
||||
return (1);
|
||||
|
Loading…
Reference in New Issue
Block a user