unit IFFParse;

INTERFACE
uses Exec, Clipboard, Utility;


type
	pLocalContextItem = ^tLocalContextItem;
	tLocalContextItem = record
		lci_Node: tMinNode;
		lci_ID: long;
		lci_Type: long;
		lci_Ident: long;
		end;

	pContextNode = ^tContextNode;
	tContextNode = record
		cn_Node: tMinNode;
		cn_ID: longint;
		cn_Type: longint;
		cn_Size: longint;
		cn_Scan: longint;
		end;

	pCollectionItem = ^tCollectionItem;
	tCollectionItem = record
		ci_Next: pCollectionItem;
		ci_Size: longint;
		ci_Data: pbyte;
		end;

	pStoredProperty = ^tStoredProperty;
	tStoredProperty = record
		sp_Size: longint;
		sp_Data: pbyte;
		end;

	pClipboardHandle = ^tClipboardHandle;
	tClipboardHandle = record
		cbh_Req: tIOClipReq;
		cbh_CBport: tMsgPort;
		cbh_SatisfyPort: tMsgPort;
		end;

	pIFFHandle = ^tIFFHandle;
	tIFFHandle = record
		iff_Stream: long;
		iff_Flags: long;
		iff_Depth: longint;
		end;

	pIFFStreamCmd = ^tIFFStreamCmd;
	tIFFStreamCmd = record
		sc_Command: longint;
		sc_Buf: pointer;
		sc_NBytes: longint;
		end;



var
	IFFParseBase: pLibrary;


const
	IFFSCC_READ = 2;
	IFFCMD_WRITE = 3;
	IFFCMD_SEEK = 4;
	IFFSCC_WRITE = 3;
	IFFERR_NOMEM = $FFFFFFFC;
	IFFCMD_PURGELCI = 7;
	IFFCMD_ENTRY = 5;
	IFFSCC_SEEK = 4;
	IFFERR_READ = $FFFFFFFB;
	IFFERR_SYNTAX = $FFFFFFF7;
	IFFCMD_INIT = 0;
	IFFLCI_ENTRYHANDLER = $656E6864;
	IFFPARSE_RAWSTEP = 2;
	IFFSCC_INIT = 0;
	IFFCMD_EXIT = 6;
	IFFERR_WRITE = $FFFFFFFA;
	IFFERR_SEEK = $FFFFFFF9;
	IFFCMD_CLEANUP = 1;
	IFFLCI_EXITHANDLER = $65786864;
	IFFERR_MANGLED = $FFFFFFF8;
	IFFSCC_CLEANUP = 1;
	IFFLCI_PROP = $70726F70;
	IFFF_FSEEK = 2;
	ID_FORM = $464F524D;
	IFFF_RWBITS = 1;
	ID_NULL = $20202020;
	ID_LIST = $4C495354;
	ID_CAT = $43415420;
	IFFF_RSEEK = 4;
	IFFERR_EOC = $FFFFFFFE;
	ID_PROP = $50524F50;
	IFFERR_EOF = $FFFFFFFF;
	IFFSLI_PROP = 3;
	IFFF_READ = 0;
	IFFSLI_ROOT = 1;
	IFFLCI_COLLECTION = $636F6C6C;
	IFFF_WRITE = 1;
	IFFERR_NOSCOPE = $FFFFFFFD;
	IFFPARSE_SCAN = 0;
	IFFSIZE_UNKNOWN = $FFFFFFFF;
	IFF_RETURN2CLIENT = $FFFFFFF4;
	IFFSLI_TOP = 2;
	IFFF_RESERVED = $FFFF0000;
	IFFERR_NOTIFF = $FFFFFFF6;
	IFFERR_NOHOOK = $FFFFFFF5;
	IFFPARSE_STEP = 1;
	IFFCMD_READ = 2;


function AllocIFF: pIFFHandle;
function OpenIFF
		(iff: pIFFHandle;
		rwMode: longint): longint;

function ParseIFF
		(iff: pIFFHandle;
		control: longint): longint;

procedure CloseIFF (iff: pIFFHandle);
procedure FreeIFF (iff: pIFFHandle);
function ReadChunkBytes
		(iff: pIFFHandle;
		buf: pointer;
		size: longint): longint;

function WriteChunkBytes
		(iff: pIFFHandle;
		buf: pointer;
		size: longint): longint;

function ReadChunkRecords
		(iff: pIFFHandle;
		buf: pointer;
		bytesPerRecord: longint;
		nRecords: longint): longint;

function WriteChunkRecords
		(iff: pIFFHandle;
		buf: pointer;
		bytesPerRecord: longint;
		nRecords: longint): longint;

function PushChunk
		(iff: pIFFHandle;
		type_: longint;
		id: longint;
		size: longint): longint;

function PopChunk (iff: pIFFHandle): longint;
function EntryHandler
		(iff: pIFFHandle;
		type_: longint;
		id: longint;
		position: longint;
		handler: pHook;
		object: pointer): longint;

function ExitHandler
		(iff: pIFFHandle;
		type_: longint;
		id: longint;
		position: longint;
		handler: pHook;
		object: pointer): longint;

function PropChunk
		(iff: pIFFHandle;
		type_: longint;
		id: longint): longint;

function PropChunks
		(iff: pIFFHandle;
		propArray: plongint;
		nProps: longint): longint;

function StopChunk
		(iff: pIFFHandle;
		type_: longint;
		id: longint): longint;

function StopChunks
		(iff: pIFFHandle;
		propArray: plongint;
		nProps: longint): longint;

function CollectionChunk
		(iff: pIFFHandle;
		type_: longint;
		id: longint): longint;

function CollectionChunks
		(iff: pIFFHandle;
		propArray: plongint;
		nProps: longint): longint;

function StopOnExit
		(iff: pIFFHandle;
		type_: longint;
		id: longint): longint;

function FindProp
		(iff: pIFFHandle;
		type_: longint;
		id: longint): pStoredProperty;

function FindCollection
		(iff: pIFFHandle;
		type_: longint;
		id: longint): pCollectionItem;

function FindPropContext (iff: pIFFHandle): pContextNode;
function CurrentChunk (iff: pIFFHandle): pContextNode;
function ParentChunk (contextNode: pContextNode): pContextNode;
function AllocLocalItem
		(type_: longint;
		id: longint;
		ident: longint;
		dataSize: longint): pLocalContextItem;

function LocalItemData (localItem: pLocalContextItem): pointer;
procedure SetLocalItemPurge
		(localItem: pLocalContextItem;
		purgeHook: pHook);

procedure FreeLocalItem (localItem: pLocalContextItem);
function FindLocalItem
		(iff: pIFFHandle;
		type_: longint;
		id: longint;
		ident: longint): pLocalContextItem;

function StoreLocalItem
		(iff: pIFFHandle;
		localItem: pLocalContextItem;
		position: longint): longint;

procedure StoreItemInContext
		(iff: pIFFHandle;
		localItem: pLocalContextItem;
		contextNode: pContextNode);

procedure InitIFF
		(iff: pIFFHandle;
		flags: longint;
		streamHook: pHook);

procedure InitIFFasDOS (iff: pIFFHandle);
procedure InitIFFasClip (iff: pIFFHandle);
function OpenClipboard (unitNum: longint): pClipboardHandle;
procedure CloseClipboard (clipboard: pClipboardHandle);
function GoodID (id: longint): longint;
function GoodType (type_: longint): longint;
function IDtoStr
		(id: longint;
		buf: STRPTR): STRPTR;



IMPLEMENTATION
function AllocIFF; xassembler;
asm
	move.l	a6,-(sp)
	move.l	IFFParseBase,a6
	jsr		-$1E(a6)
	move.l	d0,8(sp)
	move.l	(sp)+,a6
end;

function OpenIFF; xassembler;
asm
	move.l	a6,-(sp)
	movem.l	8(sp),d0/a0
	move.l	IFFParseBase,a6
	jsr		-$24(a6)
	move.l	d0,$10(sp)
	move.l	(sp)+,a6
end;

function ParseIFF; xassembler;
asm
	move.l	a6,-(sp)
	movem.l	8(sp),d0/a0
	move.l	IFFParseBase,a6
	jsr		-$2A(a6)
	move.l	d0,$10(sp)
	move.l	(sp)+,a6
end;

procedure CloseIFF; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$30(a6)
	move.l	(sp)+,a6
end;

procedure FreeIFF; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$36(a6)
	move.l	(sp)+,a6
end;

function ReadChunkBytes; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$3C(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function WriteChunkBytes; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$42(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function ReadChunkRecords; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$48(a6)
	move.l	d0,$18(sp)
	move.l	(sp)+,a6
end;

function WriteChunkRecords; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$4E(a6)
	move.l	d0,$18(sp)
	move.l	(sp)+,a6
end;

function PushChunk; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d2
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$54(a6)
	move.l	d0,$18(sp)
	move.l	(sp)+,a6
end;

function PopChunk; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$5A(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function EntryHandler; xassembler;
asm
	movem.l	a2/a6,-(sp)
	lea		$C(sp),a6
	move.l	(a6)+,a2
	move.l	(a6)+,a1
	move.l	(a6)+,d2
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$66(a6)
	move.l	d0,$24(sp)
	movem.l	(sp)+,a2/a6
end;

function ExitHandler; xassembler;
asm
	movem.l	a2/a6,-(sp)
	lea		$C(sp),a6
	move.l	(a6)+,a2
	move.l	(a6)+,a1
	move.l	(a6)+,d2
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$6C(a6)
	move.l	d0,$24(sp)
	movem.l	(sp)+,a2/a6
end;

function PropChunk; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$72(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function PropChunks; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$78(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function StopChunk; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$7E(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function StopChunks; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$84(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function CollectionChunk; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$8A(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function CollectionChunks; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$90(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function StopOnExit; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$96(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function FindProp; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$9C(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function FindCollection; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$A2(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

function FindPropContext; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$A8(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function CurrentChunk; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$AE(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function ParentChunk; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$B4(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function AllocLocalItem; xassembler;
asm
	movem.l	d3/a6,-(sp)
	lea		$C(sp),a6
	move.l	(a6)+,d3
	move.l	(a6)+,d2
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	IFFParseBase,a6
	jsr		-$BA(a6)
	move.l	d0,$1C(sp)
	movem.l	(sp)+,d3/a6
end;

function LocalItemData; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$C0(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

procedure SetLocalItemPurge; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$C6(a6)
	move.l	(sp)+,a6
end;

procedure FreeLocalItem; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$CC(a6)
	move.l	(sp)+,a6
end;

function FindLocalItem; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d2
	move.l	(a6)+,d1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$D2(a6)
	move.l	d0,$18(sp)
	move.l	(sp)+,a6
end;

function StoreLocalItem; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,d0
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$D8(a6)
	move.l	d0,$14(sp)
	move.l	(sp)+,a6
end;

procedure StoreItemInContext; xassembler;
asm
	movem.l	a2/a6,-(sp)
	lea		$C(sp),a6
	move.l	(a6)+,a2
	move.l	(a6)+,a1
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$DE(a6)
	movem.l	(sp)+,a2/a6
end;

procedure InitIFF; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,a1
	move.l	(a6)+,d0
	move.l	(a6)+,a0
	move.l	IFFParseBase,a6
	jsr		-$E4(a6)
	move.l	(sp)+,a6
end;

procedure InitIFFasDOS; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$EA(a6)
	move.l	(sp)+,a6
end;

procedure InitIFFasClip; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$F0(a6)
	move.l	(sp)+,a6
end;

function OpenClipboard; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),d0
	move.l	IFFParseBase,a6
	jsr		-$F6(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

procedure CloseClipboard; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),a0
	move.l	IFFParseBase,a6
	jsr		-$FC(a6)
	move.l	(sp)+,a6
end;

function GoodID; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),d0
	move.l	IFFParseBase,a6
	jsr		-$102(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function GoodType; xassembler;
asm
	move.l	a6,-(sp)
	move.l	8(sp),d0
	move.l	IFFParseBase,a6
	jsr		-$108(a6)
	move.l	d0,$C(sp)
	move.l	(sp)+,a6
end;

function IDtoStr; xassembler;
asm
	move.l	a6,-(sp)
	lea		8(sp),a6
	move.l	(a6)+,a0
	move.l	(a6)+,d0
	move.l	IFFParseBase,a6
	jsr		-$10E(a6)
	move.l	d0,$10(sp)
	move.l	(sp)+,a6
end;

end.
