source: trunk/src/emx/include/Attic/cpp/bitprims.h@ 18

Last change on this file since 18 was 18, checked in by bird, 23 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.8 KB
Line 
1#ifndef _BS_PRIMS
2#define _BS_PRIMS
3
4/* A bitstring is an array of _BS_word. */
5typedef unsigned long _BS_word;
6
7#define _BS_CHAR_BIT 8
8#define _BS_BITS_PER_WORD (_BS_CHAR_BIT*sizeof(_BS_word))
9#define _BS_WORDS_NEEDED(NBITS) ((NBITS+_BS_BITS_PER_WORD-1)/_BS_BITS_PER_WORD)
10
11/* For now, we number the bits in a _BS_word in little-endian order.
12 Later, might use machine order. */
13#ifdef CHILL_LIB
14#ifndef BITS_BIG_ENDIAN
15#include "config.h"
16#endif
17#define _BS_BIGENDIAN BITS_BIG_ENDIAN
18#else
19#define _BS_BIGENDIAN 0
20#endif
21
22/* By "left" we mean where bit number 0 is.
23 Hence, so left shift is << if we're numbering the bits in big-endian oder,
24 and >> if we're numbering the bits in little-endian order.
25 Currently, we always use little-endian order.
26 Later, we might use machine-endian order. */
27#if _BS_BIGENDIAN
28#define _BS_LEFT <<
29#define _BS_RIGHT >>
30#else
31#define _BS_LEFT >>
32#define _BS_RIGHT <<
33#endif
34
35#if _BS_BIGENDIAN
36#define _BS_BITMASK(BITNO) ((_BS_word)1 << (_BS_BITS_PER_WORD - 1 - (BITNO)))
37#else
38#define _BS_BITMASK(BITNO) ((_BS_word)1 << (BITNO))
39#endif
40
41/* Given a PTR which may not be aligned on a _BS_word boundary,
42 set NEW_PTR to point to (the beginning of) the corresponding _BS_word.
43 Adjust the bit-offset OFFSET to compensate for the difference. */
44#define _BS_ADJUST_ALIGNED(NEW_PTR, PTR, OFFSET) \
45 ( (NEW_PTR) = (_BS_word*)(((char*)(PTR)-(char*)0) & ~(sizeof(_BS_word)-1)), \
46 (OFFSET) += (char*)(PTR) - (char*)(NEW_PTR) )
47
48/* Given a bit pointer (PTR, OFFSET) normalize it so that
49 OFFSET < _BS_BITS_PER_WORD. */
50#define _BS_NORMALIZE(PTR, OFFSET) \
51{ _BS_size_t __tmp_ind = _BS_INDEX (OFFSET); \
52 (PTR) += __tmp_ind; \
53 (OFFSET) -= __tmp_ind * _BS_BITS_PER_WORD; }
54
55#define _BS_INDEX(I) ((unsigned)(I) / _BS_BITS_PER_WORD)
56#define _BS_POS(I) ((I) & (_BS_BITS_PER_WORD -1 ))
57
58#ifndef _BS_size_t
59#if __GNUC__ > 1
60#define _BS_size_t __SIZE_TYPE__
61#else
62#define _BS_size_t unsigned long
63#endif
64#endif
65
66#ifndef __P
67#ifdef __STDC__
68#define __P(protos) protos
69#else
70#define __P(protos) ()
71#endif
72#endif /*!__P*/
73#if !defined(__STDC__) && !defined(const)
74#define const
75#endif
76#if !defined(__STDC__) && !defined(void)
77#define void int
78#endif
79
80/* The 16 2-operand raster-ops:
81 These match the correspodning GX codes in X11. */
82enum _BS_alu {
83 _BS_alu_clear = 0 /* 0 */,
84 _BS_alu_and = 1 /* src & dst */,
85 _BS_alu_andReverse = 2 /* src & ~dst */,
86 _BS_alu_copy = 3 /* src */,
87 _BS_alu_andInverted = 4 /* ~src & dst */,
88 _BS_alu_noop = 5 /* dst */,
89 _BS_alu_xor = 6 /* src ^ dst */,
90 _BS_alu_or = 7 /* src | dst */,
91 _BS_alu_nor = 8 /* ~src & ~dst */,
92 _BS_alu_equiv = 9 /* ~(src ^ dst) */,
93 _BS_alu_invert = 10 /* ~dst */,
94 _BS_alu_orReverse = 11 /* src | ~dst */,
95 _BS_alu_copyInverted = 12 /* ~src */,
96 _BS_alu_orInverted = 13 /* ~src | dst */,
97 _BS_alu_nand = 14 /* ~src | d~st */,
98 _BS_alu_set = 15 /* ~src | dst */
99};
100#define _BS
101#define _BS
102
103#ifdef __cplusplus
104extern "C" {
105#endif
106
107extern void _BS_and __P((_BS_word*,int, const _BS_word*, int, _BS_size_t));
108extern void _BS_blt __P((enum _BS_alu,
109 _BS_word*,int, const _BS_word*,int, _BS_size_t));
110extern void _BS_copy __P((_BS_word*,int, const _BS_word*,int, _BS_size_t));
111#define _BS_copy_0(DS, SS, LENGTH) _BS_copy(DS, 0, SS, 0, LENGTH)
112extern int _BS_count __P((const _BS_word*, int, _BS_size_t));
113extern int _BS_any __P((const _BS_word*, int, _BS_size_t));
114extern void _BS_clear __P((_BS_word*, int, _BS_size_t));
115extern void _BS_set __P((_BS_word*, int, _BS_size_t));
116extern void _BS_invert __P((_BS_word*, int, _BS_size_t));
117int _BS_lcompare_0 __P((const _BS_word*, _BS_size_t,
118 const _BS_word*, _BS_size_t));
119extern void _BS_xor __P((_BS_word*,int, const _BS_word*,int, _BS_size_t));
120
121#ifdef __cplusplus
122}
123#endif
124
125#endif /* !_BS_PRIMS */
Note: See TracBrowser for help on using the repository browser.