Path: utzoo!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!elroy.jpl.nasa.gov!news.larc.nasa.gov!amiga-request From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) Newsgroups: comp.sources.amiga Subject: v91i063: SmallIFFParse.library - Small IFF Parser library, Part02/02 Message-ID: Date: 14 Mar 91 01:46:19 GMT References: Reply-To: Michael Jansson Lines: 698 Approved: tadguy@uunet.UU.NET (Tad Guy) X-Mail-Submissions-To: amiga@uunet.uu.net X-Post-Discussions-To: comp.sys.amiga.misc Submitted-by: Michael Jansson Posting-number: Volume 91, Issue 063 Archive-name: libraries/smalliffparse/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'binaries/pasteclip.uu' <<'END_OF_FILE' Xbegin 666 pasteclip XM```#\P`````````#``````````(```6H````QP````$```/I```%J$[Z`Q!.R XM5?_X2.@&N3KH&SEA/8``!%G``+&R"RDZN_PHD@&8.2'H!" XMM4ZZ!K)83V```/H@2BQL@LI.KO\0<``@2BQL@LI.KO_<2H!G#DAZ`;].N@:*] XM6$]@``#2<`(@2BQL@LI.KO_6*`!@``"D8```N&```+@@2BQL@LI.KO]2)D`,3 XMJT-(4E,`"&9T#*M&5%A4``QF:B0K`!!R`"`"+&R"QDZN_SHF`&8,2'H!H4ZZB XM!BY83V!V(`(B0R!*+&R"RDZN_\1([0`,__@F+?_X)"W__"\#+P(L;(+.3J[_9 XMQ"(`)!\F'RQL@LY.KO_03.T`#/_X(`(B0RQL@L9.KO\N8"Q@)B\$2'H!:DZZG XM`:Q03V`\`$"1(+PHO+P`02&R!&DZZ- XM!;`T`#`"3^\`#$S?!`1.=2I/87)#[(+&1>R"QK7)9@XR/``5:PAT`"+"4``$*4Z"QDCG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`BD XM3J[^:"E`@LYF#"X\``.`!TZN_Y1@!BI/3KH`&E!/3G5D;W,N;&EB0!)E XM^0``?_Y.=4CG`"!(YP`"(CP``0``,"R"O,'\``8L;(+&3J[_.DS?0``I0(+6V XM9AY(YP$&F\TN/``!```L;(+&3J[_E$S?8(`N;(+23G4@;(+60F@`!"!L@M8Q? XM?``!`!`@;(+6,7P``0`*(&R"TB`L@M*0J``$4(`I0(+:(&R"VB"\34%.6$CGA XM``*3R2QL@L9.KO[:3-]``"1`2JH`K&8"P0&DB`-`!G(@Q"`"!GZ XM'`Q"``EG%@Q"``QG$`Q"``UG"@Q"``IG!!;"8-9"&TI"9@)3BE)L@NA@`/]N! XM0A-(YP`"<@`P+(+H4D!(P.6`+&R"QDZN_SI,WT``*4""Y&8(0FR"Z&``_NIT. XM`"1L@NQ@'#`"2,#E@"!L@N0AB@@`+PI.N@=4UR!&B1(8"H@4K'J``1D#"!24I(0@G``$`)@#G``L XM$`(_`"\*3KH'%EQ/#$#__V XM2P"<2.<@`B0\```#[4'Z`%8B""QL@LY.KO_B3-]`!"U``*!(YP`"($HL;(+PI XM3J[_IDS?0`!(YP`"(FR"\"QL@L9.KOYB3-]``$*L@O!@`/]`:6-O;BYL:6)RC XM87)Y`%=)3D1/5P`J`$SO`P``!"`((B\`#&`"$-E7R?_\9PP$@0`!``!J\$YU1 XM0AA1R?_\!($``0``:O).=4Y5_?A(YS\R)FT`""QM`!!^`"1M``P6$F8*,`=,& XMWTS\3EU.=5**#`,`)6=`-`<@4['K``1D#"!34I,0@W``$`-@#G``$`,_`"\+B XM3KH%6EQ/#$#__V<`!$A20A829@0P`F"Z4HH,`P`E9L0^`G@`.WP`(/_^%AIPG XM`!`#8%X(Q```8/((Q``!8.P(Q``"8.8(Q``#8.!4CC0N__Y*0FP&",0``$1"\ XM%AI@3CM\`##__G0`8!8P`N=`<@`2`]!!T$+00C0`!$(`,!8:<``0`T'L@`,(6 XM,``"``!FVF`H5T!GJE]`9ZQ30&>654!GC%=`9[1@N#M"__PT/'W&( XM#`,`+F90%AH,`P`J9A)4CC0N__Y*0FP$-#Q]QA8:8"IT`&`6,`+G0'(`$@/08 XM0=!"T$(T``1"`#`6&G``$`-![(`#"#```@``9MH,0GW&9P8[?``@__XZ`@P#) XM`&AF!@C$``=@%@P#`&QF!@C$``9@"@P#`$QF!@C$``@6&BM*``QP`!`#8``!P XME&```Q8(!``'9PI8CB!N__PPAV`:"`0`!F<,,$=8CB)N__PBB&`(6(X@;O_\? XM,(=T`&```:Q8CB1N__PO"DZZ`ZHT``Q%?<983V<&M$5O`C0%8``!C%2.%B[_J XM_T'M_?PD2!"#=`%@``%X=`A@$`!$`$AV>'008`8(Q``$=`H,`P!89@A!^@*:] XM(`A@!D'Z`J,@""M`_?@(!``&9PA8CBPN__Q@&@@$``1G"E2.,&[__BP(8`I4< XMCG``,"[__BP`"`0`!&<*2H9L!D2&",0`!4'M__PD2`Q%?<9F`GH!2H9F!$I%X XM9R`P0B(((`9.N@*8(&W]^!4P```P0B(((`9.N@*2+`!FX$'M__R1RC0("`0`. XM`V=L#`,`;V842D)G"@P2`#!G"+1%;00Z`E)%8%(,`P!X9P8,`P!89D9*0F="S XM#!(`,&<\M$5L$$'M_?ZQRF0(%3P`,%)"8.P(!```9AH,;0`P__YF$C`"5$"PW XM;?_\;`@Z+?_\545@S!4#%3P`,%1"M$5L$$'M_?RQRF0(%3P`,%)"8.Q@3`1`' XM`"5G`/["!$``,V<`_M($0``+9P#^K%-`9P#^R%M`9P#^PEM`9P#^2E-`9P#^> XMJ%-`9P#^IE=`9P#^:%5`9P#^J%=`9P#^FF``_B0(!``$9R@(!``%9P85/``M_ XM8!H(!``!9P85/``K8`X(!``"9P85/``@8`)30E)"WD((!```9@``B@QM`##_9 XM_F9`"`0`!&C`Q,C,T-38W.#E!, XM0D-$148`,#$R,S0U-CR!!"1(+PI.N@&P[ XM6$_5_````!9![(*\MH`"&,:/SP``2`2D*H`Z XM!"\`$"H`#DB`/P!.N@/D4$\DJ@`((&H`$-'2)4@`!`Q$__]F!'8`8`(6!"`2P XMD*H`""H`,`("0`"@9TH,1/__9R(@4E*2$(,@2M'\````##`0",``#C"`-`!!O XM^O\.*4B"]%*%#$3__V<,#`,`"F<&NJH`$&4$>/]@#"52``1P`!`#8`#_5`@"' XM``YG,$J%9QPO!2\J``@0*@`.2(`_`$ZZ!!)(P+"%3^\`"F9<($K1_`````PPS XM$`)`O_\P@`Q$__]F$B2J``@E:@`(``1P`!`#8`#_!D'Z_I0I2(+T($K1_```* XM``PP$`C```XP@"2J``@@:@`0T=(E2``$(%)2DA"#<``0`V``_M(@2M'\````I XM##`0",```C"`)6H`"``$)*H`"'#_8`#^LDY5__9(YS@@)&T`"'0`(`IG!DIJM XM``QF"G#_3-\$'$Y=3G4(*@`!``QF"B\*3KH`HH1`6$\0*@`.2(`_`$ZZ!B*$D XM0`@J````#51/9PHO*@`(3KH!0EA/2FH`%&=22'H`;DAM__=.N@'\."H`%'8`S XM4$\P!$A`0D!(0(#\``I(0`9``#!R!Y)#0>W_]Q&`$`!(1$)$2$2(_``*4D,,) XM0P`%;=!"+?__2&W_]TZZ`JQ83T*20JH`!$*J``A":@`,2D)G!G#_8`#_5G``W XM8`#_4%1-4`!(YP`@)&\`""`*9D)![($$)$A*:@`,9R0P*@`,`D`""&8:/SS_Q XM_R\*3KK];@Q`__]<3V8(R"UDI"] XM;0JT;(*\;`1*DF8..7P``X,`(A(LY XM;(+.3J[_ODS?0`PF``R`_____V882.<``BQL@LY.KO]\3-]``#E`@P!P_V"Z8 XM2.R"UDI";0JT;(*\;`1*DF8..7P``X,`9@@@`DS?``1.=4ZZ``9P`&#R2.``$""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS*E]*K(+@9D!*K(+L9SA(G XMYP`",&R"ZB`((FR"["QL@L9.KO\N3-]``$CG``(P+(+H4D!(P.6`(FR"Y"QL+ XM@L9.KO\N3-]``&`D2.<``BQL@L9.KO]\3-]``$CG``(B;(+@+&R"QDZN_H9,@ XMWT``2.<``B)L@LXL;(+&3J[^8DS?0``@`RYL@M).=4S?``Q.=4CG("`T+P`,! XM,`+!_``&)$#5[(+62D)M"K1L@KQL!$J29@XY?``#@P!P_TS?!`1.=0@J``<`L XM!&822.<``B(2+&R"SDZN_]Q,WT``0I)P`&#:```#[`````$````!```#B@``' XM``````/R```#Z@```+$`("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@C XM(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!" XM`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("N XM`@("0$!`0"``````````````````````````````````````````````````F XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM```````````````````"`````````0``````````````````!``!``````$`) XM``````````````````0``@`````!````````````````````````````````' XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````4````````4 X2``````/R```#ZP````$```/R9 X`` Xend Xsize 6588 END_OF_FILE if test 9262 -ne `wc -c <'binaries/pasteclip.uu'`; then echo shar: \"'binaries/pasteclip.uu'\" unpacked with wrong size! fi # end of 'binaries/pasteclip.uu' fi if test -f 'sources/handleiff.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sources/handleiff.c'\" else echo shar: Extracting \"'sources/handleiff.c'\" \(11025 characters\) sed "s/^X//" >'sources/handleiff.c' <<'END_OF_FILE' X/* X** X** X** X** X** X*/ X#include "handleiff.h" X#include "undefs.h" X#include "iffparse.pra" X#include X X/*#####################*\ X * Internal functions. * X\*#####################*/ X/****************************\ X * Name: SeekStream * X * Function: Move forward * X * or backward in the file * X * or in the clipboard * X * relative where we are. * X\****************************/ Xlong XSeekStream(struct IFF *iff, long delta) X{ X long error; X X geta4(); X TraceCall; X if (iff->iff_Type==IOREQUEST) { X IOReq(iff)->io_Offset += delta; X error = SUCCESS; X } else { X if ((error = Seek(File(iff), delta, (long)OFFSET_CURRENT))>0) X error = SUCCESS; X } X return error; X} X X/*******************************\ X * Name: WriteStream * X * Function: Write data to the * X * stream (a file or the clip- * X * board). * X\*******************************/ Xlong XWriteStream( X struct IFF *iff, X UBYTE *data, X long length) X{ X long error; X X geta4(); X TraceCall; X if (iff->iff_Type==IOREQUEST) { X IOReq(iff)->io_Command = CMD_WRITE; X IOReq(iff)->io_Data = (UBYTE *)data; X IOReq(iff)->io_Length = (long)length; X DoClipIO(IOReq(iff)); X error = (long)-IOReq(iff)->io_Error; X } else { X error = Write(File(iff), (char *)data, length); X } X if (error>0) X error = 0L; X return error; X} X X/********************************\ X * Name: ReadStream * X * Function: Read data from the * X * device (a file or the clip- * X * board). * X\********************************/ Xlong XReadStream(struct IFF *iff, UBYTE *data, long length) X{ X long error; X X geta4(); X TraceCall; X if (iff->iff_Type==IOREQUEST) { X IOReq(iff)->io_Command = CMD_READ; X IOReq(iff)->io_Data = (UBYTE *)data; X IOReq(iff)->io_Length = (long)length; X DoClipIO(IOReq(iff)); X if (IOReq(iff)->io_Error==0) X error = IOReq(iff)->io_Actual; X else X error = (long)-IOReq(iff)->io_Error; X } else { X error = Read(File(iff), (char *)data, length); X } X return error; X} X X/********************************\ X * Name: AlignStream * X * Function: Align the read * X * data so that it will be an * X * even number of bytes. * X\********************************/ Xlong XAlignStream(struct IFF *iff) X{ X long error; X X geta4(); X TraceCall; X if (iff->iff_Type==IOREQUEST) { X if (IOReq(iff)->io_Offset%2) X IOReq(iff)->io_Offset++; X error = 0L; X } else { X if (Seek(File(iff), 0L, (long)OFFSET_CURRENT)%2) X error = Seek(File(iff), 1L, (long)OFFSET_CURRENT); X } X if (error>0L) X error = 0L; X return error; X} X X X/*############################*\ X * Public iffparse functions. * X\*############################*/ X/********************\ X * Initializations. * X\********************/ Xlong XInitIFFasClip(struct IFF *iff) X{ X geta4(); X TraceCall; X iff->iff_Type = IOREQUEST; X return SUCCESS; X} X Xlong XInitIFFasDOS(struct IFF *iff) X{ X geta4(); X TraceCall; X iff->iff_Type = FILEHANDLE; X return SUCCESS; X} X Xlong XOpenIFF(struct IFF *iff, long rwmode) X{ X geta4(); X TraceCall; X IFFptr = 0; X IFFStack[0].Size = 0; X iff->iff_Flags = rwmode; X if (iff->iff_Type==IOREQUEST) { X if (rwmode==IFFF_READ) X IOReq(iff)->io_Command = CMD_READ; X else X IOReq(iff)->io_Command = CMD_WRITE; X IOReq(iff)->io_Offset = 0; X IOReq(iff)->io_ClipID = 0; X } X return SUCCESS; X} X Xvoid XCloseIFF(struct IFF *iff) X{ X geta4(); X TraceCall; X if (iff->iff_Type==IOREQUEST) { X if ((iff->iff_Flags&IFFF_RWBITS)==IFFF_WRITE) { /* Make the clip public. */ X IOReq(iff)->io_Command = CMD_UPDATE; X DoClipIO(IOReq(iff)); X } else { /* Flush the stuff that is not used. */ X long dummy; X while (IOReq(iff)->io_Actual && !IOReq(iff)->io_Error) { X IOReq(iff)->io_Data = (STRPTR)&dummy; X IOReq(iff)->io_Length = 4; X DoClipIO(IOReq(iff)); X } X } X } X} X Xstruct IFF * XAllocIFF(void) X{ X struct IFF *iff; X X geta4(); X TraceCall; X iff = NULL; X if ((iff = AllocMem((long)sizeof(struct IFF), MEMF_PUBLIC|MEMF_CLEAR))==NULL) X return NULL; X X if ((iff->iff_Stack = AllocMem((long)sizeof(long)*256L, 0L))==NULL) { X FreeMem((APTR)iff, (long)sizeof(struct IFF)); X iff = NULL; X } X return iff; X} X Xvoid XFreeIFF(struct IFF *iff) X{ X geta4(); X TraceCall; X if (iff) { X if (iff->iff_Stack) X FreeMem((APTR)iff->iff_Stack, (long)sizeof(long)*256L); X FreeMem((APTR)iff, (long)sizeof(struct IFF)); X } X} X Xstruct CBHandle * XOpenClipboard(long unit) X{ X struct Library *IFFParseBase; X struct CBHandle *ch = NULL; X X geta4(); X TraceCall; X if ((ch = AllocMem((long)sizeof(struct CBHandle), MEMF_CLEAR))==NULL) X goto fail; X if ((ch->cbh_CBport = CreatePort(0L, 0L))==NULL) X goto fail; X if ((ch->cbh_SatisfyPort = CreatePort(0L, 0L))==NULL) X goto fail; X if ((ch->cbh_Req = (struct IOClipReq *)CreateExtIO(ch->cbh_CBport, X (long)sizeof(struct IOClipReq)))==NULL) X goto fail; X if (OpenDevice("clipboard.device", unit, (struct IORequest *)ch->cbh_Req, 0L)) { X DeleteExtIO((struct IORequest *)ch->cbh_Req); X ch->cbh_Req = NULL; X goto fail; X } X X return ch; X Xfail: X CloseClipboard(ch); X return NULL; X} X Xvoid XCloseClipboard(struct CBHandle *ch) X{ X geta4(); X TraceCall; X if (ch->cbh_Req) { X CloseDevice((struct IORequest *)ch->cbh_Req); X DeleteExtIO((struct IORequest *)ch->cbh_Req); X ch->cbh_Req = NULL; X } X if (ch->cbh_CBport) X DeletePort((struct MsgPort *)ch->cbh_CBport); X if (ch->cbh_SatisfyPort) X DeletePort((struct MsgPort *)ch->cbh_SatisfyPort); X if (ch) X FreeMem((APTR)ch, (long)sizeof(struct CBHandle)); X} X X/*************************\ X * Miscelous functions . * X\*************************/ Xlong XNOOP() X{ X geta4(); X TraceCall; X return FAILED; X} X Xvoid * XNULL_NOOP() X{ X geta4(); X TraceCall; X return NULL; X} X XUBYTE * XIDtoStr(long ID, UBYTE *buf) X{ X geta4(); X TraceCall; X *((long *)buf) = ID; X buf[4] = '\0'; X return buf; X} X X#define ValidChar(l) (isalpha(l) || ((l)==' ')) X Xlong XGoodID(long ID) X{ X char *str = (char *)&ID; X X geta4(); X TraceCall; X return (long)(ValidChar(str[0]) X && ValidChar(str[1]) X && ValidChar(str[2]) X && ValidChar(str[3])); X} X Xlong XGoodType(long ID) X{ X char *str = (char *)&ID; X X geta4(); X TraceCall; X return (long)(ValidChar(str[0]) X && ValidChar(str[1]) X && ValidChar(str[2]) X && ValidChar(str[3])); X} X X/************************\ X * The 'big' functions. * X\************************/ Xlong XWriteChunkBytes( X struct IFF *iff, X APTR data, X long size) X{ X long datasize = size; /* Due to Manx bug! */ X X geta4(); X TraceCall; X if (WriteStream(iff, (UBYTE *)data, datasize)) X return IFFERR_READ; X IFFStack[IFFptr].Size += datasize; X return 0L; X} X Xlong XReadChunkBytes( X struct IFF *iff, X APTR data, X size_t size) X{ X long error; X long datasize = size; /* Due to Manx bug! */ X X geta4(); X TraceCall; X if (data==NULL) { X return IFFERR_SYNTAX; X } else { X if ((datasize==0) || (datasize>IFFStack[IFFptr].Size)) X datasize = IFFStack[IFFptr].Size; X } X if ((error=ReadStream(iff, (UBYTE *)data, datasize))<=0) X if (error==0) X return IFFERR_EOF; X else X return IFFERR_READ; X IFFStack[IFFptr].Size -= datasize; X if ((IFFStack[IFFptr].Size==0) && AlignStream(iff)) X return IFFERR_NOTIFF; X return datasize; X} X Xlong XPushChunk( X struct IFF *iff, X long type, X long id, X long size) X{ X long t_type = type; X X geta4(); X TraceCall; X if (WriteStream(iff, (UBYTE *)&id, 8L)) X return IFFERR_WRITE; X if (t_type!=0L) { X if (WriteStream(iff, (UBYTE *)&t_type, 4L)) X return IFFERR_WRITE; X IFFStack[++IFFptr].Size=4; X } else { X IFFStack[++IFFptr].Size=0; X } X return 0L; X} X Xlong XPopChunk(struct IFF *iff) X{ X long offset; X long size; X X geta4(); X TraceCall; X offset = IFFStack[IFFptr].Size; X if (SeekStream(iff, -offset-4L)) X return IFFERR_SEEK; X size = IFFStack[IFFptr].Size; X if (WriteStream(iff, (UBYTE *)&size, 4L)) X return IFFERR_READ; X if (IFFptr) X IFFStack[--IFFptr].Size+=IFFStack[IFFptr+1].Size+8L; X if (SeekStream(iff, offset)) X return IFFERR_SEEK; X if (IFFStack[IFFptr+1].Size%2) { X if (WriteStream(iff, (UBYTE *)"", 1L)) X return IFFERR_READ; X IFFStack[IFFptr].Size++; X } X return 0L; X} X Xlong XParseIFF(struct IFF *iff, long control) X{ X struct IFFParseBase *IFFParseBase; X long error; X long type = 0L; X long id; X long size; X X geta4(); X TraceCall; X if (control==IFFPARSE_RAWSTEP) { X if (IFFptr && IFFStack[IFFptr].Size==0) { X IFFptr--; X iff->current.cn_ID = 0L; X return IFFERR_EOC; X } else if (IFFptr && IFFStack[IFFptr].Complex==0) { X iff->current.cn_ID = 0L; X if (SeekStream(iff, (long)(IFFStack[IFFptr].Size+((IFFStack[IFFptr].Size)&1)))) X return IFFERR_SEEK; X IFFptr--; X return IFFERR_EOC; X } X X if ((error=ReadStream(iff, (UBYTE *)&id, 4L))<=0) X if (error==0) X return IFFERR_EOF; X else X return IFFERR_READ; X X if (!GoodID(id)) X return IFFERR_NOTIFF; X X if ((error=ReadStream(iff, (UBYTE *)&size, 4L))<=0) X if (error==0) X return IFFERR_EOF; X else X return IFFERR_READ; X X if ((id==ID_FORM X || id==ID_PROP X || id==ID_CAT X || id==ID_LIST) X && ReadStream(iff, (UBYTE *)&type, 4L)<=0) X return IFFERR_READ; X X X if (type!=0L) { X IFFStack[IFFptr].Size -= size + (size%2) + 8L; X IFFStack[++IFFptr].Size = size - 4L; X IFFStack[IFFptr].Complex = 1; X iff->current.cn_Type = type; X } else { X IFFStack[IFFptr].Size -= size + (size%2) + 8L; X IFFStack[++IFFptr].Size = size; X IFFStack[IFFptr].Complex = 0; X } X iff->current.cn_ID = id; X iff->current.cn_Size = size; X iff->current.cn_Scan = ((type!=0) ? 4 : 0); X return SUCCESS; X } else X return FAILED; X} X Xstruct ContextNode* XCurrentChunk(struct IFF *iff) X{ X geta4(); X TraceCall; X return &iff->current; X} END_OF_FILE if test 11025 -ne `wc -c <'sources/handleiff.c'`; then echo shar: \"'sources/handleiff.c'\" unpacked with wrong size! fi # end of 'sources/handleiff.c' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to . Mail comments to the moderator at . Post requests for sources, and general discussion to comp.sys.amiga.misc.