aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2023-02-08 06:02:56 +0000
committerKyle Evans <kevans@FreeBSD.org>2023-02-08 06:09:19 +0000
commit29c5f8bf9a011d92462977bae59b4889ec5d95ad (patch)
tree4cab26952f363ad1c95e2951202a7e2709352438
parent2ffdc21324bd1772fa2f40efed3987afecabf5cb (diff)
downloadsrc-29c5f8bf9a011d92462977bae59b4889ec5d95ad.tar.gz
src-29c5f8bf9a011d92462977bae59b4889ec5d95ad.zip
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
-rw-r--r--usr.sbin/config/Makefile6
-rw-r--r--usr.sbin/config/mkmakefile.cc (renamed from usr.sbin/config/mkmakefile.c)52
2 files changed, 23 insertions, 35 deletions
diff --git a/usr.sbin/config/Makefile b/usr.sbin/config/Makefile
index 32bfa8de0a0e..241a501f52af 100644
--- a/usr.sbin/config/Makefile
+++ b/usr.sbin/config/Makefile
@@ -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
diff --git a/usr.sbin/config/mkmakefile.c b/usr.sbin/config/mkmakefile.cc
index 9f103c0e5214..2aabb9e0f347 100644
--- a/usr.sbin/config/mkmakefile.c
+++ b/usr.sbin/config/mkmakefile.cc
@@ -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"));