Annotation of embedaddon/ntp/lib/isc/bitstring.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
        !             3:  * Copyright (C) 1999-2001  Internet Software Consortium.
        !             4:  *
        !             5:  * Permission to use, copy, modify, and/or distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
        !            10:  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
        !            11:  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
        !            12:  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            13:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
        !            14:  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
        !            15:  * PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17: 
        !            18: /* $Id: bitstring.c,v 1.17 2007/06/19 23:47:17 tbox Exp $ */
        !            19: 
        !            20: /*! \file */
        !            21: 
        !            22: #include <config.h>
        !            23: 
        !            24: #include <stddef.h>
        !            25: 
        !            26: #include <isc/magic.h>
        !            27: #include <isc/bitstring.h>
        !            28: #include <isc/util.h>
        !            29: 
        !            30: #define DIV8(x)                        ((x) >> 3)
        !            31: #define MOD8(x)                        ((x) & 0x00000007U)
        !            32: #define OCTETS(n)              (((n) + 7) >> 3)
        !            33: #define PADDED(n)              ((((n) + 7) >> 3) << 3)
        !            34: #define BITSET(bs, n)          (((bs)->data[DIV8(n)] & \
        !            35:                                 (1 << (7 - MOD8(n)))) != 0)
        !            36: #define SETBIT(bs, n)          (bs)->data[DIV8(n)] |= (1 << (7 - MOD8(n)))
        !            37: #define CLEARBIT(bs, n)                (bs)->data[DIV8(n)] &= ~(1 << (7 - MOD8(n)))
        !            38: 
        !            39: #define BITSTRING_MAGIC                ISC_MAGIC('B', 'S', 't', 'r')
        !            40: #define VALID_BITSTRING(b)     ISC_MAGIC_VALID(b, BITSTRING_MAGIC)
        !            41: 
        !            42: void
        !            43: isc_bitstring_init(isc_bitstring_t *bitstring, unsigned char *data,
        !            44:                   unsigned int length, unsigned int size, isc_boolean_t lsb0)
        !            45: {
        !            46:        /*
        !            47:         * Make 'bitstring' refer to the bitstring of 'size' bits starting
        !            48:         * at 'data'.  'length' bits of the bitstring are valid.  If 'lsb0'
        !            49:         * is set then, bit 0 refers to the least significant bit of the
        !            50:         * bitstring.  Otherwise bit 0 is the most significant bit.
        !            51:         */
        !            52: 
        !            53:        REQUIRE(bitstring != NULL);
        !            54:        REQUIRE(data != NULL);
        !            55:        REQUIRE(length <= size);
        !            56: 
        !            57:        bitstring->magic = BITSTRING_MAGIC;
        !            58:        bitstring->data = data;
        !            59:        bitstring->length = length;
        !            60:        bitstring->size = size;
        !            61:        bitstring->lsb0 = lsb0;
        !            62: }
        !            63: 
        !            64: void
        !            65: isc_bitstring_invalidate(isc_bitstring_t *bitstring) {
        !            66: 
        !            67:        /*
        !            68:         * Invalidate 'bitstring'.
        !            69:         */
        !            70: 
        !            71:        REQUIRE(VALID_BITSTRING(bitstring));
        !            72: 
        !            73:        bitstring->magic = 0;
        !            74:        bitstring->data = NULL;
        !            75:        bitstring->length = 0;
        !            76:        bitstring->size = 0;
        !            77:        bitstring->lsb0 = ISC_FALSE;
        !            78: }
        !            79: 
        !            80: void
        !            81: isc_bitstring_copy(isc_bitstring_t *source, unsigned int sbitpos,
        !            82:                   isc_bitstring_t *target, unsigned int tbitpos,
        !            83:                   unsigned int n)
        !            84: {
        !            85:        unsigned int tlast;
        !            86: 
        !            87:        /*
        !            88:         * Starting at bit 'sbitpos', copy 'n' bits from 'source' to
        !            89:         * the 'n' bits of 'target' starting at 'tbitpos'.
        !            90:         */
        !            91: 
        !            92:        REQUIRE(VALID_BITSTRING(source));
        !            93:        REQUIRE(VALID_BITSTRING(target));
        !            94:        REQUIRE(source->lsb0 == target->lsb0);
        !            95:        if (source->lsb0) {
        !            96:                REQUIRE(sbitpos <= source->length);
        !            97:                sbitpos = PADDED(source->size) - sbitpos;
        !            98:                REQUIRE(sbitpos >= n);
        !            99:                sbitpos -= n;
        !           100:        } else
        !           101:                REQUIRE(sbitpos + n <= source->length);
        !           102:        tlast = tbitpos + n;
        !           103:        if (target->lsb0) {
        !           104:                REQUIRE(tbitpos <= target->length);
        !           105:                tbitpos = PADDED(target->size) - tbitpos;
        !           106:                REQUIRE(tbitpos >= n);
        !           107:                tbitpos -= n;
        !           108:        } else
        !           109:                REQUIRE(tlast <= target->size);
        !           110: 
        !           111:        if (tlast > target->length)
        !           112:                target->length = tlast;
        !           113: 
        !           114:        /*
        !           115:         * This is far from optimal...
        !           116:         */
        !           117: 
        !           118:        while (n > 0) {
        !           119:                if (BITSET(source, sbitpos))
        !           120:                        SETBIT(target, tbitpos);
        !           121:                else
        !           122:                        CLEARBIT(target, tbitpos);
        !           123:                sbitpos++;
        !           124:                tbitpos++;
        !           125:                n--;
        !           126:        }
        !           127: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>