#ifndef B6024EEC_47B1_43D8_A5E2_7E0CE27C1E65
#define B6024EEC_47B1_43D8_A5E2_7E0CE27C1E65
#include "lzw.h"
// Data Structures
typedef struct DecodeEntry
{
int prefix;
unsigned char character;
} DecodeEntry;
typedef struct Stack
{
unsigned char *data;
int top;
int max_size;
} Stack;
// Decoder
void decode(void);
// String Table
DecodeEntry *initDecodeTable(int table_size);
int pruneDecodeTable(DecodeEntry **table, int table_size);
// Stack
Stack *initStack(int stack_size);
void push(Stack *stack, unsigned char value);
unsigned char pop(Stack *stack);
int isStackEmpty(Stack *stack);
// Bit Unpacking
int bitUnpacker(unsigned char byte);
// Debugging
void dumpDecodeTable(struct DecodeEntry *table, int nextCode, int table_size);
#endif /* B6024EEC_47B1_43D8_A5E2_7E0CE27C1E65 */