diff --git a/lzw.c b/lzw.c index 725532f041a7773ad5cb220fe248caa449d2a3ba..ebe00a760688e06894b913f64e9b6ae2eb911ce0 100644 --- a/lzw.c +++ b/lzw.c @@ -41,11 +41,12 @@ void LZW_clear_table(LZW_context_T *ctx) } /* - * Creates a HBytes from an array of bytes and its length. The HBytes will keep the token pointer, to be freed later in lzw_clear_table or init_lzw_context. + * Creates a HBytes from an array of bytes and its length, and inserts it into the lzw dictionary in ctx. + * Also increments ctx->next. The HBytes will keep the token pointer, to be freed later in lzw_clear_table or init_lzw_context. */ void lzw_table_insert(LZW_context_T *ctx, uint8_t *token, size_t token_len) { - HBytes * next_entry = malloc(sizeof(HBytes)); + HBytes * next_entry = malloc(sizeof(HBytes)); //XXX handle malloc error next_entry->token = token; next_entry->len = token_len; ctx->lzw_code_table[ctx->next] = next_entry; @@ -196,7 +197,6 @@ validate_LZW_literal(HParseResult *p, void *u) HParsedToken* act_LZW_literal(const HParseResult *p, void *u) { - HBytes * next_entry; size_t next_entry_size; uint8_t * next_entry_token; HBytes * prev_string; @@ -215,16 +215,12 @@ act_LZW_literal(const HParseResult *p, void *u) * Update the dictionary with the new string. Use of system malloc() * here and in act_LZW_codeword is intentional, as LZW_clear_table/init_LZW_context free these */ - prev_string = ctx->lzw_code_table[ctx->old]; //XXX: insert_table(ctx, uint8_t*) function + prev_string = ctx->lzw_code_table[ctx->old]; next_entry_size = prev_string->len + 1; next_entry_token = malloc(sizeof(uint8_t) * next_entry_size); memcpy(next_entry_token, prev_string->token, prev_string->len); next_entry_token[next_entry_size - 1] = (uint8_t) code; - next_entry = malloc(sizeof(HBytes)); - next_entry->len = next_entry_size; - next_entry->token = next_entry_token; - ctx->lzw_code_table[ctx->next] = next_entry; - ctx->next++; + lzw_table_insert(ctx, next_entry_token, next_entry_size); ctx->old = code; return H_MAKE_BYTES(output, 1); @@ -234,7 +230,6 @@ HParsedToken* act_LZW_codeword(const HParseResult *p, void *u) { HBytes * prev_string; - HBytes * next_entry; uint64_t code = H_CAST_UINT(p->ast); uint8_t prefix; uint8_t * output_token; @@ -269,16 +264,11 @@ act_LZW_codeword(const HParseResult *p, void *u) */ // XXX: handle malloc errors prefix = output_token[0]; - next_entry = malloc(sizeof(HBytes)); next_entry_token = malloc(sizeof(uint8_t) * prev_string_length+1); - next_entry->len = prev_string_length+1; memcpy(next_entry_token, prev_string->token, prev_string_length); next_entry_token[prev_string_length] = prefix; - next_entry->token = next_entry_token; - ctx->lzw_code_table[ctx->next] = next_entry; - + lzw_table_insert(ctx, next_entry_token, prev_string_length+1); ctx->old = code; - ctx->next += 1; return H_MAKE_BYTES(output_token, code_token_length); } @@ -316,16 +306,11 @@ act_LZW_codeword(const HParseResult *p, void *u) * Update the dictionary */ new_prefix = output_token[0]; - next_entry = malloc(sizeof(HBytes)); next_entry_token = malloc(sizeof(uint8_t) * prev_string_length+1); - next_entry->len = prev_string_length+1; memcpy(next_entry_token, prev_string->token, prev_string_length); next_entry_token[prev_string_length] = new_prefix; - next_entry->token = next_entry_token; - ctx->lzw_code_table[ctx->next] = next_entry; - + lzw_table_insert(ctx, next_entry_token, prev_string_length+1); ctx->old = code; - ctx->next += 1; return H_MAKE_BYTES(output_token, output_length); }