/* bmp.c */
#include <bmp.h>

void setbit(bitmap *bmp, int16 bitno, bool val) {
    int16 byteno;
    int8 byte, bitpos, mask, newbyte;

    if (!bmp)
        return;

    byteno = (bitno/8);
    bitpos = (bitno%8);
    byte = (int8)bmp[byteno];
    if (val) {
        mask = (1 <<bitpos);
        newbyte = (byte | mask);
    }
    else {
        mask = ~(1 <<bitpos);
        newbyte = (byte & mask);
    }

    bmp[byteno] = newbyte;

    return;
}

bool getbit(bitmap *bmp, int16 bitno) {
    int16 byteno;
    int8 byte, bitpos, mask;
    bool bit;

    if (!bmp)
        return false;

    byteno = (bitno/8);
    bitpos = (bitno%8);
    byte = (int8)bmp[byteno];
    mask = (1 <<bitpos);
    bit = ((byte & mask)>>bitpos) ?
            true :
        false;

    return bit;
}

bitmap *mkbmp(int16 bits) {
    int16 bytes;
    bitmap *p;

    bytes = (bits/8)+1;
    p = malloc($i bytes);
    if (!p)
        return (bitmap *)0;
    zero(p, $2 bytes);

    return p;
}

void zero(int8 *dst, int16 size) {
    int8 *p;
    int16 n;

    for (p=dst, n=size; n; n--, p++)
        *p = 0;

    return;
}

int main() {
    bitmap *bmp;

    bmp = mkbmp(16);
    if (!bmp)
        return 0;

    setbit(bmp, 9, true);
    setbit(bmp, 10, true);
    setbit(bmp, 9, false);

    printf("bit 9 = %d\n", (getbit(bmp, 9))?1:0);
    free(bmp);

    return 0;
}











