Add functions psf_get_be(16|32|64) with tests.

These are needed for platforms where un-aligned accesses cause bus
faults.
This commit is contained in:
Erik de Castro Lopo
2013-02-13 18:37:54 +11:00
parent 6ced621a66
commit 3c812eb4b3
4 changed files with 59 additions and 3 deletions
+4
View File
@@ -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 <erikd AT mega-nerd DOT com>
* src/sfendian.h
+41
View File
@@ -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.
*/
+7
View File
@@ -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 ;
+7 -3
View File
@@ -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) ;
} ;
} ;