90 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef lint
 | |
| static char rcsid[] = "$Header$";
 | |
| #endif lint
 | |
| 
 | |
| #include "const.h"
 | |
| #include "assert.h"
 | |
| 
 | |
| bool	bytes_reversed = FALSE;
 | |
| bool	words_reversed = FALSE;
 | |
| 
 | |
| /*
 | |
|  * Determine the byte/word order in shorts/longs, assuming the size of a short
 | |
|  * is 2 chars, and the size of a long is 4 chars. Not all theoretical
 | |
|  * possibilities are tested; only bytes reversed and/or words reversed.
 | |
|  */
 | |
| determine_ordering()
 | |
| {
 | |
| 	short	s;
 | |
| 	long	l;
 | |
| 	register char	*cp;
 | |
| 	register short	*sp;
 | |
| 
 | |
| 	cp = (char *)&s;
 | |
| 	cp[0] = 0x01; cp[1] = 0x02;
 | |
| 	if (s != 0x01 + (0x02 << 8))
 | |
| 		bytes_reversed = TRUE;
 | |
| 	sp = (short *)&l;
 | |
| 	sp[0] = 0x0001; sp[1] = 0x0002;
 | |
| 	if (l != 0x0001 + (0x0002L << 16))
 | |
| 		words_reversed = TRUE;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * `Format' is a string of digits indicating how many bytes must be taken
 | |
|  * from `buf' to form an integer of some type. E.g. if the digit is '2', two
 | |
|  * bytes are taken to form a short.
 | |
|  */
 | |
| swap(buf, format)
 | |
| 	register char	*buf;
 | |
| 	register char	*format;
 | |
| {
 | |
| 	register char	savebyte;
 | |
| 
 | |
| 	while (*format) {
 | |
| 		switch (*format++) {
 | |
| 		case '1':
 | |
| 			buf += 1;
 | |
| 			break;
 | |
| 		case '2':
 | |
| 			if (bytes_reversed) {
 | |
| 				savebyte = buf[0];
 | |
| 				buf[0] = buf[1];
 | |
| 				buf[1] = savebyte;
 | |
| 			}
 | |
| 			buf += 2;
 | |
| 			break;
 | |
| 		case '4':
 | |
| 			/*
 | |
| 			 * Written out to save recursive calls.
 | |
| 			 */
 | |
| 			if (bytes_reversed && words_reversed) {
 | |
| 				savebyte = buf[0];
 | |
| 				buf[0] = buf[3];
 | |
| 				buf[3] = savebyte;
 | |
| 				savebyte = buf[1];
 | |
| 				buf[1] = buf[2];
 | |
| 				buf[2] = savebyte;
 | |
| 			} else if (bytes_reversed) {
 | |
| 				savebyte = buf[0];
 | |
| 				buf[0] = buf[1];
 | |
| 				buf[1] = savebyte;
 | |
| 				savebyte = buf[2];
 | |
| 				buf[2] = buf[3];
 | |
| 				buf[3] = savebyte;
 | |
| 			} else if (words_reversed) {
 | |
| 				savebyte = buf[0];
 | |
| 				buf[0] = buf[2];
 | |
| 				buf[2] = savebyte;
 | |
| 				savebyte = buf[1];
 | |
| 				buf[1] = buf[3];
 | |
| 				buf[3] = savebyte;
 | |
| 			}
 | |
| 			buf += 4;
 | |
| 			break;
 | |
| 		default:
 | |
| 			assert(FALSE);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 |