X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpoolid.c;h=3a8a3c8050086c7678ebaebc1b0cba04d75ac9ba;hb=refs%2Fchanges%2F97%2F194197%2F1;hp=d5f6bb2b33818a859d78a275466b729ec9424e09;hpb=e2a47f38496014e671b9e9ca7b6f0db1839af78d;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/poolid.c b/src/poolid.c index d5f6bb2..3a8a3c8 100644 --- a/src/poolid.c +++ b/src/poolid.c @@ -31,7 +31,7 @@ pool_str2id(Pool *pool, const char *str, int create) if (create && pool->whatprovides && oldnstrings != pool->ss.nstrings && (id & WHATPROVIDES_BLOCK) == 0) { /* grow whatprovides array */ - pool->whatprovides = sat_realloc(pool->whatprovides, (id + (WHATPROVIDES_BLOCK + 1)) * sizeof(Offset)); + pool->whatprovides = solv_realloc(pool->whatprovides, (id + (WHATPROVIDES_BLOCK + 1)) * sizeof(Offset)); memset(pool->whatprovides + id, 0, (WHATPROVIDES_BLOCK + 1) * sizeof(Offset)); } return id; @@ -45,7 +45,7 @@ pool_strn2id(Pool *pool, const char *str, unsigned int len, int create) if (create && pool->whatprovides && oldnstrings != pool->ss.nstrings && (id & WHATPROVIDES_BLOCK) == 0) { /* grow whatprovides array */ - pool->whatprovides = sat_realloc(pool->whatprovides, (id + (WHATPROVIDES_BLOCK + 1)) * sizeof(Offset)); + pool->whatprovides = solv_realloc(pool->whatprovides, (id + (WHATPROVIDES_BLOCK + 1)) * sizeof(Offset)); memset(pool->whatprovides + id, 0, (WHATPROVIDES_BLOCK + 1) * sizeof(Offset)); } return id; @@ -54,9 +54,7 @@ pool_strn2id(Pool *pool, const char *str, unsigned int len, int create) Id pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) { - Hashval h; - unsigned int hh; - Hashmask hashmask; + Hashval h, hh, hashmask; int i; Id id; Hashtable hashtbl; @@ -65,14 +63,14 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) hashmask = pool->relhashmask; hashtbl = pool->relhashtbl; ran = pool->rels; - + /* extend hashtable if needed */ - if (pool->nrels * 2 > hashmask) + if ((Hashval)pool->nrels * 2 > hashmask) { - sat_free(pool->relhashtbl); + solv_free(pool->relhashtbl); pool->relhashmask = hashmask = mkmask(pool->nrels + REL_BLOCK); - pool->relhashtbl = hashtbl = sat_calloc(hashmask + 1, sizeof(Id)); - // rehash all rels into new hashtable + pool->relhashtbl = hashtbl = solv_calloc(hashmask + 1, sizeof(Id)); + /* rehash all rels into new hashtable */ for (i = 1; i < pool->nrels; i++) { h = relhash(ran[i].name, ran[i].evr, ran[i].flags) & hashmask; @@ -82,7 +80,7 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) hashtbl[h] = i; } } - + /* compute hash and check for match */ h = relhash(name, evr, flags) & hashmask; hh = HASHCHAIN_START; @@ -100,7 +98,7 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) id = pool->nrels++; /* extend rel space if needed */ - pool->rels = sat_extend(pool->rels, id, 1, sizeof(Reldep), REL_BLOCK); + pool->rels = solv_extend(pool->rels, id, 1, sizeof(Reldep), REL_BLOCK); hashtbl[h] = id; ran = pool->rels + id; ran->name = name; @@ -110,50 +108,40 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) /* extend whatprovides_rel if needed */ if (pool->whatprovides_rel && (id & WHATPROVIDES_BLOCK) == 0) { - pool->whatprovides_rel = sat_realloc2(pool->whatprovides_rel, id + (WHATPROVIDES_BLOCK + 1), sizeof(Offset)); + pool->whatprovides_rel = solv_realloc2(pool->whatprovides_rel, id + (WHATPROVIDES_BLOCK + 1), sizeof(Offset)); memset(pool->whatprovides_rel + id, 0, (WHATPROVIDES_BLOCK + 1) * sizeof(Offset)); } return MAKERELDEP(id); } -// Id -> String -// for rels (returns name only) and strings -// +/* Id -> String + * for rels (returns name only) and strings + */ const char * pool_id2str(const Pool *pool, Id id) { - if (ISRELDEP(id)) + while (ISRELDEP(id)) { Reldep *rd = GETRELDEP(pool, id); - if (ISRELDEP(rd->name)) - return "REL"; - return pool->ss.stringspace + pool->ss.strings[rd->name]; + id = rd->name; } return pool->ss.stringspace + pool->ss.strings[id]; } static const char *rels[] = { " ! ", -#ifndef DEBIAN_SEMANTICS " > ", -#else - " >> ", -#endif " = ", " >= ", -#ifndef DEBIAN_SEMANTICS " < ", -#else - " << ", -#endif " <> ", " <= ", " <=> " }; -// get operator for RelId +/* get operator for RelId */ const char * pool_id2rel(const Pool *pool, Id id) { @@ -163,21 +151,51 @@ pool_id2rel(const Pool *pool, Id id) rd = GETRELDEP(pool, id); switch (rd->flags) { - case 0: case 1: case 2: case 3: - case 4: case 5: case 6: case 7: - return rels[rd->flags & 7]; + /* debian special cases < and > */ + /* haiku special cases <> (maybe we should use != for the others as well */ + case 0: case REL_EQ: case REL_GT | REL_EQ: + case REL_LT | REL_EQ: case REL_LT | REL_EQ | REL_GT: +#if !defined(DEBIAN) && !defined(MULTI_SEMANTICS) + case REL_LT: case REL_GT: +#endif +#if !defined(HAIKU) && !defined(MULTI_SEMANTICS) + case REL_LT | REL_GT: +#endif + return rels[rd->flags]; +#if defined(DEBIAN) || defined(MULTI_SEMANTICS) + case REL_GT: + return pool->disttype == DISTTYPE_DEB ? " >> " : rels[rd->flags]; + case REL_LT: + return pool->disttype == DISTTYPE_DEB ? " << " : rels[rd->flags]; +#endif +#if defined(HAIKU) || defined(MULTI_SEMANTICS) + case REL_LT | REL_GT: + return pool->disttype == DISTTYPE_HAIKU ? " != " : rels[rd->flags]; +#endif case REL_AND: - return " & "; + return pool->disttype == DISTTYPE_RPM ? " and " : " & "; case REL_OR: - return " | "; + return pool->disttype == DISTTYPE_RPM ? " or " : " | "; case REL_WITH: - return " + "; + return pool->disttype == DISTTYPE_RPM ? " with " : " + "; case REL_NAMESPACE: return " NAMESPACE "; /* actually not used in dep2str */ case REL_ARCH: return "."; + case REL_MULTIARCH: + return ":"; case REL_FILECONFLICT: return " FILECONFLICT "; + case REL_COND: + return pool->disttype == DISTTYPE_RPM ? " if " : " IF "; + case REL_COMPAT: + return " compat >= "; + case REL_KIND: + return " KIND "; + case REL_ELSE: + return pool->disttype == DISTTYPE_RPM ? " else " : " ELSE "; + case REL_ERROR: + return " ERROR "; default: break; } @@ -185,8 +203,7 @@ pool_id2rel(const Pool *pool, Id id) } -// get e:v.r for Id -// +/* get e:v.r for Id */ const char * pool_id2evr(const Pool *pool, Id id) { @@ -220,9 +237,10 @@ dep2strcpy(const Pool *pool, char *p, Id id, int oldrel) while (ISRELDEP(id)) { Reldep *rd = GETRELDEP(pool, id); - if (oldrel == REL_AND || oldrel == REL_OR || oldrel == REL_WITH) - if (rd->flags == REL_AND || rd->flags == REL_OR || rd->flags == REL_WITH) - if (oldrel != rd->flags) + int rel = rd->flags; + if (oldrel == REL_AND || oldrel == REL_OR || oldrel == REL_WITH || oldrel == REL_COND || oldrel == REL_ELSE || oldrel == -1) + if (rel == REL_AND || rel == REL_OR || rel == REL_WITH || rel == REL_COND || rel == REL_ELSE) + if ((oldrel != rel || rel == REL_COND || rel == REL_ELSE) && !(oldrel == REL_COND && rel == REL_ELSE)) { *p++ = '('; dep2strcpy(pool, p, rd->name, rd->flags); @@ -233,6 +251,15 @@ dep2strcpy(const Pool *pool, char *p, Id id, int oldrel) strcat(p, ")"); return; } + if (rd->flags == REL_KIND) + { + dep2strcpy(pool, p, rd->evr, rd->flags); + p += strlen(p); + *p++ = ':'; + id = rd->name; + oldrel = rd->flags; + continue; + } dep2strcpy(pool, p, rd->name, rd->flags); p += strlen(p); if (rd->flags == REL_NAMESPACE) @@ -262,7 +289,7 @@ pool_dep2str(Pool *pool, Id id) if (!ISRELDEP(id)) return pool->ss.stringspace + pool->ss.strings[id]; p = pool_alloctmpspace(pool, dep2strlen(pool, id) + 1); - dep2strcpy(pool, p, id, 0); + dep2strcpy(pool, p, id, pool->disttype == DISTTYPE_RPM ? -1 : 0); return p; } @@ -275,17 +302,16 @@ pool_shrink_strings(Pool *pool) void pool_shrink_rels(Pool *pool) { - pool->rels = sat_extend_resize(pool->rels, pool->nrels, sizeof(Reldep), REL_BLOCK); + pool->rels = solv_extend_resize(pool->rels, pool->nrels, sizeof(Reldep), REL_BLOCK); } -// reset all hash tables -// +/* free all hash tables */ void pool_freeidhashes(Pool *pool) { stringpool_freehash(&pool->ss); - pool->relhashtbl = sat_free(pool->relhashtbl); + pool->relhashtbl = solv_free(pool->relhashtbl); pool->relhashmask = 0; } -// EOF +/* EOF */