#include <exec/types.h>
#include <stdio.h>
#include <dos/dosextens.h>
#include <libraries/iffparse.h>
#include <iffp/ilbm.h>
#include <clib/dos_protos.h>
#include <clib/iffparse_protos.h>

#define NUMCOLORS 16
struct Library *IFFParseBase;
struct IFFHandle *iff;
BitMapHeader bmhd;
UBYTE cmap[3 * NUMCOLORS];

extern void writebody(struct IFFHandle *),initchunks(void);

void dosomething()
{
  PushChunk(iff, ID_ILBM, ID_FORM, IFFSIZE_UNKNOWN);
  PushChunk(iff, ID_ILBM, ID_BMHD, sizeof(BitMapHeader));
  WriteChunkBytes(iff, &bmhd, sizeof(bmhd));
  PopChunk(iff);

  PushChunk(iff, ID_ILBM, ID_CMAP, sizeof(cmap));
  WriteChunkBytes(iff, cmap, sizeof(cmap));
  PopChunk(iff);

  PushChunk(iff, ID_ILBM, ID_BODY, IFFSIZE_UNKNOWN);
  writebody(iff);
  PopChunk(iff);
}

main()
{
  IFFParseBase = OpenLibrary("iffparse.library",0L);
  if (!IFFParseBase) return;
  iff = AllocIFF();
  if (iff){
    iff->iff_Stream = Open("miofile",MODE_NEWFILE);
    if (iff->iff_Stream){
      InitIFFasDOS(iff);
      OpenIFF(iff,IFFF_WRITE);

      initchunks();
      dosomething();

      CloseIFF(iff);
      Close(iff->iff_Stream);
    }
    else
      printf("miofile non si apre\n");
  }
  FreeIFF(iff);
  CloseLibrary(IFFParseBase);
}
#define MESG(x)  printf(x); break;

8<---------------------------------------------------------------------

void dosomething(void)
{
  struct ContextNode *cn;
  long code;

  do{
    code = ParseIFF(iff, IFFPARSE_RAWSTEP);
    if (code != IFFERR_EOF){
      cn=CurrentChunk(iff);
      switch (cn->cn_ID){
        case ID_FORM: MESG("chunk FORM:");
        case ID_ILBM: MESG("chunk ILBM:");
        case ID_BODY: MESG("chunk BODY:");
        case ID_BMHD: MESG("chunk BMHD:");
        case ID_CAMG: MESG("chunk CAMG:");
        case ID_CMAP: MESG("chunk CMAP:");
        case ID_CRNG: MESG("chunk CRNG:");
        default:      MESG("unknown:");
      }
      if (code == 0)
        printf(" in\n");
      else
        printf(" out\n");
    }
  }while(code != IFFERR_EOF);
}

8<-----------------------------------------------------------------------

void dosomething(void)
{
  struct ContextNode *cn;
  struct StoredProperty *sp;

  PropChunk(iff,ID_ILBM,ID_CMAP);
  PropChunk(iff,ID_ILBM,ID_CRNG);
  StopChunk(iff,ID_ILBM,ID_BODY);
  ParseIFF(iff, IFFPARSE_SCAN);
  cn=CurrentChunk(iff);
  if (cn && cn->cn_ID == ID_BODY)
    printf("chunk BODY\n");

  sp = FindProp(iff, ID_ILBM,ID_CMAP);
  if (!sp)
    printf("non contiene CMAP\n");
  sp = FindProp(iff, ID_ILBM,ID_CRNG);
  if (!sp)
    printf("non contiene CRNG\n");

}

8<------------------------------------------------------------------

void dosomething(void)
{
  struct ContextNode *cn;
  int i;
  long code;

  StopChunk(iff,ID_ILBM,ID_BODY);
  StopChunk(iff,ID_ILBM,ID_CMAP);
  do{
    code = ParseIFF(iff, IFFPARSE_SCAN);
    if (code != IFFERR_EOF){
      cn=CurrentChunk(iff);
      if (cn->cn_ID == ID_BODY)
        printf("BODY\n");
      else if(cn->cn_ID == ID_CMAP)
        printf("CMAP\n");
    }
  }while(code != IFFERR_EOF);
}

8<--------------------------------------------------------------------------

#include <exec/types.h>
#include <stdio.h>
#include <dos/dosextens.h>
#include <libraries/iffparse.h>
#include <iffp/ilbm.h>
#include <clib/dos_protos.h>
#include <clib/iffparse_protos.h>

struct Library *IFFParseBase;
struct IFFHandle *iff;

main()
{
  IFFParseBase = OpenLibrary("iffparse.library",0L);
  if (!IFFParseBase) return;
  iff = AllocIFF();
  if (iff){
    iff->iff_Stream = Open("miofile",MODE_OLDFILE);
    if (iff->iff_Stream){
      InitIFFasDOS(iff);
      OpenIFF(iff,IFFF_READ);

      dosomething();

      CloseIFF(iff);
      Close(iff->iff_Stream);
    }
    else
      printf("miofile non si apre\n");
  }
  FreeIFF(iff);
  CloseLibrary(IFFParseBase);
}
