"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.4.1/include/newsrc.h" (12 Oct 2016, 6333 Bytes) of package /linux/misc/tin-2.4.1.tar.gz:


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 option. Alternatively you can here view or download 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.0_vs_2.4.1.

    1 /*
    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
    8  *
    9  * Copyright (c) 1997-2017 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
   10  * All rights reserved.
   11  *
   12  * Redistribution and use in source and binary forms, with or without
   13  * modification, are permitted provided that the following conditions
   14  * are met:
   15  * 1. Redistributions of source code must retain the above copyright
   16  *    notice, this list of conditions and the following disclaimer.
   17  * 2. Redistributions in binary form must reproduce the above copyright
   18  *    notice, this list of conditions and the following disclaimer in the
   19  *    documentation and/or other materials provided with the distribution.
   20  * 3. The name of the author may not be used to endorse or promote
   21  *    products derived from this software without specific prior written
   22  *    permission.
   23  *
   24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
   25  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
   28  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
   30  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   32  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   33  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   34  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   35  */
   36 
   37 #ifndef NEWSRC_H
   38 #define NEWSRC_H 1
   39 
   40 /*
   41  * The following macros are used to simplify and speed up the
   42  * manipulation of the bitmaps in memory which record which articles
   43  * are read or unread in each news group.
   44  *
   45  * Data representation:
   46  *
   47  * Each bitmap is handled as an array of bytes; the least-significant
   48  * bit of the 0th byte is the 0th bit; the most significant bit of
   49  * the 0th byte is the 7th bit. Thus, the most-significant bit of the
   50  * 128th byte is the 1023rd bit, and in general the mth bit of the nth
   51  * byte is considered to be bit (n*8)+m of the map as a whole.  Conversely,
   52  * the position of bit q in the map is the bit (q & 7) of byte (q >> 3).
   53  * A bitmap of b bits will be allocated as ((b+7) >> 3) bytes.
   54  *
   55  * The routines could be changed to operate on a word-oriented bitmap by
   56  * changing the constants used from 8 to 16, 3 to 4, 7 to 15, etc. and
   57  * changing the allocate/deallocate routines.
   58  *
   59  * In the newsrc context, a 0 bit represents an article which is read
   60  * or expired; a 1 represents an unread article. The 0th bit corresponds
   61  * to the minimum article number for this group, and (max-min+7)/8 bytes
   62  * are allocated to the bitmap.
   63  *
   64  * Constants:
   65  *
   66  * NBITS   = total number of bits per byte;
   67  * NMAXBIT = number of bits per byte or word;
   68  * NBITPOS = number of bit in NMAXBIT;
   69  * NBITSON = byte/word used to set all bits in byte/word to 1;
   70  * NBITNEG1 = binary negation of 1, used in constructing masks.
   71  *
   72  * Macro naming and use:
   73  *
   74  * The NOFFSET and NBITIDX macro construct the byte and bit indexes in
   75  * the map, given a bit number.
   76  *
   77  * The NSET0 macro sets a bit to binary 0
   78  * The NSET1 macro sets a bit to binary 1
   79  * The NSETBLK0 macro sets the same bit or bits to binary 0
   80  * The NSETBLK1 macro sets the same bit or bits to binary 1
   81  * The NTEST macro tests a single bit.
   82  * These are used frequently to access the group bitmap.
   83  *
   84  * NSETBLK0 and NSETBLK1 operate on whole numbers of bytes, and are
   85  * mainly useful for initializing complete bitmaps to one state or
   86  * another. Both use the memset function, which is assumed to be
   87  * optimized for the target architecture. NSETBLK is currently used to
   88  * initialize the group bitmap to 1s (unread).
   89  *
   90  * NSETRNG0 and NSETRNG1 operate on ranges of bits, from a low bit number
   91  * to a high bit number (inclusive), and are especially useful for
   92  * efficiently setting a contiguous range of bits to one state or another.
   93  * NSETRNG0 is currently used on the group bitmap to mark the ranges the
   94  * newsrc file says are read or expired.
   95  *
   96  * The algorithm is this. If the high number is less than the low, then
   97  * do nothing (error); if both fall within the same byte, construct a
   98  * single mask expressing the range and AND or OR it into the byte; else:
   99  * construct a mask for the byte containing the low bit, AND or OR it in;
  100  * use memset to fill in the intervening bytes efficiently; then construct
  101  * a mask for the byte containing the high bit, and AND or OR this mask
  102  * in. Masks are constructed by left-shift of 0xff (to set high-order bits
  103  * to 1), negating a left-shift of 0xfe (to set low-order bits to 1), and
  104  * the various negations and combinations of the same. This procedure is
  105  * complex, but 1 to 2 orders of magnitude faster than a shift inside a
  106  * loop for each bit inside a loop for each individual byte.
  107  *
  108  */
  109 #define NBITS       8
  110 #define NMAXBIT     7
  111 #define NBITPOS     3
  112 #define NBITSON     0xff
  113 #define NBITNEG1    0xfe
  114 #define NOFFSET(b)  ((b) >> NBITPOS)
  115 #define NBITIDX(b)  ((b) & NMAXBIT)
  116 
  117 #define NBITMASK(beg,end)   (unsigned char) ~(((1 << (((NMAXBIT - beg) - (NMAXBIT - end)) + 1)) - 1) << (NMAXBIT - end))
  118 
  119 #define NTEST(n,b)  (n[NOFFSET(b)] & (1 << NBITIDX(b)))
  120 
  121 #define NSETBLK1(n,i)   (memset(n, NBITSON, (size_t) NOFFSET(i) + 1))
  122 #define NSETBLK0(n,i)   (memset(n, 0, (size_t) NOFFSET(i) + 1))
  123 
  124 /* dbmalloc checks memset() parameters, so we'll use it to check the assignments */
  125 #ifdef USE_DBMALLOC
  126 #   define NSET1(n,b)   memset(n + NOFFSET(b), n[NOFFSET(b)] | NTEST(n,b), 1)
  127 #   define NSET0(n,b)   memset(n + NOFFSET(b), n[NOFFSET(b)] & ~NTEST(n,b), 1)
  128 #   define BIT_OR(n, b, mask)   memset(n + NOFFSET(b), n[NOFFSET(b)] | (mask), 1)
  129 #   define BIT_AND(n, b, mask)  memset(n + NOFFSET(b), n[NOFFSET(b)] & (mask), 1)
  130 #   include <dbmalloc.h> /* dbmalloc 1.4 */
  131 #else
  132 #   define NSET1(n,b)   (n[NOFFSET(b)] |= (1 << NBITIDX(b)))
  133 #   define NSET0(n,b)   (n[NOFFSET(b)] &= ~(1 << NBITIDX(b)))
  134 #   define BIT_OR(n, b, mask)   n[NOFFSET(b)] |= mask
  135 #   define BIT_AND(n, b, mask)  n[NOFFSET(b)] &= mask
  136 #endif /* USE_DBMALLOC */
  137 
  138 #define BITS_TO_BYTES(n)    ((size_t) ((n + NBITS - 1) / NBITS))
  139 
  140 #endif /* !NEWSRC_H */