aboutsummaryrefslogtreecommitdiff
path: root/value.c
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2012-05-04 03:22:59 +0200
committerPetr Machata <pmachata@redhat.com>2012-08-29 19:03:16 +0200
commitad16845eb449e2d69591ddaf1910a4e47860323a (patch)
tree5dfee2e65b7300bb64cf38ec55fcc77f2f4231de /value.c
parent42332ad028c8616c6d8155520bdc7293b53af138 (diff)
downloadltrace-ad16845eb449e2d69591ddaf1910a4e47860323a.tar.gz
Resolve some big endian issues in value.c
Diffstat (limited to 'value.c')
-rw-r--r--value.c63
1 files changed, 50 insertions, 13 deletions
diff --git a/value.c b/value.c
index 7662568..291983e 100644
--- a/value.c
+++ b/value.c
@@ -287,34 +287,71 @@ value_init_deref(struct value *ret_val, struct value *valp)
return 0;
}
+static int
+value_extract_buf_sz(struct value *value, unsigned char *tgt, size_t sz,
+ struct value_dict *arguments)
+{
+ unsigned char *data = value_get_data(value, arguments);
+ if (data == NULL)
+ return -1;
+
+ memcpy(tgt, data, sz);
+ return 0;
+}
+
int
-value_extract_word(struct value *value, long *retp, struct value_dict *arguments)
+value_extract_word(struct value *value, long *retp,
+ struct value_dict *arguments)
{
+ size_t sz = type_sizeof(value->inferior, value->type);
+ if (sz == (size_t)-1)
+ return -1;
+ assert(sz <= sizeof(long));
+
+ if (sz == 0) {
+ *retp = 0;
+ return 0;
+ }
+
union {
- long val;
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
unsigned char buf[0];
- } u;
- memset(u.buf, 0, sizeof(u));
- if (value_extract_buf(value, u.buf, arguments) < 0)
+ } u = {};
+
+ if (value_extract_buf_sz(value, u.buf, sz, arguments) < 0)
return -1;
- *retp = u.val;
- return 0;
+
+ switch (sz) {
+ case 1:
+ *retp = (long)u.u8;
+ return 0;
+ case 2:
+ *retp = (long)u.u16;
+ return 0;
+ case 4:
+ *retp = (long)u.u32;
+ return 0;
+ case 8:
+ *retp = (long)u.u64;
+ return 0;
+ default:
+ assert(sz != sz);
+ abort();
+ }
}
int
value_extract_buf(struct value *value, unsigned char *tgt,
struct value_dict *arguments)
{
- unsigned char *data = value_get_data(value, arguments);
- if (data == NULL)
- return -1;
-
size_t sz = type_sizeof(value->inferior, value->type);
if (sz == (size_t)-1)
return -1;
- memcpy(tgt, data, sz);
- return 0;
+ return value_extract_buf_sz(value, tgt, sz, arguments);
}
struct value *