diff options
author | Rob Landley <rob@landley.net> | 2014-07-21 19:56:53 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2014-07-21 19:56:53 -0500 |
commit | 546b293cb9369c9c421981c71577af29d83b925a (patch) | |
tree | c52ed4a4231229f8f0e417b1a960d2b0585f7dec | |
parent | 280bb5942526c06211185144a5cdb4c5d05aa2f6 (diff) | |
download | toybox-546b293cb9369c9c421981c71577af29d83b925a.tar.gz |
Little endian and big endian versions of peek (for host.c).
-rw-r--r-- | lib/lib.c | 38 | ||||
-rw-r--r-- | lib/lib.h | 4 |
2 files changed, 27 insertions, 15 deletions
@@ -372,21 +372,31 @@ void msleep(long miliseconds) nanosleep(&ts, &ts); } -int64_t peek(void *ptr, int size) +// Inefficient, but deals with unaligned access +int64_t peek_le(void *ptr, unsigned size) { - if (size & 8) { - volatile int64_t *p = (int64_t *)ptr; - return *p; - } else if (size & 4) { - volatile int *p = (int *)ptr; - return *p; - } else if (size & 2) { - volatile short *p = (short *)ptr; - return *p; - } else { - volatile char *p = (char *)ptr; - return *p; - } + int64_t ret = 0; + char *c = ptr; + int i; + + for (i=0; i<size; i++) ret |= ((int64_t)c[i])<<i; + + return ret; +} + +int64_t peek_be(void *ptr, unsigned size) +{ + int64_t ret = 0; + char *c = ptr; + + while (size--) ret = (ret<<8)|c[size]; + + return ret; +} + +int64_t peek(void *ptr, unsigned size) +{ + return IS_BIG_ENDIAN ? peek_be(ptr, size) : peek_le(ptr, size); } void poke(void *ptr, uint64_t val, int size) @@ -138,7 +138,9 @@ int mkpathat(int atfd, char *dir, mode_t lastmode, int flags); struct string_list **splitpath(char *path, struct string_list **list); char *readfile(char *name, char *buf, off_t len); void msleep(long miliseconds); -int64_t peek(void *ptr, int size); +int64_t peek_le(void *ptr, unsigned size); +int64_t peek_be(void *ptr, unsigned size); +int64_t peek(void *ptr, unsigned size); void poke(void *ptr, uint64_t val, int size); struct string_list *find_in_path(char *path, char *filename); long atolx(char *c); |