|##########| |#MAGIC #|CLABLMDG |#PROJECT #|"" |#PATHS #|"StdProject" |#FLAGS #|xx-x-x-xx---x-x----------------- |#USERSW #|-------------------------------- |#USERMASK#|-------------------------------- |#SWITCHES#|xx---xxxxx-xx--- |##########| (* $A- *) DEFINITION MODULE IFFParse; FROM Exec IMPORT MinNode,LibraryPtr,MsgPort; FROM System IMPORT Regs,SysStringPtr; FROM Utility IMPORT HookPtr; FROM Clipboard IMPORT IOClipboardPtr; TYPE | | IFF return codes. Most functions return either zero for success or | one of these codes. The exceptions are the read/write functions which | return positive values for number of bytes or records read or written, | or a negative error code. Some of these codes are not errors per sae, | but valid conditions such as EOF or EOC (End of Chunk). IFFErr = (normalReturn = -12, noHook, notIFF, syntax, mangled, seek, write,read, noMem, noScope, eoc, eof, ok); | eof Reached logical end of file | eoc About to leave context | noScope No valid scope for property | noMem Internal memory alloc failed | read Stream read error | write Stream write error | seek Stream seek error | mangled Data in file is corrupt | syntax IFF syntax error | notIFF Not an IFF file | noHook No call-back hook provided | normalReturn Client handler normal return | | Universal IFF identifiers. CONST IDFORM = $464F524D; | "FORM" IDLIST = $4C495354; | "LIST" IDCAT = $43415420; | "CAT " IDPROP = $50524F50; | "PROP" IDNULL = $20202020; | "NULL" | | Ident codes for universally recognized local context items. IFFLCIPROP = $70726F70; | "prop" IFFLCICOLLECTION = $636F6C6C; | "coll" IFFLCIENTRYHANDLER = $656E6864; | "enhd" IFFLCIEXITHANDLER = $65786864; | "exhd" TYPE | | Control modes for ParseIFF() function. ParseIFFMode = (scan, step, rawStep, dummy = 31); | | Control modes for StoreLocalItem(). StoreLocalItemMode = (root = 1, top, prop, dummy = 31); | | "Flag" for writing functions. If you pass this value in as a size | to PushChunk() when writing a file, the parser will figure out the | size of the chunk for you. (Chunk sizes >= 2**31 are forbidden by the | IFF specification, so this works.) CONST IFFSizeUnknown = -1; TYPE | | Possible call-back command values. (Using 0 as the value for IFFCMD_INIT | was, in retrospect, probably a bad idea.) IFFCmd = (init, cleanup, read, write, seek, entry, exit, purgeLCI); | init | Prepare the stream for a session | cleanup | Terminate stream session | read | Read bytes from stream | write | Write bytes to stream | seek | Seek on stream | entry | You just entered a new context | exit | You're about to leave a context | purgeLCI | Purge a LocalContextItem | | Struct associated with an active IFF stream. | "iff_Stream" is a value used by the client's read/write/seek functions - | it will not be accessed by the library itself and can have any value | (could even be a pointer or a BPTR). | | Bit masks for "iff_Flags" field. IFFFlags = (read, write, fseek, rseek, reserved1 = 16,reserved16 = 31); IFFFlagSet = SET OF IFFFlags; IFFHandlePtr = POINTER TO IFFHandle; IFFHandle = RECORD stream : ANYPTR; flags : IFFFlagSet; depth : LONGINT; | Depth of context stack. END; | | When the library calls your stream handler, you'll be passed a pointer | to this structure as the "message packet". IFFStreamCmdPtr = POINTER TO IFFStreamCmd; IFFStreamCmd = RECORD command : IFFCmd; | Operation to be performed buf : ANYPTR; | Pointer to data buffer nBytes : LONGINT; | Number of bytes to be affected END; | | A node associated with a context on the iff_Stack. Each node | represents a chunk, the stack representing the current nesting | of chunks in the open IFF file. Each context node has associated | local context items in the (private) LocalItems list. The ID, type, | size and scan values describe the chunk associated with this node. ContextNodePtr= POINTER TO ContextNode; ContextNode = RECORD node : MinNode; iD : LONGINT; type : LONGINT; size : LONGINT; | Size of this chunk scan : LONGINT; | # of bytes read/written so | far END; | | Local context items live in the ContextNode's. Each class is identified | by its lci_Ident code and has a (private) purge vector for when the | parent context node is popped. LocalContextItemPtr = POINTER TO LocalContextItem; LocalContextItem = RECORD node : MinNode; iD, type, ident : LONGCARD; END; | | StoredProperty: a local context item containing the data stored | from a previously encountered property chunk. StoredPropertyPtr = POINTER TO StoredProperty; StoredProperty = RECORD size : LONGINT; data : ANYPTR; END; | | Collection Item: the actual node in the collection list at which | client will look. The next pointers cross context boundaries so | that the complete list is accessable. CollectionItemPtr = POINTER TO CollectionItem; CollectionItem = RECORD next : CollectionItemPtr; size : LONGINT; data : ANYPTR; END; | | Structure returned by OpenClipboard(). You may do CMD_POSTs and such | using this structure. However, once you call OpenIFF(), you may not | do any more of your own I/O to the clipboard until you call CloseIFF(). ClipboardHandlePtr = POINTER TO ClipboardHandle; ClipboardHandle = RECORD req : IOClipboardPtr; cBPort : MsgPort; satisfyPort : MsgPort; END; VAR IFFParseBase : LibraryPtr; LIBRARY IFFParseBase BY -30 PROCEDURE AllocIFF() : IFFHandlePtr; LIBRARY IFFParseBase BY -36 PROCEDURE OpenIFF(iff IN A0: IFFHandlePtr; rwMode IN D0: IFFFlagSet): IFFErr; LIBRARY IFFParseBase BY -42 PROCEDURE ParseIFF(iff IN A0: IFFHandlePtr; control IN D0: ParseIFFMode): IFFErr; LIBRARY IFFParseBase BY -48 PROCEDURE CloseIFF(iff IN A0: IFFHandlePtr); LIBRARY IFFParseBase BY -54 PROCEDURE FreeIFF(iff IN A0: IFFHandlePtr); LIBRARY IFFParseBase BY -60 PROCEDURE ReadChunkBytes(iff IN A0: IFFHandlePtr; buf IN A1: ANYPTR; size IN D0: LONGINT): LONGINT; LIBRARY IFFParseBase BY -66 PROCEDURE WriteChunkBytes(iff IN A0: IFFHandlePtr; buf IN A1: ANYPTR; size IN D0: LONGINT): IFFErr; LIBRARY IFFParseBase BY -72 PROCEDURE ReadChunkRecords(iff IN A0: IFFHandlePtr; buf IN A1: ANYPTR; bytesPerRecord IN D0: LONGINT; nRecords IN D1: LONGINT): LONGINT; LIBRARY IFFParseBase BY -78 PROCEDURE WriteChunkRecords(iff IN A0: IFFHandlePtr; buf IN A1: ANYPTR; bytesPerRecord IN D0: LONGINT; nRecords IN D1: LONGINT): IFFErr; LIBRARY IFFParseBase BY -84 PROCEDURE PushChunk(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT; size IN D2: LONGINT): IFFErr; LIBRARY IFFParseBase BY -90 PROCEDURE PopChunk(iff IN A0: IFFHandlePtr): IFFErr; LIBRARY IFFParseBase BY -102 PROCEDURE EntryHandler(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT; position IN D2: LONGINT; handler IN A1: HookPtr; object IN A2: ANYPTR): IFFErr; LIBRARY IFFParseBase BY -108 PROCEDURE ExitHandler(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT; position IN D2: LONGINT; handler IN A1: HookPtr; object IN A2: ANYPTR): IFFErr; LIBRARY IFFParseBase BY -114 PROCEDURE PropChunk(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): IFFErr; LIBRARY IFFParseBase BY -120 PROCEDURE PropChunks( iff IN A0: IFFHandlePtr; VAR propArray IN A1: ARRAY OF LONGINT; nProps IN D0: LONGINT): IFFErr; LIBRARY IFFParseBase BY -126 PROCEDURE StopChunk(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): IFFErr; LIBRARY IFFParseBase BY -132 PROCEDURE StopChunks( iff IN A0: IFFHandlePtr; VAR propArray IN A1: ARRAY OF LONGINT; nProps IN D0: LONGINT): IFFErr; LIBRARY IFFParseBase BY -138 PROCEDURE CollectionChunk(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): IFFErr; LIBRARY IFFParseBase BY -144 PROCEDURE CollectionChunks( iff IN A0: IFFHandlePtr; VAR propArray IN A1: ARRAY OF LONGINT; nProps IN D0: LONGINT): IFFErr; LIBRARY IFFParseBase BY -150 PROCEDURE StopOnExit(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): IFFErr; LIBRARY IFFParseBase BY -156 PROCEDURE FindProp(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): StoredPropertyPtr; LIBRARY IFFParseBase BY -162 PROCEDURE FindCollection(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT): CollectionItemPtr; LIBRARY IFFParseBase BY -168 PROCEDURE FindPropContext(iff IN A0: IFFHandlePtr): ContextNodePtr; LIBRARY IFFParseBase BY -174 PROCEDURE CurrentChunk(iff IN A0: IFFHandlePtr): ContextNodePtr; LIBRARY IFFParseBase BY -180 PROCEDURE ParentChunk(contextNode IN A0: ContextNodePtr): ContextNodePtr; LIBRARY IFFParseBase BY -186 PROCEDURE AllocLocalItem(type IN D0: LONGINT; id IN D1: LONGINT; ident IN D2: LONGINT; dataSize IN D3: LONGINT): LocalContextItemPtr; LIBRARY IFFParseBase BY -192 PROCEDURE LocalItemData(localItem IN A0: LocalContextItemPtr): ANYPTR; LIBRARY IFFParseBase BY -198 PROCEDURE SetLocalItemPurge(localItem IN A0: LocalContextItemPtr; purgeHook IN A1: HookPtr); LIBRARY IFFParseBase BY -204 PROCEDURE FreeLocalItem(localItem IN A0: LocalContextItemPtr); LIBRARY IFFParseBase BY -210 PROCEDURE FindLocalItem(iff IN A0: IFFHandlePtr; type IN D0: LONGINT; id IN D1: LONGINT; ident IN D2: LONGINT): LocalContextItemPtr; LIBRARY IFFParseBase BY -216 PROCEDURE StoreLocalItem(iff IN A0: IFFHandlePtr; localItem IN A1: LocalContextItemPtr; position IN D0: StoreLocalItemMode): IFFErr; LIBRARY IFFParseBase BY -222 PROCEDURE StoreItemInContext(iff IN A0: IFFHandlePtr; localItem IN A1: LocalContextItemPtr; contextNode IN A2: ContextNodePtr); LIBRARY IFFParseBase BY -228 PROCEDURE InitIFF(iff IN A0: IFFHandlePtr; flags IN D0: LONGINT; streamHook IN A1: HookPtr); LIBRARY IFFParseBase BY -234 PROCEDURE InitIFFasDOS(iff IN A0: IFFHandlePtr); LIBRARY IFFParseBase BY -240 PROCEDURE InitIFFasClip(iff IN A0: IFFHandlePtr); LIBRARY IFFParseBase BY -246 PROCEDURE OpenClipboard(unitNum IN D0: LONGINT): ClipboardHandlePtr; LIBRARY IFFParseBase BY -252 PROCEDURE CloseClipboard(clipboard IN A0: ClipboardHandlePtr); LIBRARY IFFParseBase BY -258 PROCEDURE GoodID(id IN D0: LONGINT): LONGINT; LIBRARY IFFParseBase BY -264 PROCEDURE GoodType(type IN D0: LONGINT): LONGINT; LIBRARY IFFParseBase BY -270 PROCEDURE IDtoStr( id IN D0: LONGINT; VAR buf IN A0: STRING): SysStringPtr; END IFFParse.