Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Convert licenses to hash tables, while here change the name from a dynamic sbuf to a static buffer
Baptiste Daroussin committed 13 years ago
commit 32b3694337013aa459aa00708668b6659c73228e
parent 66aac02
3 files changed +16 -18
modified libpkg/pkg.c
@@ -69,7 +69,7 @@ pkg_new(struct pkg **pkg, pkg_t type)
		return EPKG_FATAL;
	}

-
	STAILQ_INIT(&(*pkg)->licenses);
+
	(*pkg)->licenses = NULL;
	STAILQ_INIT(&(*pkg)->categories);
	STAILQ_INIT(&(*pkg)->deps);
	STAILQ_INIT(&(*pkg)->rdeps);
@@ -406,7 +406,7 @@ pkg_licenses(struct pkg *pkg, struct pkg_license **l)
{
	assert(pkg != NULL);

-
	PKG_LIST_NEXT(&pkg->licenses, *l);
+
	HASH_NEXT(pkg->licenses, (*l));
}

int
@@ -491,25 +491,24 @@ pkg_addlicense(struct pkg *pkg, const char *name)
	assert(name != NULL && name[0] != '\0');
	const char *pkgname;

-
	if (pkg->licenselogic == LICENSE_SINGLE && !STAILQ_EMPTY(&pkg->licenses)) {
+
	if (pkg->licenselogic == LICENSE_SINGLE && HASH_COUNT(pkg->licenses) != 0) {
		pkg_get(pkg, PKG_NAME, &pkgname);
		pkg_emit_error("%s have a single license which is already set",
		    pkgname);
		return (EPKG_FATAL);
	}

-
	while (pkg_licenses(pkg, &l) != EPKG_END) {
-
		if (!strcmp(name, pkg_license_name(l))) {
-
			pkg_emit_error("duplicate license listing: %s, ignoring", name);
-
			return (EPKG_OK);
-
		}
+
	HASH_FIND_STR(pkg->files, name, l);
+
	if (l != NULL) {
+
		pkg_emit_error("duplicate license listing: %s, ignoring", name);
+
		return (EPKG_OK);
	}

	pkg_license_new(&l);

-
	sbuf_set(&l->name, name);
+
	strlcpy(l->name, name, sizeof(l->name));

-
	STAILQ_INSERT_TAIL(&pkg->licenses, l, next);
+
	HASH_ADD_STR(pkg->licenses, name, l);

	return (EPKG_OK);
}
@@ -881,7 +880,7 @@ pkg_list_is_empty(struct pkg *pkg, pkg_list list) {
	case PKG_RDEPS:
		return (STAILQ_EMPTY(&pkg->rdeps));
	case PKG_LICENSES:
-
		return (STAILQ_EMPTY(&pkg->licenses));
+
		return ((HASH_COUNT(pkg->licenses) == 0));
	case PKG_OPTIONS:
		return (STAILQ_EMPTY(&pkg->options));
	case PKG_CATEGORIES:
@@ -905,7 +904,6 @@ void
pkg_list_free(struct pkg *pkg, pkg_list list)  {
	struct pkg_dep *d;
	struct pkg_option *o;
-
	struct pkg_license *l;
	struct pkg_category *c;
	struct pkg_user *u;
	struct pkg_group *g;
@@ -921,7 +919,7 @@ pkg_list_free(struct pkg *pkg, pkg_list list) {
		pkg->flags &= ~PKG_LOAD_RDEPS;
		break;
	case PKG_LICENSES:
-
		LIST_FREE(&pkg->licenses, l, pkg_license_free);
+
		HASH_FREE(pkg->licenses, pkg_license, pkg_license_free);
		pkg->flags &= ~PKG_LOAD_LICENSES;
		break;
	case PKG_OPTIONS:
modified libpkg/pkg_attributes.c
@@ -299,7 +299,6 @@ pkg_license_free(struct pkg_license *l)
	if (l == NULL)
		return;

-
	sbuf_free(l->name);
	free(l);
}

@@ -308,7 +307,7 @@ pkg_license_name(struct pkg_license const * const l)
{
	assert(l != NULL);

-
	return (sbuf_get(l->name));
+
	return (l->name);
}

/*
modified libpkg/private/pkg.h
@@ -73,8 +73,8 @@ struct pkg {
	int64_t		 new_flatsize;
	int64_t		 new_pkgsize;
	struct sbuf	*scripts[PKG_NUM_SCRIPTS];
+
	struct pkg_license *licenses;
	STAILQ_HEAD(categories, pkg_category) categories;
-
	STAILQ_HEAD(licenses, pkg_license) licenses;
	STAILQ_HEAD(deps, pkg_dep) deps;
	STAILQ_HEAD(rdeps, pkg_dep) rdeps;
	struct pkg_file *files;
@@ -99,8 +99,9 @@ struct pkg_dep {
};

struct pkg_license {
-
	struct sbuf	*name;
-
	STAILQ_ENTRY(pkg_license) next;
+
	/* should be enough to match a license name */
+
	char name[64];
+
	UT_hash_handle	hh;
};

struct pkg_category {