The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
?RCS: $Id: byteorder.U,v 3.0.1.2 1997/02/28 15:24:55 ram Exp $
?RCS:
?RCS: Copyright (c) 1991-1993, 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 3.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>
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 try.c -o try >/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