#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "wv.h"

void wvInitLVL(LVL *lvl)
	{
	lvl->grpprlPapx=NULL;
	lvl->grpprlChpx=NULL;
	lvl->numbertext=NULL;
	wvInitLVLF(&(lvl->lvlf));
	}

void wvCopyLVL(LVL *dest,LVL *src)
	{
	int len;
	wvReleaseLVL(dest);
	wvInitLVL(dest);

	wvCopyLVLF(&(dest->lvlf),&(src->lvlf));


	if (src->lvlf.cbGrpprlPapx > 0)
		{
		dest->grpprlPapx = (U8 *)wvMalloc(src->lvlf.cbGrpprlPapx);
		memcpy(dest->grpprlPapx,src->grpprlPapx,src->lvlf.cbGrpprlPapx);
		}		
	else
		dest->grpprlPapx = NULL;

	if (src->lvlf.cbGrpprlChpx > 0)
		{
		dest->grpprlChpx = (U8 *)wvMalloc(src->lvlf.cbGrpprlChpx);
		memcpy(dest->grpprlChpx,src->grpprlChpx,src->lvlf.cbGrpprlChpx);
		}	
	else
		dest->grpprlChpx = NULL;
	
	if (src->numbertext==NULL)
		dest->numbertext=NULL;
	else
		{
		len = src->numbertext[0];
		dest->numbertext = (U16 *)wvMalloc(sizeof(U16)*(len +2));
		memcpy(dest->numbertext,src->numbertext,len+2);
		}
	}

void wvGetLVL(LVL *lvl,wvStream *fd)
	{
	int len;
	wvGetLVLF(&(lvl->lvlf),fd);
	if (lvl->lvlf.cbGrpprlPapx > 0)
		{
		lvl->grpprlPapx = (U8 *)wvMalloc(lvl->lvlf.cbGrpprlPapx);
		wvStream_read(lvl->grpprlPapx,sizeof(U8),lvl->lvlf.cbGrpprlPapx,fd);
		}		
	else
		lvl->grpprlPapx = NULL;
	if (lvl->lvlf.cbGrpprlChpx > 0)
		{
		lvl->grpprlChpx = (U8 *)wvMalloc(lvl->lvlf.cbGrpprlChpx);
		wvStream_read(lvl->grpprlChpx,sizeof(U8),lvl->lvlf.cbGrpprlChpx,fd);
		}	
	else
		lvl->grpprlChpx = NULL;
	len = read_16ubit(fd);
	if (len > 0)
		{
		lvl->numbertext = (U16 *)wvMalloc(sizeof(U16)*(len +2));
		lvl->numbertext[0] = len;
		wvStream_read(&(lvl->numbertext[1]),sizeof(U16),len,fd);
		lvl->numbertext[len-1] = 0;
		}
	else
		lvl->numbertext = NULL;
	wvTrace(("len is %d\n",len));
	}

void wvReleaseLVL(LVL *lvl)
	{
	if (lvl == NULL)
		return;
	wvFree(lvl->grpprlPapx);
	wvFree(lvl->grpprlChpx);
	wvFree(lvl->numbertext);
	}

void wvCopyLVLF(LVLF *dest,LVLF *src)
	{
	memcpy(dest,src,sizeof(LVLF));
	}

void wvGetLVLF(LVLF *item,wvStream *fd)
	{
	U8 temp8;
	int i;
#ifdef PURIFY
	wvInitLVLF(item);
#endif
	item->iStartAt = read_32ubit(fd);
	wvTrace(("iStartAt is %d\n",item->iStartAt));
    item->nfc = read_8ubit(fd);
	temp8 = read_8ubit(fd);
    item->jc = temp8 & 0x03;
   	item->fLegal = (temp8 & 0x04) >>2;
    item->fNoRestart = (temp8 & 0x08) >> 3;
    item->fPrev = (temp8 & 0x10) >> 4;
    item->fPrevSpace = (temp8 & 0x20) >> 5;
    item->fWord6 = (temp8 & 0x40) >> 6;
    item->reserved1 = (temp8 & 0x80) >> 7;
	for (i=0;i<9;i++)
    	item->rgbxchNums[i] = read_8ubit(fd); 
    item->ixchFollow = read_8ubit(fd);;
    item->dxaSpace = read_32ubit(fd);      
    item->dxaIndent = read_32ubit(fd);     
    item->cbGrpprlChpx = read_8ubit(fd);
    item->cbGrpprlPapx = read_8ubit(fd);
    item->reserved2 = read_16ubit(fd);;  
	}


void wvInitLVLF(LVLF *item)
	{
	int i;
	item->iStartAt = 1;
    item->nfc = 0;
    item->jc = 0;
   	item->fLegal = 0;
    item->fNoRestart = 0;
    item->fPrev = 0;
    item->fPrevSpace = 0;
    item->fWord6 = 0;
    item->reserved1 = 0;
	for (i=0;i<9;i++)
    	item->rgbxchNums[i] = 0;
    item->ixchFollow = 0;
    item->dxaSpace = 0;
    item->dxaIndent = 0;
    item->cbGrpprlChpx = 0;
    item->cbGrpprlPapx = 0;
    item->reserved2 = 0;
	}
