[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

/*
 *
 * iff.h:       General Definitions for IFFParse modules
 *
 * 6/27/91
 */

#ifndef IFFP_IFF_H
#define IFFP_IFF_H

#include "iffp/compiler.h"

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef EXEC_MEMORY_H
#include <exec/memory.h>
#endif
#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif
#ifndef UTILITY_HOOKS_H
#include <utility/hooks.h>
#endif
#ifndef LIBRARIES_IFFPARSE_H
#include <libraries/iffparse.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef MYDEBUG_H
#include "iffp/debug.h"
#endif

#ifndef NO_PROTOS
#include <clib/exec_protos.h>
#include <clib/iffparse_protos.h>
#endif

#ifndef MAX
#define MAX(a,b)        ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b)        ((a) < (b) ? (a) : (b))
#endif
#ifndef ABS
#define ABS(x)          ((x) < 0 ? -(x) : (x))
#endif


#define CkErr(expression)  {if (!error) error = (expression);}
#define ChunkMoreBytes(cn)      (cn->cn_Size - cn->cn_Scan)
#define IS_ODD(a)               (a & 1)

#define IFF_OKAY        0L
#define CLIENT_ERROR    1L
#define NOFILE          5L

#define message printf

/* Generic Chunk ID's we may encounter */
#define ID_ANNO         MAKE_ID('A','N','N','O')
#define ID_AUTH         MAKE_ID('A','U','T','H')
#define ID_CHRS         MAKE_ID('C','H','R','S')
#define ID_Copyright    MAKE_ID('(','c',')',' ')
#define ID_CSET         MAKE_ID('C','S','E','T')
#define ID_FVER         MAKE_ID('F','V','E','R')
#define ID_NAME         MAKE_ID('N','A','M','E')
#define ID_TEXT         MAKE_ID('T','E','X','T')
#define ID_BODY         MAKE_ID('B','O','D','Y')


/* Used to keep track of allocated IFFHandle, and whether file is
 * clipboard or not, filename, copied chunks, etc.
 * This structure is included in the beginning of every
 * form-specific info structure used by the example modules.
 */
struct ParseInfo {
        /* general parse.c related */
        struct  IFFHandle *iff;         /* to be alloc'd with AllocIFF */
        UBYTE   *filename;              /* current filename of this ui */
        LONG    *propchks;              /* properties to get */
        LONG    *collectchks;           /* properties to collect */
        LONG    *stopchks;              /* stop on these (like BODY) */
        BOOL    opened;                 /* this iff has been opened */
        BOOL    clipboard;              /* file is clipboard */
        BOOL    hunt;                   /* we are parsing a complex file */
        BOOL    Reserved1;              /* must be zero for now */

        /* for copychunks.c - for read/modify/write programs
         * and programs that need to keep parsed chunk info
         * around after closing file.
         * Deallocated by freechunklist();
         */
        struct Chunk *copiedchunks;

        /* application may hang its own list of new chunks here
         * just to keep it with the frame.
         */
        struct Chunk *newchunks;

        ULONG   Reserved[8];
        };


/*
 * Used by some modules to save or pass a singly linked list of chunks
 */
struct Chunk {
        struct  Chunk *ch_Next;
        long    ch_Type;
        long    ch_ID;
        long    ch_Size;
        void    *ch_Data;
};


#ifndef NO_PROTOS
/* parse.c */
LONG openifile(struct ParseInfo *,UBYTE *,ULONG);
void closeifile(struct ParseInfo *);
LONG parseifile(struct ParseInfo *,
                LONG, LONG, LONG *, LONG *, LONG *);
LONG getcontext(struct IFFHandle *);
LONG nextcontext(struct IFFHandle *);
LONG currentchunkis(struct IFFHandle *, LONG type, LONG id);
LONG contextis(struct IFFHandle *, LONG type, LONG id);
UBYTE *findpropdata(struct IFFHandle *iff, LONG type, LONG id);
void initiffasstdio(struct IFFHandle *);
UBYTE *IFFerr(LONG);
LONG chkcnt(LONG *);
long PutCk(struct IFFHandle *iff, long id, long size, void *data);

/* copychunks.c */
struct Chunk *copychunks(struct IFFHandle *iff,
                 LONG *propchks, LONG *collectchks, ULONG memtype);
void freechunklist(struct Chunk *first);
struct Chunk *findchunk(struct Chunk *first, long type, long id);
long writechunklist(struct IFFHandle *iff, struct Chunk *first);
#endif /* NO_PROTOS */

#endif /* IFFP_IFF_H */