aboutsummaryrefslogtreecommitdiff
path: root/sys/osb/bitfields.c
blob: 3275c5420c45234613e7f807db3e6dadf1f7e25b (plain) (blame)
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
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#define	import_spp
#define import_knames
#include <iraf.h>

/*
 * BITFIELDS.C -- Portable C routines for extracting and inserting small
 * integers into an integer value.
 */

unsigned XINT bitmask[] = {	0,		/* MACHDEP		*/
  01,			    03,			     07,
  017,			    037,		     077,
  0177,			    0377,		     0777,
  01777,		    03777,		     07777,
  017777,		    037777,		     077777,
  0177777,		    0377777,		     0777777,
  01777777,		    03777777,		     07777777,
  017777777,		    037777777,		     077777777,
  0177777777,		    0377777777,		     0777777777,
  01777777777,		    03777777777,	     07777777777,
  017777777777,		    037777777777,   	     077777777777,
  0177777777777,	    0377777777777,   	     0777777777777,
  01777777777777,	    03777777777777,   	     07777777777777,
  017777777777777,	    037777777777777,   	     077777777777777,
  0177777777777777,	    0377777777777777,        0777777777777777,
  01777777777777777,	    03777777777777777,       07777777777777777,
  017777777777777777,	    037777777777777777,      077777777777777777,
  0177777777777777777,	    0377777777777777777,     0777777777777777777,
  01777777777777777777,	    03777777777777777777,    07777777777777777777,
  017777777777777777777,    037777777777777777777,   077777777777777777777,
  0177777777777777777777,   0377777777777777777777,  0777777777777777777777,
  01777777777777777777777,  03777777777777777777777, 07777777777777777777777
};



/* BITPAK -- Pack an unsigned integer value into a bitfield in a longword.
 * The size of the bitfield may not exceed the number of bits in an integer.
 */
void
BITPAK (
  unsigned XINT	*ival,		/* value to be placed in bitfield	*/
  unsigned XINT	*wordp,		/* longword to be written into		*/
  XINT	*offset,		/* one-indexed offset of first bit	*/
  XINT	*nbits 			/* number of bits to be set		*/
)
{
	register unsigned XINT	shift;
	register unsigned XINT	mask;

	shift = *offset - 1;
	mask = bitmask[*nbits] << shift;
	*wordp = (*wordp & ~mask) | ((*ival << shift) & mask);
}


/* BITUPK -- Unpack an unsigned integer bit field from a longword.
 */
XINT
BITUPK (
  unsigned XINT	*wordp,		/* longword to be examined		*/
  XINT	*offset,		/* one-indexed offset of first bit	*/
  XINT	*nbits 			/* number of bits to be set		*/
)
{
	return ((*wordp >> (*offset-1)) & bitmask[*nbits]);
}