Ejemplo n.º 1
0
Archivo: huffman.c Proyecto: cifkao/bis
/* Write the Huffman tree recursively. */
void write_tree(file *f, huf_node *node){
  if(node->left){ // internal node
    bitfile_put_bit(f, 0);
    write_tree(f, node->left);
    write_tree(f, node->right);
  }else{ // leaf node
    bitfile_put_bit(f, 1);
    bitfile_put_symbol(f, node->symbol, SYMBOL_LENGTH);
  }
}
Ejemplo n.º 2
0
void test_bitfile3(void)
{
	u8 byte;
	u32 word;
	struct bitfile *bf = bitfile_open("/tmp/test", "r");
	struct bitfile *bf2 = bitfile_open("/tmp/test.out", "w");
	struct bitfile *bf3 = bitfile_open("/tmp/test.out2", "w");
	struct bitfile *bf4 = bitfile_open("/tmp/test.out3", "w");
	struct bitfile *bf5 = bitfile_open("/tmp/test.out4", "w");

	while(bitfile_get_byte(bf, &byte) == 0) {
		bitfile_put_byte(bf2, byte);
	}

	bitfile_rewind(bf);

	while(bitfile_get_bit(bf, &byte) == 0) {
		bitfile_put_bit(bf3, byte);
	}

	bitfile_rewind(bf);

	while(bitfile_get_u32(bf, &word) == 0) {
		bitfile_put_u32(bf4, word);
	}

	bitfile_rewind(bf);

	{
		u8 bytes[2];
		u8 bits[4];
		while(bitfile_get_byte(bf, &bytes[0]) == 0 &&
		      bitfile_get_byte(bf, &bytes[1]) == 0 &&
		      bitfile_get_bit(bf, &bits[0]) == 0 &&
		      bitfile_get_bit(bf, &bits[1]) == 0 &&
		      bitfile_get_bit(bf, &bits[2]) == 0 &&
		      bitfile_get_bit(bf, &bits[3]) == 0) {
			u8 out = bits[0] << 7 | bits[1] << 6 |
				bits[2] << 5 | bits[3] << 4;
			u8 foo[3];
			foo[0] = bytes[0];
			foo[1] = bytes[1];
			foo[2] = out;
 			bitfile_put_bits(bf5, (u8 *)&foo, 20);

/* 			bitfile_put_bit(bf5, bits[0]); */
/* 			bitfile_put_bit(bf5, bits[1]); */
/* 			bitfile_put_bit(bf5, bits[2]); */
/* 			bitfile_put_bit(bf5, bits[3]); */

		}
	}

	bitfile_close(bf);
	bitfile_close(bf2);
	bitfile_close(bf3);
	bitfile_close(bf4);
	bitfile_close(bf5);

}
Ejemplo n.º 3
0
void bitfile_put_bits(struct bitfile *bf, u8 *bits, size_t count)
{
	u8 bit_pos = 0;
	assert(bf->mode == 'w');

	while (count >= 8) {
		bitfile_put_byte(bf, *bits++);
		count -= 8;
	}

	while (count > 0) {
		bitfile_put_bit(bf, BIT_GET(*bits, bit_pos));
		bit_pos++;
		count--;
	}
}
Ejemplo n.º 4
0
void test_bitfile4(void)
{
	u8 foo = 170;
/* 	u8 foo2; */
/* 	u8 foo3[2] = {85, 85}; */
	struct bitfile *bf = bitfile_open("/tmp/bf-test", "w");

	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 0);

	bitfile_put_byte(bf, foo);

	bitfile_put_bit(bf, 1);
	bitfile_put_bit(bf, 1);
	bitfile_put_bit(bf, 1);


/* 	bitfile_put_bit(bf, 0); */
/* 	bitfile_put_bit(bf, 1); */
/* 	bitfile_put_bit(bf, 0); */
/* 	bitfile_put_bit(bf, 1); */

/* 	bitfile_put_bit(bf, 0); */
/* 	bitfile_put_bit(bf, 1); */
/* 	bitfile_put_bit(bf, 0); */
/* 	bitfile_put_bit(bf, 1); */

/* 	bitfile_put_bit(bf, 0); */
/* 	bitfile_put_bit(bf, 0); */

/* 	foo2 = foo << 4; */
/* 	bitfile_put_bits(bf, &foo, 4); */
/* 	bitfile_put_bits(bf, &foo2, 4); */

/* 	bitfile_put_bits(bf, &foo3, 10); */
/* 	bitfile_put_bits(bf, &foo3, 6); */


	bitfile_close(bf);

}
Ejemplo n.º 5
0
void test_bitfile(void)
{
	struct bitfile *bf;
	char buf[20] = {0,};
	u8 res;
	u32 res32;
	int ret = 0;

	bf = bitfile_open("bitfile.test", "w");
	assert (bf != NULL);

	bitfile_put_bytes(bf, (u8*)"HCPAK", 5);

	bitfile_put_byte(bf, 'a');
	bitfile_put_byte(bf, 'b');
	bitfile_put_byte(bf, 'c');
	bitfile_put_byte(bf, 'd');

	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 1);
	bitfile_put_bit(bf, 1);

	bitfile_put_byte(bf, 'e');
	bitfile_put_byte(bf, 'f');

	bitfile_put_u32(bf, (u32)123456);

	res = 0xff;
	bitfile_put_bits(bf, &res, 5);

	bitfile_put_bit(bf, 1);
	bitfile_put_bit(bf, 0);
	bitfile_put_bit(bf, 1);
	bitfile_put_bit(bf, 0);

	/* bitfile_put_byte(bf, 'f'); */

	bitfile_close(bf);

	bf = bitfile_open("bitfile.test", "r");
	assert (bf != NULL);

	bitfile_get_bytes(bf, (u8*)buf, 5);
	buf[5] = '\0';
	assert(!memcmp(buf, "HCPAK", 5));
	/* printf("HCPAK: '%s'\n", buf); */

	ret += bitfile_get_byte(bf, &res); /* printf("a: %c\n", res); */ assert(res == 'a');
	ret += bitfile_get_byte(bf, &res); /* printf("b: %c\n", res); */ assert(res == 'b');
	ret += bitfile_get_byte(bf, &res); /* printf("c: %c\n", res); */ assert(res == 'c');
	ret += bitfile_get_byte(bf, &res); /* printf("d: %c\n", res); */ assert(res == 'd');

	ret += bitfile_get_bit(bf, &res); /* printf("0: %d\n", res); */ assert(res == 0);
	ret += bitfile_get_bit(bf, &res); /* printf("0: %d\n", res); */ assert(res == 0);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);

	ret += bitfile_get_byte(bf, &res); /* printf("e: %c\n", res); */ assert(res == 'e');
	ret += bitfile_get_byte(bf, &res); /* printf("f: %c\n", res); */ assert(res == 'f');

	ret += bitfile_get_u32(bf, &res32);
	assert (res32 == 123456);

	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("0: %d\n", res); */ assert(res == 0);
	ret += bitfile_get_bit(bf, &res); /* printf("1: %d\n", res); */ assert(res == 1);
	ret += bitfile_get_bit(bf, &res); /* printf("0: %d\n", res); */ assert(res == 0);

	assert(ret == 0);

	/* try reading past the EOF */
	assert(bitfile_get_byte(bf, &res) != 0);

	/* try rewinding the file */
	bitfile_rewind(bf);

	bitfile_get_bytes(bf, (u8*)buf, 5);
	buf[5] = '\0';
	assert(!memcmp(buf, "HCPAK", 5));

/* 	printf("HCPAK: '%s'\n", buf); */

	bitfile_close(bf);


}