diff options
author | Rob Landley <rob@landley.net> | 2018-12-27 11:18:57 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2018-12-27 11:18:57 -0600 |
commit | e5066ba5acc4d7044c7637fc04a51b349108ea0d (patch) | |
tree | f9a5e1ecab60876e1ed6ad6551e506dab91e3ea2 /lib/lib.c | |
parent | 831266c06862c1be6195382a02b86cb52ef304dc (diff) | |
download | toybox-e5066ba5acc4d7044c7637fc04a51b349108ea0d.tar.gz |
Make poke() alignment-agnostic.
Diffstat (limited to 'lib/lib.c')
-rw-r--r-- | lib/lib.c | 36 |
1 files changed, 22 insertions, 14 deletions
@@ -586,26 +586,34 @@ int64_t peek_be(void *ptr, unsigned size) int64_t peek(void *ptr, unsigned size) { - return IS_BIG_ENDIAN ? peek_be(ptr, size) : peek_le(ptr, size); + return (IS_BIG_ENDIAN ? peek_be : peek_le)(ptr, size); } -void poke(void *ptr, uint64_t val, int size) +void poke_le(void *ptr, long long val, unsigned size) { - if (size & 8) { - volatile uint64_t *p = (uint64_t *)ptr; - *p = val; - } else if (size & 4) { - volatile int *p = (int *)ptr; - *p = val; - } else if (size & 2) { - volatile short *p = (short *)ptr; - *p = val; - } else { - volatile char *p = (char *)ptr; - *p = val; + char *c = ptr; + + while (size--) { + *c++ = val&255; + val >>= 8; } } +void poke_be(void *ptr, long long val, unsigned size) +{ + char *c = ptr + size; + + while (size--) { + *--c = val&255; + val >>=8; + } +} + +void poke(void *ptr, long long val, unsigned size) +{ + (IS_BIG_ENDIAN ? poke_be : poke_le)(ptr, val, size); +} + // Iterate through an array of files, opening each one and calling a function // on that filehandle and name. The special filename "-" means stdin if // flags is O_RDONLY, stdout otherwise. An empty argument list calls |