"Fossies" - the Fresh Open Source Software Archive
Member "tin-2.4.4/include/newsrc.h" (20 Nov 2019, 6435 Bytes) of package /linux/misc/tin-2.4.4.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard
) with prefixed line numbers and code folding
Alternatively you can here view
the uninterpreted source code file.
For more information about "newsrc.h" see the Fossies "Dox" file reference
documentation and the latest Fossies "Diffs"
side-by-side code changes report: 2.4.3_vs_2.4.4
2 * Project : tin - a Usenet reader
3 * Module : newsrc.h
4 * Author : I. Lea & R. Skrenta
5 * Created : 1991-04-01
6 * Updated : 2003-11-18
7 * Notes : newsrc bit handling
9 * Copyright (c) 1997-2020 Iain Lea <email@example.com>, Rich Skrenta <firstname.lastname@example.org>
10 * All rights reserved.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
16 * 1. Redistributions of source code must retain the above copyright notice,
17 * this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
23 * 3. Neither the name of the copyright holder nor the names of its
24 * contributors may be used to endorse or promote products derived from
25 * this software without specific prior written permission.
27 * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
40 #ifndef NEWSRC_H
41 #define NEWSRC_H 1
44 * The following macros are used to simplify and speed up the
45 * manipulation of the bitmaps in memory which record which articles
46 * are read or unread in each news group.
48 * Data representation:
50 * Each bitmap is handled as an array of bytes; the least-significant
51 * bit of the 0th byte is the 0th bit; the most significant bit of
52 * the 0th byte is the 7th bit. Thus, the most-significant bit of the
53 * 128th byte is the 1023rd bit, and in general the mth bit of the nth
54 * byte is considered to be bit (n*8)+m of the map as a whole. Conversely,
55 * the position of bit q in the map is the bit (q & 7) of byte (q >> 3).
56 * A bitmap of b bits will be allocated as ((b+7) >> 3) bytes.
58 * The routines could be changed to operate on a word-oriented bitmap by
59 * changing the constants used from 8 to 16, 3 to 4, 7 to 15, etc. and
60 * changing the allocate/deallocate routines.
62 * In the newsrc context, a 0 bit represents an article which is read
63 * or expired; a 1 represents an unread article. The 0th bit corresponds
64 * to the minimum article number for this group, and (max-min+7)/8 bytes
65 * are allocated to the bitmap.
67 * Constants:
69 * NBITS = total number of bits per byte;
70 * NMAXBIT = number of bits per byte or word;
71 * NBITPOS = number of bit in NMAXBIT;
72 * NBITSON = byte/word used to set all bits in byte/word to 1;
73 * NBITNEG1 = binary negation of 1, used in constructing masks.
75 * Macro naming and use:
77 * The NOFFSET and NBITIDX macro construct the byte and bit indexes in
78 * the map, given a bit number.
80 * The NSET0 macro sets a bit to binary 0
81 * The NSET1 macro sets a bit to binary 1
82 * The NSETBLK0 macro sets the same bit or bits to binary 0
83 * The NSETBLK1 macro sets the same bit or bits to binary 1
84 * The NTEST macro tests a single bit.
85 * These are used frequently to access the group bitmap.
87 * NSETBLK0 and NSETBLK1 operate on whole numbers of bytes, and are
88 * mainly useful for initializing complete bitmaps to one state or
89 * another. Both use the memset function, which is assumed to be
90 * optimized for the target architecture. NSETBLK is currently used to
91 * initialize the group bitmap to 1s (unread).
93 * NSETRNG0 and NSETRNG1 operate on ranges of bits, from a low bit number
94 * to a high bit number (inclusive), and are especially useful for
95 * efficiently setting a contiguous range of bits to one state or another.
96 * NSETRNG0 is currently used on the group bitmap to mark the ranges the
97 * newsrc file says are read or expired.
99 * The algorithm is this. If the high number is less than the low, then
100 * do nothing (error); if both fall within the same byte, construct a
101 * single mask expressing the range and AND or OR it into the byte; else:
102 * construct a mask for the byte containing the low bit, AND or OR it in;
103 * use memset to fill in the intervening bytes efficiently; then construct
104 * a mask for the byte containing the high bit, and AND or OR this mask
105 * in. Masks are constructed by left-shift of 0xff (to set high-order bits
106 * to 1), negating a left-shift of 0xfe (to set low-order bits to 1), and
107 * the various negations and combinations of the same. This procedure is
108 * complex, but 1 to 2 orders of magnitude faster than a shift inside a
109 * loop for each bit inside a loop for each individual byte.
112 #define NBITS 8
113 #define NMAXBIT 7
114 #define NBITPOS 3
115 #define NBITSON 0xff
116 #define NBITNEG1 0xfe
117 #define NOFFSET(b) ((b) >> NBITPOS)
118 #define NBITIDX(b) ((b) & NMAXBIT)
120 #define NBITMASK(beg,end) (unsigned char) ~(((1 << (((NMAXBIT - beg) - (NMAXBIT - end)) + 1)) - 1) << (NMAXBIT - end))
122 #define NTEST(n,b) (n[NOFFSET(b)] & (1 << NBITIDX(b)))
124 #define NSETBLK1(n,i) (memset(n, NBITSON, (size_t) NOFFSET(i) + 1))
125 #define NSETBLK0(n,i) (memset(n, 0, (size_t) NOFFSET(i) + 1))
127 /* dbmalloc checks memset() parameters, so we'll use it to check the assignments */
128 #ifdef USE_DBMALLOC
129 # define NSET1(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] | NTEST(n,b), 1)
130 # define NSET0(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] & ~NTEST(n,b), 1)
131 # define BIT_OR(n, b, mask) memset(n + NOFFSET(b), n[NOFFSET(b)] | (mask), 1)
132 # define BIT_AND(n, b, mask) memset(n + NOFFSET(b), n[NOFFSET(b)] & (mask), 1)
133 # include <dbmalloc.h> /* dbmalloc 1.4 */
135 # define NSET1(n,b) (n[NOFFSET(b)] |= (1 << NBITIDX(b)))
136 # define NSET0(n,b) (n[NOFFSET(b)] &= ~(1 << NBITIDX(b)))
137 # define BIT_OR(n, b, mask) n[NOFFSET(b)] |= mask
138 # define BIT_AND(n, b, mask) n[NOFFSET(b)] &= mask
139 #endif /* USE_DBMALLOC */
141 #define BITS_TO_BYTES(n) ((size_t) ((n + NBITS - 1) / NBITS))
143 #endif /* !NEWSRC_H */