commit - 1afde767c483e9672beed15c549717de2db061da
commit + 68108a4aa05489ffac8c941ae90c4d995f4eaa47
blob - 7bb22711853d9cc43175aa795e1b504f6811abcb
blob + b079e588e6363b61fd3b5cfe6c64418fb6649429
--- lzw.c
+++ lzw.c
#include <hammer/hammer.h>
#include <hammer/glue.h>
-#include <stdlib.h> /* malloc, free */
#include <string.h> /* memcpy */
#include "lzw.h"
*/
static void
+lzw_init_table(struct context *ctx)
+{
+ int i;
+
+ /* set up the static entries */
+ for(i = 0; i < 256; i++) {
+ ctx->table[i].len = 1;
+ ctx->table[i].prefix = -1; /* none */
+ ctx->table[i].first = i;
+ ctx->table[i].last = i;
+ }
+}
+
+static void
lzw_clear_table(struct context *ctx)
{
ctx->next = 258;
*/
HParser *p_lzwdata;
-static struct context *context;
+static struct context context;
/*
void
init_LZW_parser()
{
- int i;
-
/* initialize global context variable, incl. static table entries */
- context = malloc(sizeof *context);
- assert(context != NULL);
- for(i = 0; i < 256; i++)
- {
- context->table[i].len = 1;
- context->table[i].prefix = -1; /* none */
- context->table[i].first = i;
- context->table[i].last = i;
- }
+ lzw_init_table(&context);
init_LZW_context(1);
/* static parsers for code words of all possible sizes */
p_code12 = h_bits(12, false);
/* kcodeword() selects the appropriate parser based on context */
- H_RULE (codeword, h_bind(h_epsilon_p(), kcodeword, context));
+ H_RULE (codeword, h_bind(h_epsilon_p(), kcodeword, &context));
H_VRULE (eod, codeword);
- H_AVDRULE(clear, codeword, context);
- H_AVDRULE(output, codeword, context);
+ H_AVDRULE(clear, codeword, &context);
+ H_AVDRULE(output, codeword, &context);
- H_ADRULE(lzwblock, h_right(clear, h_many(output)), context);
+ H_ADRULE(lzwblock, h_right(clear, h_many(output)), &context);
H_ARULE (lzwdata, h_left(h_many1(lzwblock), eod));
// XXX validate that the last byte is zero-padded?
// XXX require h_end_p()?
void
init_LZW_context(int earlychange)
{
- lzw_clear_table(context);
- context->earlychange = !!earlychange;
+ lzw_clear_table(&context);
+ context.earlychange = !!earlychange;
}