Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
libpkg: replace pkg_set with a _Generic one
Baptiste Daroussin committed 3 years ago
commit 10c1b55fc4ca5e1bc78ae9b633b87e670c9938eb
parent 2f040df
4 files changed +192 -151
modified libpkg/libpkg.ver
@@ -147,9 +147,12 @@ global:
	pkg_repos_total_count;
	pkg_requires;
	pkg_script_get;
-
	pkg_set2;
+
	pkg_set_b;
	pkg_set_debug_level;
+
	pkg_set_i;
+
	pkg_set_invalid;
	pkg_set_rootdir;
+
	pkg_set_s;
	pkg_shlibs_provided;
	pkg_shlibs_required;
	pkg_shutdown;
modified libpkg/pkg.c
@@ -182,155 +182,183 @@ pkg_is_valid(const struct pkg * restrict pkg)
	return (EPKG_OK);
}

-
static int
-
pkg_vset(struct pkg *pkg, va_list ap)
+
int
+
pkg_set_i(struct pkg *pkg, pkg_attr attr, int64_t val)
{
-
	int attr;
-
	const char *buf;
-
	ucl_object_t *obj;
-

-
	while ((attr = va_arg(ap, int)) > 0) {
-
		if (attr >= PKG_ATTR_NUM_FIELDS || attr <= 0) {
-
			pkg_emit_error("Bad argument on pkg_set %d", attr);
-
			return (EPKG_FATAL);
-
		}
-

-
		switch (attr) {
-
		case PKG_ATTR_NAME:
-
			free(pkg->name);
-
			pkg->name = xstrdup(va_arg(ap, const char *));
-
			free(pkg->uid);
-
			pkg->uid = xstrdup(pkg->name);
-
			break;
-
		case PKG_ATTR_ORIGIN:
-
			free(pkg->origin);
-
			pkg->origin = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_VERSION:
-
			free(pkg->version);
-
			pkg->version = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_COMMENT:
-
			free(pkg->comment);
-
			pkg->comment = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_DESC:
-
			free(pkg->desc);
-
			pkg->desc = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_MTREE:
-
			(void)va_arg(ap, const char *);
-
			break;
-
		case PKG_ATTR_MESSAGE:
-
			tll_free_and_free(pkg->message, pkg_message_free);
-
			buf = va_arg(ap, const char *);
-
			if (*buf == '[') {
-
				pkg_message_from_str(pkg, buf, strlen(buf));
-
			} else {
-
				obj = ucl_object_fromstring_common(buf, strlen(buf),
-
				    UCL_STRING_RAW|UCL_STRING_TRIM);
-
				pkg_message_from_ucl(pkg, obj);
-
				ucl_object_unref(obj);
-
			}
-
			break;
-
		case PKG_ATTR_ARCH:
-
			free(pkg->arch);
-
			pkg->arch = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_ABI:
-
			free(pkg->abi);
-
			pkg->abi = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_MAINTAINER:
-
			free(pkg->maintainer);
-
			pkg->maintainer = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_WWW:
-
			free(pkg->www);
-
			pkg->www = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_PREFIX:
-
			free(pkg->prefix);
-
			pkg->prefix = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_REPOPATH:
-
			free(pkg->repopath);
-
			pkg->repopath = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_CKSUM:
-
			free(pkg->sum);
-
			pkg->sum = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_OLD_VERSION:
-
			free(pkg->old_version);
-
			pkg->old_version = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_REPONAME:
-
			free(pkg->reponame);
-
			pkg->reponame = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_REPOURL:
-
			free(pkg->repourl);
-
			pkg->repourl = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_DIGEST:
-
			free(pkg->digest);
-
			pkg->digest = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_REASON:
-
			free(pkg->reason);
-
			pkg->reason = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_FLATSIZE:
-
			pkg->flatsize = va_arg(ap, int64_t);
-
			break;
-
		case PKG_ATTR_OLD_FLATSIZE:
-
			pkg->old_flatsize = va_arg(ap, int64_t);
-
			break;
-
		case PKG_ATTR_PKGSIZE:
-
			pkg->pkgsize = va_arg(ap, int64_t);
-
			break;
-
		case PKG_ATTR_LICENSE_LOGIC:
-
			pkg->licenselogic = (lic_t)va_arg(ap, int);
-
			break;
-
		case PKG_ATTR_AUTOMATIC:
-
			pkg->automatic = (bool)va_arg(ap, int);
-
			break;
-
		case PKG_ATTR_ROWID:
-
			pkg->id = va_arg(ap, int64_t);
-
			break;
-
		case PKG_ATTR_LOCKED:
-
			pkg->locked = (bool)va_arg(ap, int);
-
			break;
-
		case PKG_ATTR_TIME:
-
			pkg->timestamp = va_arg(ap, int64_t);
-
			break;
-
		case PKG_ATTR_DEP_FORMULA:
-
			free(pkg->dep_formula);
-
			pkg->dep_formula = xstrdup(va_arg(ap, const char *));
-
			break;
-
		case PKG_ATTR_VITAL:
-
			pkg->vital = (bool)va_arg(ap, int);
-
			break;
-
		}
+
	switch (attr) {
+
	case PKG_ATTR_FLATSIZE:
+
		pkg->flatsize = val;
+
		break;
+
	case PKG_ATTR_OLD_FLATSIZE:
+
		pkg->old_flatsize = val;
+
		break;
+
	case PKG_ATTR_PKGSIZE:
+
		pkg->pkgsize = val;
+
		break;
+
	case PKG_ATTR_TIME:
+
		pkg->timestamp = val;
+
		break;
+
	default:
+
		pkg_emit_error("%d does not accept int64_t values", attr);
+
		return (EPKG_FATAL);
	}
-

	return (EPKG_OK);
}

int
-
pkg_set2(struct pkg *pkg, ...)
+
pkg_set_b(struct pkg *pkg, pkg_attr attr, bool boolean)
{
-
	int ret = EPKG_OK;
-
	va_list ap;
-

-
	assert(pkg != NULL);
-

-
	va_start(ap, pkg);
-
	ret = pkg_vset(pkg, ap);
-
	va_end(ap);
+
	switch (attr) {
+
	case PKG_ATTR_AUTOMATIC:
+
		pkg->automatic = boolean;
+
		break;
+
	case PKG_ATTR_LOCKED:
+
		pkg->automatic = boolean;
+
		break;
+
	case PKG_ATTR_VITAL:
+
		pkg->vital = boolean;
+
		break;
+
	default:
+
		pkg_emit_error("%d does not accept bool values", attr);
+
		return (EPKG_FATAL);
+
	}
+
	return (EPKG_OK);
+
}

-
	return (ret);
+
int
+
pkg_set_s(struct pkg *pkg, pkg_attr attr, const char *str)
+
{
+
	char *endptr;
+
	ucl_object_t *obj;
+
	int64_t i;
+

+
	switch (attr) {
+
	case PKG_ATTR_NAME:
+
		free(pkg->name);
+
		pkg->name = xstrdup(str);
+
		free(pkg->uid);
+
		pkg->name = xstrdup(str);
+
		break;
+
	case PKG_ATTR_ORIGIN:
+
		free(pkg->origin);
+
		pkg->origin = xstrdup(str);
+
		break;
+
	case PKG_ATTR_VERSION:
+
		free(pkg->version);
+
		pkg->version = xstrdup(str);
+
		break;
+
	case PKG_ATTR_DESC:
+
		free(pkg->desc);
+
		pkg->desc = xstrdup(str);
+
		break;
+
	case PKG_ATTR_COMMENT:
+
		free(pkg->comment);
+
		pkg->comment = xstrdup(str);
+
		break;
+
	case PKG_ATTR_MESSAGE:
+
		tll_free_and_free(pkg->message, pkg_message_free);
+
		if (*str == '[') {
+
			pkg_message_from_str(pkg, str, strlen(str));
+
		} else {
+
			obj = ucl_object_fromstring_common(str, strlen(str),
+
			    UCL_STRING_RAW|UCL_STRING_TRIM);
+
			pkg_message_from_ucl(pkg, obj);
+
			ucl_object_unref(obj);
+
		}
+
		break;
+
	case PKG_ATTR_ARCH:
+
		free(pkg->arch);
+
		pkg->arch = xstrdup(str);
+
		break;
+
	case PKG_ATTR_ABI:
+
		free(pkg->abi);
+
		pkg->abi = xstrdup(str);
+
		break;
+
	case PKG_ATTR_MAINTAINER:
+
		free(pkg->maintainer);
+
		pkg->maintainer = xstrdup(str);
+
		break;
+
	case PKG_ATTR_WWW:
+
		free(pkg->www);
+
		pkg->www = xstrdup(str);
+
		break;
+
	case PKG_ATTR_PREFIX:
+
		free(pkg->prefix);
+
		pkg->prefix = xstrdup(str);
+
		break;
+
	case PKG_ATTR_REPOPATH:
+
		free(pkg->repopath);
+
		pkg->repopath = xstrdup(str);
+
		break;
+
	case PKG_ATTR_CKSUM:
+
		free(pkg->sum);
+
		pkg->sum = xstrdup(str);
+
		break;
+
	case PKG_ATTR_OLD_VERSION:
+
		free(pkg->old_version);
+
		pkg->old_version = xstrdup(str);
+
		break;
+
	case PKG_ATTR_REPONAME:
+
		free(pkg->reponame);
+
		pkg->reponame = xstrdup(str);
+
		break;
+
	case PKG_ATTR_REPOURL:
+
		free(pkg->repourl);
+
		pkg->repourl = xstrdup(str);
+
		break;
+
	case PKG_ATTR_DIGEST:
+
		free(pkg->digest);
+
		pkg->digest = xstrdup(str);
+
		break;
+
	case PKG_ATTR_REASON:
+
		free(pkg->reason);
+
		pkg->reason = xstrdup(str);
+
		break;
+
	case PKG_ATTR_DEP_FORMULA:
+
		free(pkg->dep_formula);
+
		pkg->dep_formula = xstrdup(str);
+
		break;
+
	case PKG_ATTR_FLATSIZE:
+
		i = strtoimax(str, &endptr, 10);
+
		if (endptr != NULL) {
+
			pkg_emit_error("Impossible to convert '%s' to int64_t",
+
			    str);
+
			return (EPKG_FATAL);
+
		}
+
		pkg->flatsize = i;
+
		break;
+
	case PKG_ATTR_OLD_FLATSIZE:
+
		i = strtoimax(str, &endptr, 10);
+
		if (endptr != NULL) {
+
			pkg_emit_error("Impossible to convert '%s' to int64_t",
+
			    str);
+
			return (EPKG_FATAL);
+
		}
+
		pkg->old_flatsize = i;
+
		break;
+
	case PKG_ATTR_PKGSIZE:
+
		i = strtoimax(str, &endptr, 10);
+
		if (endptr != NULL) {
+
			pkg_emit_error("Impossible to convert '%s' to int64_t",
+
			    str);
+
			return (EPKG_FATAL);
+
		}
+
		pkg->pkgsize = i;
+
		break;
+
	case PKG_ATTR_TIME:
+
		i = strtoimax(str, &endptr, 10);
+
		if (endptr != NULL) {
+
			pkg_emit_error("Impossible to convert '%s' to int64_t",
+
			    str);
+
			return (EPKG_FATAL);
+
		}
+
		pkg->timestamp = i;
+
		break;
+
	default:
+
		pkg_emit_error("%d does not accept string values", attr);
+
		return (EPKG_FATAL);
+
	}
+
	return (EPKG_OK);
}

int
modified libpkg/pkg.h.in
@@ -719,12 +719,6 @@ int pkg_config_files(const struct pkg *pkg, struct pkg_config_file **cf);

int pkg_analyse_files(struct pkgdb *, struct pkg *, const char *);

-
/**
-
 * Generic setter for simple attributes.
-
 */
-
int pkg_set2(struct pkg *pkg, ...);
-
#define pkg_set(pkg, ...) pkg_set2(pkg, __VA_ARGS__, -1)
-

int pkgdb_set2(struct pkgdb *db, struct pkg *pkg, ...);
#define pkgdb_set(db, pkg, ...) pkgdb_set2(db, pkg, __VA_ARGS__, -1)

@@ -1783,6 +1777,16 @@ pkg_get_invalid(struct pkg *p __unused, pkg_attr a __unused, void *v __unused)
	abort();
}

+
int pkg_set_s(struct pkg *pkg, pkg_attr a, const char *val);
+
int pkg_set_i(struct pkg *pkg, pkg_attr a, int64_t i);
+
int pkg_set_b(struct pkg *pkg, pkg_attr a, bool b);
+
static inline int
+
pkg_set_invalid(struct pkg *p __unused, pkg_attr a __unused, void *v __unused)
+
{
+
	fprintf(stderr, "Invalid attribute type for pkg_set\n");
+
	abort();
+
}
+

#define pkg_get(p, t, a) _Generic((a), \
	const char **: pkg_get_s, \
	int64_t *: pkg_get_i, \
@@ -1791,6 +1795,13 @@ pkg_get_invalid(struct pkg *p __unused, pkg_attr a __unused, void *v __unused)
	struct pkg_stringlist **: pkg_get_sl, \
	default: pkg_get_invalid)(p, t, a)

+
#define pkg_set(p, t, a) _Generic((a), \
+
	const char *: pkg_set_s, \
+
	char *: pkg_set_s, \
+
	int64_t: pkg_set_i, \
+
	bool: pkg_set_b, \
+
	default: pkg_set_invalid)(p, t, a)
+

#ifdef __cplusplus
}
#endif
modified src/audit.c
@@ -298,10 +298,9 @@ exec_audit(int argc, char **argv)
			}
			if (pkg_new(&pkg, PKG_FILE) != EPKG_OK)
				err(EXIT_FAILURE, "malloc");
+
			pkg_set(pkg, PKG_ATTR_NAME, name);
			if (version != NULL)
-
				pkg_set(pkg, PKG_ATTR_NAME, name, PKG_ATTR_VERSION, version);
-
			else
-
				pkg_set(pkg, PKG_ATTR_NAME, name);
+
				pkg_set(pkg, PKG_ATTR_VERSION, version);
			add_to_check(check, pkg);
			pkg = NULL;
		}