#include "Header.h"
#include "GlobHdr.h"
#include <stdlib.h>
#include <string.h>

#include "huffman.h"
#include "FStream.h"

GlobHdr* Glb = NULL;

extern _kernel_oserror* check_hardware(void);

_kernel_oserror* Module_Initialize(const char* cmd_tail, int podule_base, void* pw)
{
	_kernel_oserror* err = check_hardware();

	IGNORE(cmd_tail);
	IGNORE(podule_base);

	if (err) return err;

	Glb = malloc(sizeof(*Glb));

	memset(Glb, 0, sizeof(*Glb));
	Glb->pw = pw;
	Glb->pmodname = Module_Title;
	Glb->cfg.inputbufsize = 128;
	Glb->cfg.outputbufsize = 1024;

	initialize_huffman();

	return Streams_Init(Glb, pw);
}

_kernel_oserror* Module_Finalize(int fatal, int podule, void* pw)
{
	_kernel_oserror* e;

	IGNORE(fatal);
	IGNORE(podule);

        e = Streams_Finalize(Glb, pw);
	if (e) return e;

	finalize_huffman();

	free(Glb);
	Glb = NULL;

	return NULL;
}

_kernel_oserror* Module_Swis(int swi_offset, _kernel_swi_regs* r, void* pw)
{
	IGNORE(pw);

	switch(swi_offset)
	{
		case 0x00: return swi_StreamInit(Glb, r);
		case 0x01: return swi_StreamQuit(Glb, r);
		case 0x02: return swi_StreamInfo(Glb, r);
		case 0x03: return swi_StreamClear(Glb, r);
		case 0x04: return swi_StreamAttach(Glb, r);
		case 0x05: return swi_Configure(Glb, r);
		case 0x06: return swi_StreamProcess(Glb, r);
	}

	return error_BAD_SWI;
}
