#include <stdio.h>
#include <stdlib.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "wvexporter-priv.h"

void wvPutSTSHI(STSHI *item, U16 cbSTSHI, wvStream *fd)
{
  U16 temp16 = 0, count = 0;
  int i;
  
  write_16ubit(fd, item->cstd);
  write_16ubit(fd, item->cbSTDBaseInFile);
  
  temp16 |= item->fStdStylenamesWritten;
  temp16 |= item->reserved <<1;
  write_16ubit(fd, temp16);
  
  write_16ubit(fd, (U16)item->stiMaxWhenSaved);
  write_16ubit(fd, item->istdMaxFixedWhenSaved);
  write_16ubit(fd, item->nVerBuiltInNamesWhenSaved);
  
  count = 12; /* add */
  
  for(i = 0; i < 3; i++)
    {
      write_16ubit(fd, item->rgftcStandardChpStsh[i]);
      count += 2;
      if(count >= cbSTSHI) break;
    }
  
  while(count<cbSTSHI)
    {
      count++;
      write_8ubit(fd, 0); /* write garbage */
    }
}

void wvPutSTD(STD *item, U16 len, wvStream *fd)
{
  U16 temp16 = 0;
  U16 i,j;
  int pos;
  int ret=0;
  U16 count=0;
  
  temp16 |= item->sti;
  temp16 |= item->fScratch << 12;
  temp16 |= item->fInvalHeight << 13;
  temp16 |= item->fHasUpe << 14;
  temp16 |= item->fMassCopy << 15;
  write_16ubit(fd, temp16);
  
  temp16 = 0;
  temp16 |= item->sgc;
  temp16 |= item->istdBase << 4;
  write_16ubit(fd, temp16);
  
  temp16 = 0;
  temp16 |= item->cupx;
  temp16 |= item->istdNext << 4;
  write_16ubit(fd, temp16);
  
  write_16ubit(fd, (U16)item->bchUpe);
  
  count = 8; /* add */
  pos = 11;
  ret = 1;
  
  write_8ubit(fd, (U8)len);
  
  for(i=0;i<len;i++)
    {
      /* if (count > 10) */
      /* write_16ubit(fd, (U16)item->xstzName[i]) */
      /* else */
      write_8ubit(fd, (U8)item->xstzName[i]);
      pos++;
    }
  
  for(i=0;i<item->cupx;i++)
    {
      if((pos+1)/2 != pos/2)
	{
	  /* eat odd bytes */
	  wvStream_offset(fd,-1); /* TODO: check me */
	  pos++;
	}
      
      write_16ubit(fd, item->grupxf[i].cbUPX);
      pos+=2;
      
      if(item->grupxf[i].cbUPX == 0)
	continue;
      
      if((item->cupx == 1) || ((item->cupx == 2) && (i==1)))
	{
	  for(j = 0; j<item->grupxf[i].cbUPX;j++)
	  {
	    write_8ubit(fd, item->grupxf[i].upx.chpx.grpprl[j]);
	    pos++;
	  }
	}
      else if((item->cupx == 2) && (i == 0))
	{
	  write_16ubit(fd, item->grupxf[i].upx.papx.istd);
	  pos+=2;
	  
	  for(j=0;j<item->grupxf[i].cbUPX-2;j++)
	    {
	      write_8ubit(fd, item->grupxf[i].upx.papx.grpprl[j]);
	      pos++;
	    }
	}
      else
	{
	  /* something is FUBAR -- maybe try to handle it here someday */
	  wvError(("Something FUBAR in wbPutSTD"));
	}
    }
  
  /* eat odd bytes */
  if((pos+1)/2 != pos/2) /* check me */
    wvStream_offset(fd,-1);
}

void wvPutSTSH(STSH *item, U16 cbStshi, wvStream *fd)
{
  U16 i;

  write_16ubit(fd, cbStshi);
  wvPutSTSHI(&(item->Stshi), cbStshi, fd);
  
  if(item->Stshi.cstd == 0)
    return;
  
  if(item->std == NULL)
    {
      wvError(("What the @#*@#*: item->std is null"));
      return;
    }
  
  for(i=0;i<item->Stshi.cstd;i++)
    {
      write_16ubit(fd, i); /* TODO: is this right?? i+1?? */
      /* TODO */ /* wvPutSTD(&(item->std[i]), fd); */
    }
  
  /* TODO: there must be a setting of styles */
  /* TODO: this probably is not finished */
}

