diff options
author | Petr Machata <pmachata@redhat.com> | 2012-05-04 03:22:59 +0200 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2012-08-29 19:03:16 +0200 |
commit | ad16845eb449e2d69591ddaf1910a4e47860323a (patch) | |
tree | 5dfee2e65b7300bb64cf38ec55fcc77f2f4231de /value.c | |
parent | 42332ad028c8616c6d8155520bdc7293b53af138 (diff) | |
download | ltrace-ad16845eb449e2d69591ddaf1910a4e47860323a.tar.gz |
Resolve some big endian issues in value.c
Diffstat (limited to 'value.c')
-rw-r--r-- | value.c | 63 |
1 files changed, 50 insertions, 13 deletions
@@ -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 * |