File: bin_io.h

package info (click to toggle)
irsim 9.7.75-1
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 2,596 kB
  • sloc: ansic: 24,733; sh: 6,803; makefile: 411; csh: 269; tcl: 76
file content (79 lines) | stat: -rw-r--r-- 2,615 bytes parent folder | download | duplicates (7)
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
/* 
 *     ********************************************************************* 
 *     * Copyright (C) 1988, 1990 Stanford University.                     * 
 *     * Permission to use, copy, modify, and distribute this              * 
 *     * software and its documentation for any purpose and without        * 
 *     * fee is hereby granted, provided that the above copyright          * 
 *     * notice appear in all copies.  Stanford University                 * 
 *     * makes no representations about the suitability of this            * 
 *     * software for any purpose.  It is provided "as is" without         * 
 *     * express or implied warranty.  Export of this software outside     * 
 *     * of the United States of America may require an export license.    * 
 *     ********************************************************************* 
 */

/*
 * Macros to read/write machine-independent binary files.
 */


/*
 * Extract NBYTES from byte stream BUFF and place result in NUM.
 * Restriction is 1 <= NBYTES <= 4.  (Force Unrolling of loops).
 */
#define UnpackBytes( BUFF, NUM, NBYTES )			\
  {								\
    register unsigned char  *B_S = (unsigned char *) (BUFF);	\
    register unsigned long  RES = 0;				\
								\
    if( NBYTES == 1 )						\
	RES = *B_S;						\
    else if( NBYTES == 2 )					\
      {								\
	RES = B_S[0];						\
	RES += ( ((unsigned int) B_S[1]) << 8 ) & 0x0ff00;	\
      }								\
    else if( NBYTES == 3 )					\
      {								\
	RES = B_S[0];						\
	RES += ( ((unsigned int) B_S[1]) << 8 ) & 0x0ff00;	\
	RES += ( ((unsigned int) B_S[2]) << 16 ) & 0x0ff0000;	\
      }								\
    else if( NBYTES == 4 )					\
      {								\
	RES = B_S[0];						\
	RES += ( ((unsigned int) B_S[1]) << 8 ) & 0x0ff00;	\
	RES += ( ((unsigned int) B_S[2]) << 16 ) & 0x0ff0000;	\
	RES += ( ((unsigned int) B_S[3]) << 24 ) & 0xff000000;	\
      }								\
    NUM = RES;							\
  }								\


/*
 * Pack NBYTES from NUM into byte stream pointed to by BUFF.
 * Restriction is 1 <= NBYTES <= 4.  (Force Unrolling of loops).
 */
#define	PackBytes( BUFF, NUM, NBYTES )				\
  {								\
    register unsigned long  B_T = (NUM);			\
    register unsigned char  *B_S = (unsigned char *) (BUFF);	\
								\
    if( NBYTES > 3 )						\
      {								\
	*B_S++ = B_T & 0x0ff;					\
	B_T >>= 8;						\
      }								\
    if( NBYTES > 2 )						\
      {								\
	*B_S++ = B_T & 0x0ff;					\
	B_T >>= 8;						\
      }								\
    if( NBYTES > 1 )						\
      {								\
	*B_S++ = B_T & 0x0ff;					\
	B_T >>= 8;						\
      }								\
    *B_S = B_T & 0x0ff;						\
  }								\