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:
Kyle Evans 2023-02-08 00:02:56 -06:00
parent 2e9d05fd68
commit 2ffdc21324
4 changed files with 52 additions and 45 deletions

View File

@ -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)

View File

@ -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. */

View File

@ -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 = "";

View File

@ -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);