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 */
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
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)
{
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;
|| 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;
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 */
*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);
}
}
case REPOKEY_TYPE_VOID:
return dp;
case REPOKEY_TYPE_CONSTANT:
+ kv->num2 = 0;
kv->num = key->size;
return dp;
case REPOKEY_TYPE_CONSTANTID:
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;
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:
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;
}
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:
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 (;;)
{
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)
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: