⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmask.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)bitmask.c 1.1 92/07/30 SMI";#endif#endif/* *  Bitmask handling */#define bitmask_c#include <sunwindow/bitmask.h>#include <sunwindow/sv_malloc.h>Bitmask *sv_bits_new_mask(max_bits)    int max_bits;{    Bitmask *m;    int n;    m = (Bitmask *)sv_malloc(sizeof(Bitmask));    m->bm_max_bits = max_bits;    /* Compute number of bytes needed */    n = (max_bits + BITSPERBYTE - 1) / BITSPERBYTE;    /* Compute number of ints needed */    m->bm_mask_size = (n + sizeof(unsigned int) - 1) / sizeof(unsigned int);    m->bm_mask = (unsigned int *)sv_malloc(m->bm_mask_size * sizeof(unsigned int));    for (n = 0; n < m->bm_mask_size; n++)	m->bm_mask[n] = 0;    return m;}Bitmask *sv_bits_copy_mask(m)    Bitmask *m;{    Bitmask *p;    register int i;    p = (Bitmask *)sv_malloc(sizeof(Bitmask));    p->bm_max_bits = m->bm_max_bits;    p->bm_mask_size = m->bm_mask_size;    p->bm_mask = (unsigned int *)sv_malloc(p->bm_mask_size * sizeof(unsigned int));    for (i = 0; i < p->bm_mask_size; i++)	p->bm_mask[i] = m->bm_mask[i];    return p;}voidsv_bits_dispose_mask(m)    Bitmask *m;{    free(m->bm_mask);    free(m);}Bitmask *sv_bits_unset_mask(m, bit)    register Bitmask *m;    register int bit;{    register int n, rbit;    if (bit >= m->bm_max_bits) return (Bitmask *)0;    n = bit / (sizeof(unsigned int) * BITSPERBYTE);    rbit = bit - n * (sizeof(unsigned int) * BITSPERBYTE);    m->bm_mask[n] &= ~((unsigned) 1 << rbit);    return m;}Bitmask *sv_bits_set_mask(m, bit)    register Bitmask *m;    register int bit;{    register int n, rbit;    if (bit >= m->bm_max_bits) return (Bitmask *)0;    n = bit / (sizeof(unsigned int) * BITSPERBYTE);    rbit = bit - n * (sizeof(unsigned int) * BITSPERBYTE);    m->bm_mask[n] |= (unsigned) 1 << rbit;    return m;}unsigned intsv_bits_get_mask(m, bit)    register Bitmask *m;    register int bit;{    register int n, rbit;    if (bit >= m->bm_max_bits) return 0;    n = bit / (sizeof(unsigned int) * BITSPERBYTE);    rbit = bit - n * (sizeof(unsigned int) * BITSPERBYTE);    return (m->bm_mask[n] & ((unsigned) 1 << rbit));}intsv_bits_cmp_mask(m1, m2)    register Bitmask *m1, *m2;{    register int i;    if (m1->bm_mask_size != m2->bm_mask_size)        return m1->bm_mask_size - m2->bm_mask_size;    for (i = 0; i < m1->bm_mask_size; i++)        if (m1->bm_mask[i] != m2->bm_mask[i])            return -1;    return 0;}Bitmask *sv_bits_and_mask(m1, m2, m3)  /* m3 <- m1 intersection m2 */    Bitmask *m1, *m2, *m3;{    int max_bits;    int max_words;    register int i;    if (!m1 || !m2)        return (Bitmask *)0;    max_bits = (m1->bm_max_bits > m2->bm_max_bits)?            m1->bm_max_bits: m2->bm_max_bits;    max_words = (m1->bm_mask_size > m2->bm_mask_size)?            m1->bm_mask_size: m2->bm_mask_size;    if (!m3)        /* if third arg is null mask then create a new mask */        m3 = sv_bits_new_mask(max_bits);    else if (m3->bm_mask_size < max_words)        /* if third arg not null and not big enough then give up */        return (Bitmask *)0;    m3->bm_max_bits = max_bits;    for (i = 0; i < max_words; i++)        m3->bm_mask[i] = m1->bm_mask[i] & m2->bm_mask[i];    return m3;}Bitmask *sv_bits_or_mask(m1, m2, m3)  /* m3 <- m1 union m2 */    Bitmask *m1, *m2, *m3;{    int max_bits;    int max_words;    register int i;    if (!m1 || !m2)        return (Bitmask *)0;    max_bits = (m1->bm_max_bits > m2->bm_max_bits)?            m1->bm_max_bits: m2->bm_max_bits;    max_words = (m1->bm_mask_size > m2->bm_mask_size)?            m1->bm_mask_size: m2->bm_mask_size;    if (!m3)        /* if third arg is null mask then create a new mask */        m3 = sv_bits_new_mask(max_bits);    else if (m3->bm_mask_size < max_words)        /* if third arg not null and not big enough then give up */        return (Bitmask *)0;    m3->bm_max_bits = max_bits;    for (i = 0; i < max_words; i++)        m3->bm_mask[i] = m1->bm_mask[i] | m2->bm_mask[i];    return m3;}Bitmask *sv_bits_not_mask(m1, m2)  /* m2 <- not m1 */    Bitmask *m1, *m2;{    register int i;    if (!m1)        return (Bitmask *)0;    if (!m2)        /* if second arg is null mask then create a new mask */        m2 = sv_bits_new_mask(m1->bm_max_bits);    else if (m1->bm_mask_size > m2->bm_mask_size)        /* if second arg is not null and not big enough then give up */        return (Bitmask *)0;    for (i = 0; i < m1->bm_mask_size; i++)        m2->bm_mask[i] = ~m1->bm_mask[i];    return m2;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -