diff options
Diffstat (limited to 'storage/bdb/common/db_byteorder.c')
-rw-r--r-- | storage/bdb/common/db_byteorder.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/storage/bdb/common/db_byteorder.c b/storage/bdb/common/db_byteorder.c new file mode 100644 index 00000000000..d42d8e6a958 --- /dev/null +++ b/storage/bdb/common/db_byteorder.c @@ -0,0 +1,74 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1996-2002 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: db_byteorder.c,v 11.8 2002/02/01 18:15:29 bostic Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> +#endif + +#include "db_int.h" + +/* + * __db_isbigendian -- + * Return 1 if big-endian (Motorola and Sparc), not little-endian + * (Intel and Vax). We do this work at run-time, rather than at + * configuration time so cross-compilation and general embedded + * system support is simpler. + * + * PUBLIC: int __db_isbigendian __P((void)); + */ +int +__db_isbigendian() +{ + union { /* From Harbison & Steele. */ + long l; + char c[sizeof(long)]; + } u; + + u.l = 1; + return (u.c[sizeof(long) - 1] == 1); +} + +/* + * __db_byteorder -- + * Return if we need to do byte swapping, checking for illegal + * values. + * + * PUBLIC: int __db_byteorder __P((DB_ENV *, int)); + */ +int +__db_byteorder(dbenv, lorder) + DB_ENV *dbenv; + int lorder; +{ + int is_bigendian; + + is_bigendian = __db_isbigendian(); + + switch (lorder) { + case 0: + break; + case 1234: + if (is_bigendian) + return (DB_SWAPBYTES); + break; + case 4321: + if (!is_bigendian) + return (DB_SWAPBYTES); + break; + default: + __db_err(dbenv, + "unsupported byte order, only big and little-endian supported"); + return (EINVAL); + } + return (0); +} |