From: Michael Schroeder Date: Fri, 16 Mar 2012 13:36:04 +0000 (+0100) Subject: - advance num64 support. For now, we store the high 32 bits in kv->num2 to stay somew... X-Git-Tag: BASE-SuSE-Code-12_2-Branch~93 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dded4a474cf14c128379ca092da9b5cd5c192c0e;p=platform%2Fupstream%2Flibsolv.git - advance num64 support. For now, we store the high 32 bits in kv->num2 to stay somewhat compatible --- diff --git a/src/dataiterator.h b/src/dataiterator.h index 5a8114a..cf10fd9 100644 --- a/src/dataiterator.h +++ b/src/dataiterator.h @@ -21,8 +21,8 @@ struct _Repo; typedef struct _KeyValue { Id id; const char *str; - int num; - int num2; + unsigned int num; + unsigned int num2; int entry; /* array entry, starts with 0 */ int eof; /* last entry reached */ @@ -30,6 +30,8 @@ typedef struct _KeyValue { struct _KeyValue *parent; } KeyValue; +#define SOLV_KV_NUM64(kv) (((unsigned long long)((kv)->num2)) << 32 | (kv)->num) + /* search matcher flags */ #define SEARCH_STRINGMASK 15 #define SEARCH_STRING 1 diff --git a/src/repo_write.c b/src/repo_write.c index 23c2a43..1db6c50 100644 --- a/src/repo_write.c +++ b/src/repo_write.c @@ -426,6 +426,24 @@ data_addideof(struct extdata *xd, Id x, int eof) data_addid(xd, (eof ? x: x | 64)); } +static void +data_addid64(struct extdata *xd, unsigned int x, unsigned int hx) +{ + if (hx) + { + if (hx > 7) + { + data_addid(xd, (Id)(hx >> 3)); + xd->buf[xd->len - 1] |= 128; + hx &= 7; + } + data_addid(xd, (Id)(x | 0x80000000)); + xd->buf[xd->len - 5] = (x >> 28) | (hx << 4) | 128; + } + else + data_addid(xd, (Id)x); +} + static void data_addidarray_sort(struct extdata *xd, Pool *pool, NeedId *needid, Id *ids, Id marker) { @@ -786,7 +804,7 @@ repo_write_adddata(struct cbdata *cbdata, Repodata *data, Repokey *key, KeyValue data_addblob(xd, v, 4); break; case REPOKEY_TYPE_NUM: - data_addid(xd, kv->num); + data_addid64(xd, kv->num, kv->num2); break; case REPOKEY_TYPE_DIR: id = kv->id; diff --git a/src/repodata.c b/src/repodata.c index a912842..1e87aba 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -692,9 +692,9 @@ repodata_lookup_num(Repodata *data, Id solvid, Id keyname, unsigned int *value) || key->type == REPOKEY_TYPE_U32 || key->type == REPOKEY_TYPE_CONSTANT) { - kv.num = 0; + kv.num = kv.num2 = 0; dp = data_fetch(dp, &kv, key); - *value = kv.num; + *value = kv.num2 ? ~(unsigned int)0 : kv.num; return 1; } return 0; @@ -1470,7 +1470,7 @@ dataiterator_step(Dataiterator *di) case di_enterarray: di_enterarray: if (di->key->name == REPOSITORY_SOLVABLES) goto di_nextkey; - di->ddp = data_read_id(di->ddp, &di->kv.num); + di->ddp = data_read_id(di->ddp, (Id *)&di->kv.num); di->kv.eof = 0; di->kv.entry = -1; /* FALLTHROUGH */ diff --git a/src/repopack.h b/src/repopack.h index f52678f..6b76665 100644 --- a/src/repopack.h +++ b/src/repopack.h @@ -23,7 +23,41 @@ data_read_id(unsigned char *dp, Id *idp) *idp = (x << 7) ^ c; return dp; } - x = (x << 7) ^ c ^ 128; + x = (x << 7) ^ (c ^ 128); + } +} + +static inline unsigned char * +data_read_num64(unsigned char *dp, unsigned int *low, unsigned int *high) +{ + unsigned int x = 0; + unsigned long long int xx; + unsigned char c; + int n; + + *high = 0; + for (n = 4; n-- > 0;) + { + c = *dp++; + if (!(c & 0x80)) + { + *low = (x << 7) ^ c; + return dp; + } + x = (x << 7) ^ (c ^ 128); + } + xx = x; + for (;;) + { + c = *dp++; + if (!(c & 0x80)) + { + xx = (xx << 7) ^ c; + *low = xx; + *high = xx >> 32; + return dp; + } + xx = (xx << 7) ^ (c ^ 128); } } @@ -69,6 +103,7 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) case REPOKEY_TYPE_VOID: return dp; case REPOKEY_TYPE_CONSTANT: + kv->num2 = 0; kv->num = key->size; return dp; case REPOKEY_TYPE_CONSTANTID: @@ -81,9 +116,10 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) case REPOKEY_TYPE_DIR: return data_read_id(dp, &kv->id); case REPOKEY_TYPE_NUM: - return data_read_id(dp, &kv->num); + return data_read_num64(dp, &kv->num, &kv->num2); case REPOKEY_TYPE_U32: - return data_read_u32(dp, (unsigned int *)&kv->num); + kv->num2 = 0; + return data_read_u32(dp, &kv->num); case REPOKEY_TYPE_MD5: kv->str = (const char *)dp; return dp + SIZEOF_MD5; @@ -94,7 +130,7 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) kv->str = (const char *)dp; return dp + SIZEOF_SHA256; case REPOKEY_TYPE_BINARY: - dp = data_read_id(dp, &kv->num); + dp = data_read_id(dp, (Id *)&kv->num); kv->str = (const char *)dp; return dp + kv->num; case REPOKEY_TYPE_IDARRAY: @@ -105,13 +141,13 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) return dp + strlen(kv->str) + 1; case REPOKEY_TYPE_DIRNUMNUMARRAY: dp = data_read_id(dp, &kv->id); - dp = data_read_id(dp, &kv->num); - return data_read_ideof(dp, &kv->num2, &kv->eof); + dp = data_read_id(dp, (Id *)&kv->num); + return data_read_ideof(dp, (Id *)&kv->num2, &kv->eof); case REPOKEY_TYPE_FIXARRAY: - dp = data_read_id(dp, &kv->num); + dp = data_read_id(dp, (Id *)&kv->num); return data_read_id(dp, &kv->id); case REPOKEY_TYPE_FLEXARRAY: - return data_read_id(dp, &kv->num); + return data_read_id(dp, (Id *)&kv->num); default: return 0; } @@ -153,8 +189,8 @@ data_skip(unsigned char *dp, int type) return dp + 1; case REPOKEY_TYPE_BINARY: { - Id len; - dp = data_read_id(dp, &len); + unsigned int len; + dp = data_read_id(dp, (Id *)&len); return dp + len; } case REPOKEY_TYPE_DIRSTRARRAY: @@ -237,6 +273,12 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir) while ((*dp) != 0) dp++; return dp + 1; + case REPOKEY_TYPE_BINARY: + { + unsigned int len; + dp = data_read_id(dp, (Id *)&len); + return dp + len; + } case REPOKEY_TYPE_DIRSTRARRAY: for (;;) { diff --git a/tools/dumpsolv.c b/tools/dumpsolv.c index c143edd..7a648dd 100644 --- a/tools/dumpsolv.c +++ b/tools/dumpsolv.c @@ -98,20 +98,22 @@ dump_attr(Repo *repo, Repodata *data, Repokey *key, KeyValue *kv) printf("%s: (void)\n", keyname); break; case REPOKEY_TYPE_U32: - case REPOKEY_TYPE_NUM: case REPOKEY_TYPE_CONSTANT: printf("%s: %u\n", keyname, kv->num); break; + case REPOKEY_TYPE_NUM: + printf("%s: %llu\n", keyname, SOLV_KV_NUM64(kv)); + break; case REPOKEY_TYPE_BINARY: if (kv->num) - printf("%s: %02x..%02x len %d\n", keyname, (unsigned char)kv->str[0], (unsigned char)kv->str[kv->num - 1], kv->num); + printf("%s: %02x..%02x len %u\n", keyname, (unsigned char)kv->str[0], (unsigned char)kv->str[kv->num - 1], kv->num); else printf("%s: len 0\n", keyname); break; case REPOKEY_TYPE_DIRNUMNUMARRAY: if (!kv->entry) printf("%s:\n%*s", keyname, indent, ""); - printf(" %s %d %d\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2); + printf(" %s %u %u\n", repodata_dir2str(data, kv->id, 0), kv->num, kv->num2); break; case REPOKEY_TYPE_DIRSTRARRAY: if (!kv->entry) diff --git a/tools/repomdxml2solv.c b/tools/repomdxml2solv.c index 8e7eb0a..9af5e96 100644 --- a/tools/repomdxml2solv.c +++ b/tools/repomdxml2solv.c @@ -73,7 +73,8 @@ doquery(Pool *pool, Repo *repo, const char *query) printf("%s\n", di.kv.str); break; case REPOKEY_TYPE_NUM: - printf("%d\n", di.kv.num); + case REPOKEY_TYPE_CONSTANT: + printf("%llu\n", SOLV_KV_NUM64(&di.kv)); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: