diff --git a/ChangeLog b/ChangeLog index 97ba39e0..829ac687 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,10 @@ * src/test_endswap.def src/test_endswap.tpl Add tests for psf_put_be32() and psf_put_be64(). + * src/sfendian.h src/test_endswap.(def|tpl) + Add functions psf_get_be32() and psf_gett_be64() with tests. + These are needed for platforms where un-aligned accesses cause bus faults. + 2013-02-12 Erik de Castro Lopo * src/sfendian.h diff --git a/src/sfendian.h b/src/sfendian.h index 0fc21464..c0331152 100644 --- a/src/sfendian.h +++ b/src/sfendian.h @@ -164,6 +164,47 @@ psf_put_be32 (uint8_t *ptr, int offset, int32_t value) ptr [offset + 3] = value ; } /* psf_put_be32 */ +static inline void +psf_put_be16 (uint8_t *ptr, int offset, int16_t value) +{ + ptr [offset] = value >> 8 ; + ptr [offset + 1] = value ; +} /* psf_put_be16 */ + +static inline int64_t +psf_get_be64 (uint8_t *ptr, int offset) +{ int64_t value ; + + value = ptr [offset] << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset + 2] << 8 ; + value += ptr [offset + 3] ; + + value <<= 32 ; + + value += ptr [offset + 4] << 24 ; + value += ptr [offset + 5] << 16 ; + value += ptr [offset + 6] << 8 ; + value += ptr [offset + 7] ; + return value ; +} /* psf_get_be64 */ + +static inline int32_t +psf_get_be32 (uint8_t *ptr, int offset) +{ int32_t value ; + + value = ptr [offset] << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset + 2] << 8 ; + value += ptr [offset + 3] ; + return value ; +} /* psf_get_be32 */ + +static inline int16_t +psf_get_be16 (uint8_t *ptr, int offset) +{ return (ptr [offset] << 8) + ptr [offset + 1] ; +} /* psf_get_be16 */ + /*----------------------------------------------------------------------------------------------- ** Generic functions for performing endian swapping on integer arrays. */ diff --git a/src/test_endswap.def b/src/test_endswap.def index 3ca889a9..9516e4d6 100644 --- a/src/test_endswap.def +++ b/src/test_endswap.def @@ -18,6 +18,13 @@ int_type = { format = FMT_INT64 ; } ; +int_size = { + name = 16 ; + typename = int16_t ; + value = 0x4142 ; + strval = "AB" ; + } ; + int_size = { name = 32 ; typename = int32_t ; diff --git a/src/test_endswap.tpl b/src/test_endswap.tpl index 939cf62b..89b7d147 100644 --- a/src/test_endswap.tpl +++ b/src/test_endswap.tpl @@ -109,18 +109,22 @@ test_endswap_[+ (get "name") +] (void) static void test_psf_put_be[+ (get "name") +] (void) { const char *test = "[+ (get "strval") +]" ; - uint8_t array [20] ; + uint8_t array [32] ; int k ; printf (" %-40s : ", __func__) ; fflush (stdout) ; - for (k = 0 ; k < 6 ; k++) + for (k = 0 ; k < 10 ; k++) { memset (array, 0, sizeof (array)) ; psf_put_be[+ (get "name") +] (array, k, [+ (get "value") +]) ; if (memcmp (array + k, test, sizeof ([+ (get "typename") +])) != 0) - { printf ("Failed at %d\n", k) ; + { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + if (psf_get_be[+ (get "name") +] (array, k) != [+ (get "value") +]) + { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; exit (1) ; } ; } ;