summaryrefslogtreecommitdiff
path: root/mcon/U/byteorder.U
blob: a2242c5cabd6621926dd76b6ac291981e6797696 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
?RCS: $Id: byteorder.U 1 2006-08-24 12:32:52Z rmanfredi $
?RCS:
?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
?RCS: 
?RCS: You may redistribute only under the terms of the Artistic Licence,
?RCS: as specified in the README file that comes with the distribution.
?RCS: You may reuse parts of this distribution only within the terms of
?RCS: that same Artistic Licence; a copy of which may be found at the root
?RCS: of the source tree for dist 4.0.
?RCS:
?RCS: $Log: byteorder.U,v $
?RCS: Revision 3.0.1.2  1997/02/28  15:24:55  ram
?RCS: patch61: no longer ask the user if the test runs ok
?RCS:
?RCS: Revision 3.0.1.1  1994/10/29  16:02:58  ram
?RCS: patch36: added ?F: line for metalint file checking
?RCS:
?RCS: Revision 3.0  1993/08/18  12:05:28  ram
?RCS: Baseline for dist 3.0 netwide release.
?RCS:
?MAKE:byteorder: cat Myread Oldconfig Loc +cc +ccflags rm
?MAKE:	-pick add $@ %<
?S:byteorder:
?S:	This variable holds the byte order. In the following, larger digits
?S:	indicate more significance.  The variable byteorder is either 4321
?S:	on a big-endian machine, or 1234 on a little-endian, or 87654321
?S:	on a Cray ... or 3412 with weird order !
?S:.
?C:BYTEORDER:
?C:	This symbol hold the hexadecimal constant defined in byteorder,
?C:	i.e. 0x1234 or 0x4321, etc...
?C:.
?H:#define BYTEORDER 0x$byteorder	/* large digits for MSB */
?H:.
?T:xxx_prompt
?F:!try
: check for ordering of bytes in a long
case "$byteorder" in
'')
	$cat <<'EOM'
  
In the following, larger digits indicate more significance.  A big-endian
machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A
little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other
machines may have weird orders like 3412.  A Cray will report 87654321. If
the test program works the default is probably right.
I'm now running the test program...
EOM
	$cat >try.c <<'EOCP'
#include <stdio.h>
int main()
{
	int i;
	union {
		unsigned long l;
		char c[sizeof(long)];
	} u;

	if (sizeof(long) > 4)
		u.l = (0x08070605L << 32) | 0x04030201L;
	else
		u.l = 0x04030201L;
	for (i = 0; i < sizeof(long); i++)
		printf("%c", u.c[i]+'0');
	printf("\n");
	exit(0);
}
EOCP
	xxx_prompt=y
	if $cc $ccflags -o try try.c >/dev/null 2>&1 && ./try > /dev/null; then
		dflt=`./try`
		case "$dflt" in
		[1-4][1-4][1-4][1-4]|12345678|87654321)
			echo "(The test program ran ok.)"
			echo "byteorder=$dflt"
			xxx_prompt=n
			;;
		????|????????) echo "(The test program ran ok.)" ;;
		*) echo "(The test program didn't run right for some reason.)" ;;
		esac
	else
		dflt='4321'
		cat <<'EOM'
(I can't seem to compile the test program.  Guessing big-endian...)
EOM
	fi
	case "$xxx_prompt" in
	y)
		rp="What is the order of bytes in a long?"
		. ./myread
		byteorder="$ans"
		;;
	*)	byteorder=$dflt
		;;
	esac
	;;
esac
$rm -f try.c try