diff --git a/src/poolid.c b/src/poolid.c index 52d98c38f..868ddbf3f 100644 --- a/src/poolid.c +++ b/src/poolid.c @@ -38,7 +38,7 @@ pool_str2id(Pool *pool, const char *str, int create) } Id -pool_strn2id(Pool *pool, const char *str, unsigned int len, int create) +pool_strn2id(Pool *pool, const char *str, size_t len, int create) { int oldnstrings = pool->ss.nstrings; Id id = stringpool_strn2id(&pool->ss, str, len, create); diff --git a/src/poolid.h b/src/poolid.h index f832ff4b3..8adf00ca0 100644 --- a/src/poolid.h +++ b/src/poolid.h @@ -13,6 +13,8 @@ #ifndef LIBSOLV_POOLID_H #define LIBSOLV_POOLID_H +#include + #include "pooltypes.h" #include "hash.h" @@ -30,8 +32,8 @@ typedef struct s_Reldep { int flags; /* operation/relation, see REL_x in pool.h */ } Reldep; -extern Id pool_str2id(Pool *pool, const char *, int); -extern Id pool_strn2id(Pool *pool, const char *, unsigned int, int); +extern Id pool_str2id(Pool *pool, const char *str, int create); +extern Id pool_strn2id(Pool *pool, const char *str, size_t len, int create); extern Id pool_rel2id(Pool *pool, Id, Id, int, int); extern const char *pool_id2str(const Pool *pool, Id); extern const char *pool_id2rel(const Pool *pool, Id); diff --git a/src/repo.c b/src/repo.c index b266d8d57..2aba25893 100644 --- a/src/repo.c +++ b/src/repo.c @@ -1423,7 +1423,7 @@ repo_set_num(Repo *repo, Id p, Id keyname, unsigned long long num) } void -repo_set_str(Repo *repo, Id p, Id keyname, const char *str) +repo_set_strn(Repo *repo, Id p, Id keyname, const char *str, size_t l) { Repodata *data; if (p >= 0) @@ -1434,12 +1434,18 @@ repo_set_str(Repo *repo, Id p, Id keyname, const char *str) case SOLVABLE_ARCH: case SOLVABLE_EVR: case SOLVABLE_VENDOR: - repo_set_id(repo, p, keyname, pool_str2id(repo->pool, str, 1)); + repo_set_id(repo, p, keyname, pool_strn2id(repo->pool, str, l, 1)); return; } } data = repo_last_repodata(repo); - repodata_set_str(data, p, keyname, str); + repodata_set_strn(data, p, keyname, str, l); +} + +void +repo_set_str(Repo *repo, Id p, Id keyname, const char *str) +{ + repo_set_strn(repo, p, keyname, str, strlen(str)); } void diff --git a/src/repo.h b/src/repo.h index b503431af..b173d7324 100644 --- a/src/repo.h +++ b/src/repo.h @@ -194,6 +194,7 @@ Id solv_depmarker(Id keyname, Id marker); void repo_set_id(Repo *repo, Id p, Id keyname, Id id); void repo_set_num(Repo *repo, Id p, Id keyname, unsigned long long num); +void repo_set_strn(Repo *repo, Id p, Id keyname, const char *str, size_t l); void repo_set_str(Repo *repo, Id p, Id keyname, const char *str); void repo_set_poolstr(Repo *repo, Id p, Id keyname, const char *str); void repo_add_poolstr_array(Repo *repo, Id p, Id keyname, const char *str); diff --git a/src/repodata.c b/src/repodata.c index 72f03d488..53d4d8ddd 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -2513,20 +2513,24 @@ repodata_set_void(Repodata *data, Id solvid, Id keyname) } void -repodata_set_str(Repodata *data, Id solvid, Id keyname, const char *str) +repodata_set_strn(Repodata *data, Id solvid, Id keyname, const char *str, size_t l) { Repokey key; - int l; - - l = strlen(str) + 1; key.name = keyname; key.type = REPOKEY_TYPE_STR; key.size = 0; key.storage = KEY_STORAGE_INCORE; - data->attrdata = solv_extend(data->attrdata, data->attrdatalen, l, 1, REPODATA_ATTRDATA_BLOCK); + data->attrdata = solv_extend(data->attrdata, data->attrdatalen, l + 1, 1, REPODATA_ATTRDATA_BLOCK); + data->attrdata[l] = '\0'; memcpy(data->attrdata + data->attrdatalen, str, l); repodata_set(data, solvid, &key, data->attrdatalen); - data->attrdatalen += l; + data->attrdatalen += l + 1; +} + +void +repodata_set_str(Repodata *data, Id solvid, Id keyname, const char *str) +{ + repodata_set_strn(data, solvid, keyname, str, strlen(str)); } void @@ -2691,20 +2695,6 @@ repodata_set_poolstrn(Repodata *data, Id solvid, Id keyname, const char *str, in repodata_set_id(data, solvid, keyname, id); } -static inline void -repodata_set_strn(Repodata *data, Id solvid, Id keyname, const char *str, int l) -{ - if (!str[l]) - repodata_set_str(data, solvid, keyname, str); - else - { - char *s = solv_strdup(str); - s[l] = 0; - repodata_set_str(data, solvid, keyname, s); - free(s); - } -} - void repodata_set_location(Repodata *data, Id solvid, int medianr, const char *dir, const char *file) { diff --git a/src/repodata.h b/src/repodata.h index 2504f2aed..547a91e2e 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -262,6 +262,7 @@ Id repodata_new_handle(Repodata *data); void repodata_set_void(Repodata *data, Id solvid, Id keyname); void repodata_set_num(Repodata *data, Id solvid, Id keyname, unsigned long long num); void repodata_set_id(Repodata *data, Id solvid, Id keyname, Id id); +void repodata_set_strn(Repodata *data, Id solvid, Id keyname, const char *str, size_t l); void repodata_set_str(Repodata *data, Id solvid, Id keyname, const char *str); void repodata_set_binary(Repodata *data, Id solvid, Id keyname, void *buf, int len); /* create id from string, then set_id */ diff --git a/src/solvable.c b/src/solvable.c index 657a8b828..931d54103 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -578,10 +578,16 @@ solvable_set_num(Solvable *s, Id keyname, unsigned long long num) repo_set_num(s->repo, s - s->repo->pool->solvables, keyname, num); } +void +solvable_set_strn(Solvable *s, Id keyname, const char *str, size_t l) +{ + repo_set_strn(s->repo, s - s->repo->pool->solvables, keyname, str, l); +} + void solvable_set_str(Solvable *s, Id keyname, const char *str) { - repo_set_str(s->repo, s - s->repo->pool->solvables, keyname, str); + solvable_set_strn(s, keyname, str, strlen(str)); } void diff --git a/src/solvable.h b/src/solvable.h index 4b26661ac..44c05ee02 100644 --- a/src/solvable.h +++ b/src/solvable.h @@ -82,6 +82,7 @@ unsigned int solvable_lookup_count(Solvable *s, Id keyname); /* internal */ /* setter functions */ void solvable_set_id(Solvable *s, Id keyname, Id id); void solvable_set_num(Solvable *s, Id keyname, unsigned long long num); +void solvable_set_strn(Solvable *s, Id keyname, const char *str, size_t l); void solvable_set_str(Solvable *s, Id keyname, const char *str); void solvable_set_poolstr(Solvable *s, Id keyname, const char *str); void solvable_add_poolstr_array(Solvable *s, Id keyname, const char *str);