#error By license you aren't permitted to compile this.  Read GUISpell.doc.
#include <string.h>
#include <libraries/iffparse.h> // Why is this needed with proto/all.h?
#include <proto/iffparse.h>
#include "libraries.h"

// Check if 0.  If not, then die.
#define CHECK0(a) if (a) goto die

// Check if non-0.  If not, then die.
#define CHECKN0(a) if (!(a)) goto die

// Check if greater than or equal to 0.  If not, then die.
#define CHECKGE0(a) if ((a) < 0) goto die

void TextToClip (char *s)
{
  struct IFFHandle *iff;
  
  CHECKN0 (iff = AllocIFF ());
  CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  InitIFFasClip (iff);
  CHECK0 (OpenIFF (iff, IFFF_WRITE));

  CHECKGE0 (PushChunk (iff, 'FTXT', 'FORM', IFFSIZE_UNKNOWN));

    CHECKGE0 (PushChunk (iff, 0, 'CHRS', IFFSIZE_UNKNOWN));
    CHECKGE0 (WriteChunkBytes (iff, s, strlen (s)));
    CHECKGE0 (PopChunk (iff));

  //CHECKGE0 (PushChunk (iff, 0L, 'ANNO', IFFSIZE_UNKNOWN));
  //CHECKGE0 (WriteChunkBytes (iff, "written by IGadSpell and iffparse", 33));
  //CHECKGE0 (PopChunk (iff));

  CHECKGE0 (PopChunk (iff));

die:
  if (iff)
    {
      CloseIFF (iff);
      if (iff->iff_Stream)
        CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
      FreeIFF (iff);
    }
}

int TextFromClip (char *buffer, int size)
{
  struct IFFHandle *iff;
  int good_read = 0;

  CHECKN0 (iff = AllocIFF ());
  CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  InitIFFasClip (iff);
  CHECK0 (OpenIFF (iff, IFFF_READ));

  for (;;)
    {
      switch (ParseIFF (iff, IFFPARSE_RAWSTEP))
        {
        case IFFERR_EOC:
          break;
        case IFFERR_EOF:
          goto die;
        case 0:
	{
	  struct ContextNode *chunk = CurrentChunk (iff);

          if (chunk && chunk->cn_ID == 'CHRS' && chunk->cn_Type == 'FTXT')
	    {
	      int bytes_read = ReadChunkBytes (iff, buffer, size);

              if (chunk->cn_Size == bytes_read)
		good_read = 1;
              if (chunk->cn_Size > bytes_read)
		good_read = -1;
	      if (!bytes_read && chunk->cn_Size)
		good_read = 0;

	      buffer[bytes_read < size ? bytes_read : size - 1] = '\0';

              goto die;
            }
          break;
	}
        default:
          goto die;
        }
    }

die:
  if (iff)
    {
      CloseIFF (iff);
      if (iff->iff_Stream)
        CloseClipboard ((struct ClipboardHandle *)iff->iff_Stream);
      FreeIFF (iff);
    }

  return good_read;
}
