config: drop dependency on libnv

Compile mkmakefile.c as C++ instead and use an std::unordered_map to
accomplish the same goal.

Reviewed by:	imp
Sponsored by:	Klara, Inc.
Sponsored by:	NetApp, Inc.
Differential Revision:	https://reviews.freebsd.org/D38275
This commit is contained in:
Kyle Evans 2023-02-08 00:02:56 -06:00
parent 2ffdc21324
commit 29c5f8bf9a
2 changed files with 23 additions and 35 deletions

View File

@ -3,9 +3,9 @@
SRCDIR:=${.PARSEDIR:tA}
PROG= config
PROG_CXX= config
MAN= config.5 config.8
SRCS= config.y main.c lang.l mkmakefile.c mkheaders.c \
SRCS= config.y main.c lang.l mkmakefile.cc mkheaders.c \
mkoptions.c y.tab.h kernconf.c
FILE2C?=file2c
@ -18,7 +18,7 @@ CFLAGS+= -I. -I${SRCDIR}
NO_WMISSING_VARIABLE_DECLARATIONS=
LIBADD= nv sbuf
LIBADD= sbuf
CLEANFILES+= kernconf.c

View File

@ -42,6 +42,7 @@ static const char rcsid[] =
* the information in the files files and the
* additional files for the machine being compiled to.
*/
#include <sys/param.h>
#include <ctype.h>
#include <err.h>
@ -49,13 +50,15 @@ static const char rcsid[] =
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/cnv.h>
#include <sys/nv.h>
#include <sys/param.h>
#include <string>
#include <unordered_map>
#include "y.tab.h"
#include "config.h"
#include "configvers.h"
typedef std::unordered_map<std::string, std::string> env_map;
static char *tail(char *);
static void do_clean(FILE *);
static void do_rules(FILE *);
@ -66,8 +69,8 @@ static void read_files(void);
static void sanitize_envline(char *result, const char *src);
static bool preprocess(char *line, char *result);
static void process_into_file(char *line, FILE *ofp);
static void process_into_nvlist(char *line, nvlist_t *nvl);
static void dump_nvlist(nvlist_t *nvl, FILE *ofp);
static void process_into_map(char *line, env_map &emap);
static void dump_map(env_map &emap, FILE *ofp);
static void errout(const char *fmt, ...)
{
@ -267,35 +270,24 @@ process_into_file(char *line, FILE *ofp)
}
static void
process_into_nvlist(char *line, nvlist_t *nvl)
process_into_map(char *line, env_map &emap)
{
char result[BUFSIZ], *s;
if (preprocess(line, result)) {
s = strchr(result, '=');
*s = '\0';
if (nvlist_exists(nvl, result))
nvlist_free(nvl, result);
nvlist_add_string(nvl, result, s + 1);
emap[result] = s + 1;
}
}
static void
dump_nvlist(nvlist_t *nvl, FILE *ofp)
dump_map(env_map &emap, FILE *ofp)
{
const char *name;
void *cookie;
if (nvl == NULL)
return;
while (!nvlist_empty(nvl)) {
cookie = NULL;
name = nvlist_next(nvl, NULL, &cookie);
fprintf(ofp, "\"%s=%s\\0\"\n", name,
cnvlist_get_string(cookie));
cnvlist_free_string(cookie);
for (auto iter : emap) {
fprintf(ofp, "\"%s=%s\\0\"\n", iter.first.c_str(),
iter.second.c_str());
}
}
@ -306,7 +298,7 @@ void
makehints(void)
{
FILE *ifp, *ofp;
nvlist_t *nvl;
env_map emap;
char line[BUFSIZ];
struct hint *hint;
@ -324,17 +316,15 @@ makehints(void)
fprintf(ofp, "int hintmode = %d;\n",
!STAILQ_EMPTY(&hints) ? 1 : 0);
fprintf(ofp, "char static_hints[] = {\n");
nvl = nvlist_create(0);
STAILQ_FOREACH(hint, &hints, hint_next) {
ifp = fopen(hint->hint_name, "r");
if (ifp == NULL)
err(1, "%s", hint->hint_name);
while (fgets(line, BUFSIZ, ifp) != NULL)
process_into_nvlist(line, nvl);
dump_nvlist(nvl, ofp);
process_into_map(line, emap);
dump_map(emap, ofp);
fclose(ifp);
}
nvlist_destroy(nvl);
fprintf(ofp, "\"\\0\"\n};\n");
fclose(ofp);
moveifchanged(path("hints.c.new"), path("hints.c"));
@ -347,7 +337,7 @@ void
makeenv(void)
{
FILE *ifp, *ofp;
nvlist_t *nvl;
env_map emap;
char line[BUFSIZ];
struct envvar *envvar;
@ -365,20 +355,18 @@ makeenv(void)
fprintf(ofp, "int envmode = %d;\n",
!STAILQ_EMPTY(&envvars) ? 1 : 0);
fprintf(ofp, "char static_env[] = {\n");
nvl = nvlist_create(0);
STAILQ_FOREACH(envvar, &envvars, envvar_next) {
if (envvar->env_is_file) {
ifp = fopen(envvar->env_str, "r");
if (ifp == NULL)
err(1, "%s", envvar->env_str);
while (fgets(line, BUFSIZ, ifp) != NULL)
process_into_nvlist(line, nvl);
dump_nvlist(nvl, ofp);
process_into_map(line, emap);
dump_map(emap, ofp);
fclose(ifp);
} else
process_into_file(envvar->env_str, ofp);
}
nvlist_destroy(nvl);
fprintf(ofp, "\"\\0\"\n};\n");
fclose(ofp);
moveifchanged(path("env.c.new"), path("env.c"));