Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>

#include "object.h"
#include "catset.h"

static int debug = 0;

int
catsetneeded(int v)
{
        return (v / 8) + 1;
}

static void
catsetprint(int f, Catset*cs)
{
        int i;
        fprint(2, "(%p %d:", cs->bitpiece, cs->nbitpiece);
        for (i = 0; i < cs->nbitpiece; i++)
                fprint(f, "[%d]=%x", i, cs->bitpiece[i]);
        fprint(2, ")");
}

void
catsetrealloc(Catset *cs, int sz)
{
        if (debug) fprint(2, "catsetrealloc %p %d (%p %d)", cs, sz, cs->bitpiece, cs->nbitpiece);
        if (sz > cs->nbitpiece) {
                cs->bitpiece = realloc(cs->bitpiece, sz*sizeof(uchar));
                memset(cs->bitpiece + cs->nbitpiece, 0, sz - cs->nbitpiece);
                cs->nbitpiece = sz;
        }
        if (debug) fprint(2, " -> %p %d\n", cs->bitpiece, cs->nbitpiece);
}

void
catsetfree(Catset *cs)
{
        free(cs->bitpiece);
        cs->bitpiece = 0;
        cs->nbitpiece = 0;
}

void
catsetinit(Catset*cs, int v)
{
        int n;

        n = catsetneeded(v);
        if (debug) fprint(2, "catsetinit %p %d -> ", cs, v);
        catsetrealloc(cs, n);
        catsetset(cs, v);
        if (debug) catsetprint(2, cs);
        if (debug) fprint(2, "\n");
}

void
catsetcopy(Catset*dst, Catset*src)
{
        if (debug) fprint(2, "catsetcopy %p %p ", dst, src);
        if (debug) catsetprint(2, dst);
        if (debug) fprint(2, " ");
        if (debug) catsetprint(2, src);
        if (dst->nbitpiece < src->nbitpiece)
                catsetrealloc(dst, src->nbitpiece);
        else
                memset(dst->bitpiece, 0, dst->nbitpiece);
        memcpy(dst->bitpiece, src->bitpiece, src->nbitpiece);
        dst->nbitpiece = src->nbitpiece;
        if (debug) fprint(2, "-> ");
        if (debug) catsetprint(2, dst);
        if (debug) fprint(2, "\n");
}

void
catsetset(Catset*cs, int v)
{
        int p = v / 8;
        int b = v % 8;
        if (debug) fprint(2, "catsetset %p %d ", cs, v);
        if (debug) catsetprint(2, cs);
        cs->bitpiece[p] = 1 << b;
        if (debug) fprint(2, "-> ");
        if (debug) catsetprint(2, cs);
        if (debug) fprint(2, "\n");
}

int
catsetisset(Catset*cs)
{
        int i;

        if (debug) fprint(2, "catsetisset %p ", cs);
        if (debug) catsetprint(2, cs);
        if (debug) fprint(2, "\n");
        for (i =0; i < cs->nbitpiece; i++) {
                if (cs->bitpiece[i])
                        return 1;
        }
        return 0;
}

void
catsetorset(Catset*dst, Catset*src)
{
        int i;

        if (debug) fprint(2, "catsetorset %p %p ", dst, src);
        if (debug) catsetprint(2, dst);
        if (debug) fprint(2, " ");
        if (debug) catsetprint(2, src);
        if (src->nbitpiece > dst->nbitpiece)
                catsetrealloc(dst, src->nbitpiece);

        for (i =0; i < src->nbitpiece; i++) {
                dst->bitpiece[i] |= src->bitpiece[i];
        }
        if (debug) fprint(2, "-> ");
        if (debug) catsetprint(2, dst);
        if (debug) fprint(2, "\n");
}

int
catseteq(Catset*cs1, Catset*cs2)
{
        int i;
        Catset *css, * csl;

        if (debug) fprint(2, "catseteq %p %p ", cs1, cs2);
        if (debug) catsetprint(2, cs1);
        if (debug) fprint(2, " ");
        if (debug) catsetprint(2, cs2);
        if (debug) fprint(2, "\n");
        if (cs1->nbitpiece > cs2->nbitpiece) {
                csl = cs1;
                css = cs2;
        } else {
                csl = cs2;
                css = cs1;
        }
        for (i =0; i < css->nbitpiece; i++) {
                if (css->bitpiece[i] != csl->bitpiece[i])
                        return 0;
        }
        for (i = css->nbitpiece; i < csl->nbitpiece; i++) {
                if (csl->bitpiece[i])
                        return 0;
        }
        return 1;
}