summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2023-09-11 13:19:58 +0300
committerTimo Teräs <timo.teras@iki.fi>2023-10-15 16:39:10 +0000
commit3bf521ba06711394d6ac8a12e5e55b452a7e5107 (patch)
tree558445abff446e9107945e1a94065700561bb336
parentc5d8d286f6920542a73232d503d92e9a82b7be58 (diff)
downloadapk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.gz
apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.bz2
apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.tar.xz
apk-tools-3bf521ba06711394d6ac8a12e5e55b452a7e5107.zip
adb: add support for 64-bit integers
-rw-r--r--src/adb.c25
-rw-r--r--src/adb.h8
-rw-r--r--src/apk_adb.c9
-rw-r--r--src/app_mkpkg.c2
4 files changed, 28 insertions, 16 deletions
diff --git a/src/adb.c b/src/adb.c
index 4bc89d4..fe614af 100644
--- a/src/adb.c
+++ b/src/adb.c
@@ -354,9 +354,10 @@ adb_val_t adb_r_root(const struct adb *db)
return ((struct adb_hdr*)db->adb.ptr)->root;
}
-uint32_t adb_r_int(const struct adb *db, adb_val_t v)
+uint64_t adb_r_int(const struct adb *db, adb_val_t v)
{
uint32_t *int4;
+ uint64_t *int8;
switch (ADB_VAL_TYPE(v)) {
case ADB_TYPE_INT:
@@ -365,6 +366,10 @@ uint32_t adb_r_int(const struct adb *db, adb_val_t v)
int4 = adb_r_deref(db, v, 0, sizeof int4);
if (!int4) return 0;
return le32toh(*int4);
+ case ADB_TYPE_INT_64:
+ int8 = adb_r_deref(db, v, 0, sizeof int8);
+ if (!int8) return 0;
+ return le64toh(*int8);
default:
return 0;
}
@@ -445,7 +450,7 @@ adb_val_t adb_ro_val(const struct adb_obj *o, unsigned i)
return o->obj[i];
}
-uint32_t adb_ro_int(const struct adb_obj *o, unsigned i)
+uint64_t adb_ro_int(const struct adb_obj *o, unsigned i)
{
return adb_r_int(o->db, adb_ro_val(o, i));
}
@@ -702,11 +707,15 @@ static adb_val_t adb_w_blob_raw(struct adb *db, apk_blob_t b)
return val;
}
-adb_val_t adb_w_int(struct adb *db, uint32_t val)
+adb_val_t adb_w_int(struct adb *db, uint64_t val)
{
+ if (val >= 0x100000000) {
+ val = htole64(val);
+ return ADB_VAL(ADB_TYPE_INT_64, adb_w_data1(db, &val, sizeof val, sizeof val));
+ }
if (val >= 0x10000000) {
- val = htole32(val);
- return ADB_VAL(ADB_TYPE_INT_32, adb_w_data1(db, &val, sizeof val, sizeof val));
+ uint32_t val32 = htole32(val);
+ return ADB_VAL(ADB_TYPE_INT_32, adb_w_data1(db, &val32, sizeof val32, sizeof val32));
}
return ADB_VAL(ADB_TYPE_INT, val);
}
@@ -725,6 +734,9 @@ adb_val_t adb_w_copy(struct adb *db, struct adb *srcdb, adb_val_t v)
case ADB_TYPE_INT_32:
sz = align = sizeof(uint32_t);
goto copy;
+ case ADB_TYPE_INT_64:
+ sz = align = sizeof(uint64_t);
+ goto copy;
case ADB_TYPE_BLOB_8:
ptr = adb_r_deref(srcdb, v, 0, 1);
sz = 1UL + *(uint8_t*) ptr;
@@ -744,7 +756,6 @@ adb_val_t adb_w_copy(struct adb *db, struct adb *srcdb, adb_val_t v)
for (int i = ADBI_FIRST; i < sz; i++) cpy[i] = adb_w_copy(db, srcdb, adb_ro_val(&obj, i));
return ADB_VAL(ADB_VAL_TYPE(v), adb_w_data1(db, cpy, sizeof(adb_val_t[sz]), sizeof(adb_val_t)));
}
- case ADB_TYPE_INT_64:
case ADB_TYPE_BLOB_32:
default:
return adb_w_error(db, ENOSYS);
@@ -910,7 +921,7 @@ adb_val_t adb_wo_val_fromstring(struct adb_obj *o, unsigned i, apk_blob_t val)
return o->obj[i] = adb_w_fromstring(o->db, o->schema->fields[i-1].kind, val);
}
-adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint32_t v)
+adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint64_t v)
{
return adb_wo_val(o, i, adb_w_int(o->db, v));
}
diff --git a/src/adb.h b/src/adb.h
index 32152ae..3641570 100644
--- a/src/adb.h
+++ b/src/adb.h
@@ -204,7 +204,7 @@ int adb_w_init_static(struct adb *db, void *buf, size_t bufsz);
/* Primitive read */
adb_val_t adb_r_root(const struct adb *);
struct adb_obj *adb_r_rootobj(struct adb *a, struct adb_obj *o, const struct adb_object_schema *);
-uint32_t adb_r_int(const struct adb *, adb_val_t);
+uint64_t adb_r_int(const struct adb *, adb_val_t);
apk_blob_t adb_r_blob(const struct adb *, adb_val_t);
struct adb_obj *adb_r_obj(struct adb *, adb_val_t, struct adb_obj *o, const struct adb_object_schema *);
@@ -214,7 +214,7 @@ static inline uint32_t adb_ra_num(const struct adb_obj *o) { return (o->num ?: 1
const uint8_t *adb_ro_kind(const struct adb_obj *o, unsigned i);
adb_val_t adb_ro_val(const struct adb_obj *o, unsigned i);
-uint32_t adb_ro_int(const struct adb_obj *o, unsigned i);
+uint64_t adb_ro_int(const struct adb_obj *o, unsigned i);
apk_blob_t adb_ro_blob(const struct adb_obj *o, unsigned i);
struct adb_obj *adb_ro_obj(const struct adb_obj *o, unsigned i, struct adb_obj *);
int adb_ro_cmpobj(const struct adb_obj *o1, const struct adb_obj *o2, unsigned mode);
@@ -226,7 +226,7 @@ void adb_w_root(struct adb *, adb_val_t);
void adb_w_rootobj(struct adb_obj *);
adb_val_t adb_w_blob_vec(struct adb *, uint32_t, apk_blob_t *);
adb_val_t adb_w_blob(struct adb *, apk_blob_t);
-adb_val_t adb_w_int(struct adb *, uint32_t);
+adb_val_t adb_w_int(struct adb *, uint64_t);
adb_val_t adb_w_copy(struct adb *, struct adb *, adb_val_t);
adb_val_t adb_w_adb(struct adb *, struct adb *);
adb_val_t adb_w_fromstring(struct adb *, const uint8_t *kind, apk_blob_t);
@@ -245,7 +245,7 @@ int adb_wo_fromstring(struct adb_obj *o, apk_blob_t);
int adb_wo_copyobj(struct adb_obj *o, struct adb_obj *);
adb_val_t adb_wo_val(struct adb_obj *o, unsigned i, adb_val_t);
adb_val_t adb_wo_val_fromstring(struct adb_obj *o, unsigned i, apk_blob_t);
-adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint32_t);
+adb_val_t adb_wo_int(struct adb_obj *o, unsigned i, uint64_t);
adb_val_t adb_wo_blob(struct adb_obj *o, unsigned i, apk_blob_t);
adb_val_t adb_wo_blob_raw(struct adb_obj *o, unsigned i, apk_blob_t);
adb_val_t adb_wo_obj(struct adb_obj *o, unsigned i, struct adb_obj *);
diff --git a/src/apk_adb.c b/src/apk_adb.c
index 60291aa..ed7265f 100644
--- a/src/apk_adb.c
+++ b/src/apk_adb.c
@@ -1,4 +1,5 @@
#include <errno.h>
+#include <inttypes.h>
#include "adb.h"
#include "apk_adb.h"
#include "apk_print.h"
@@ -221,7 +222,7 @@ static struct adb_scalar_schema scalar_hexblob = {
static apk_blob_t int_tostring(struct adb *db, adb_val_t val, char *buf, size_t bufsz)
{
- return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%u", adb_r_int(db, val)));
+ return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%" PRIu64, adb_r_int(db, val)));
}
static adb_val_t int_fromstring(struct adb *db, apk_blob_t val)
@@ -233,8 +234,8 @@ static adb_val_t int_fromstring(struct adb *db, apk_blob_t val)
static int int_compare(struct adb *db1, adb_val_t v1, struct adb *db2, adb_val_t v2)
{
- uint32_t r1 = adb_r_int(db1, v1);
- uint32_t r2 = adb_r_int(db1, v2);
+ uint64_t r1 = adb_r_int(db1, v1);
+ uint64_t r2 = adb_r_int(db1, v2);
if (r1 < r2) return -1;
if (r1 > r2) return 1;
return 0;
@@ -249,7 +250,7 @@ static struct adb_scalar_schema scalar_int = {
static apk_blob_t oct_tostring(struct adb *db, adb_val_t val, char *buf, size_t bufsz)
{
- return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%o", adb_r_int(db, val)));
+ return APK_BLOB_PTR_LEN(buf, snprintf(buf, bufsz, "%" PRIo64, adb_r_int(db, val)));
}
static adb_val_t oct_fromstring(struct adb *db, apk_blob_t val)
diff --git a/src/app_mkpkg.c b/src/app_mkpkg.c
index 8984700..ed885ed 100644
--- a/src/app_mkpkg.c
+++ b/src/app_mkpkg.c
@@ -423,7 +423,7 @@ static int mkpkg_main(void *pctx, struct apk_ctx *ac, struct apk_string_array *a
adb_ro_obj(&files, j, &file);
apk_blob_t filename = adb_ro_blob(&file, ADBI_FI_NAME);
apk_blob_t target = adb_ro_blob(&file, ADBI_FI_TARGET);
- size_t sz = adb_ro_int(&file, ADBI_FI_SIZE);
+ uint64_t sz = adb_ro_int(&file, ADBI_FI_SIZE);
if (!APK_BLOB_IS_NULL(target)) continue;
if (!sz) continue;
struct adb_data_package hdr = {