1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1996,2008 Oracle.  All rights reserved.
5 *
6 * $Id: db_byteorder.c,v 12.10 2008/01/08 20:58:08 bostic Exp $
7 */
8
9#include "db_config.h"
10
11#include "db_int.h"
12
13/*
14 * __db_isbigendian --
15 *	Return 1 if big-endian (Motorola and Sparc), not little-endian
16 *	(Intel and Vax).  We do this work at run-time, rather than at
17 *	configuration time so cross-compilation and general embedded
18 *	system support is simpler.
19 *
20 * PUBLIC: int __db_isbigendian __P((void));
21 */
22int
23__db_isbigendian()
24{
25	union {					/* From Harbison & Steele.  */
26		long l;
27		char c[sizeof(long)];
28	} u;
29
30	u.l = 1;
31	return (u.c[sizeof(long) - 1] == 1);
32}
33
34/*
35 * __db_byteorder --
36 *	Return if we need to do byte swapping, checking for illegal
37 *	values.
38 *
39 * PUBLIC: int __db_byteorder __P((ENV *, int));
40 */
41int
42__db_byteorder(env, lorder)
43	ENV *env;
44	int lorder;
45{
46	switch (lorder) {
47	case 0:
48		break;
49	case 1234:
50		if (!F_ISSET(env, ENV_LITTLEENDIAN))
51			return (DB_SWAPBYTES);
52		break;
53	case 4321:
54		if (F_ISSET(env, ENV_LITTLEENDIAN))
55			return (DB_SWAPBYTES);
56		break;
57	default:
58		__db_errx(env,
59	    "unsupported byte order, only big and little-endian supported");
60		return (EINVAL);
61	}
62	return (0);
63}
64