[comp.sources.amiga] v91i063: SmallIFFParse.library - Small IFF Parser library, Part02/02

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/14/91)

Submitted-by: Michael Jansson <mij@IDA.LiU.SE>
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 <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 2)."
# Contents:  binaries/pasteclip.uu sources/handleiff.c
# Wrapped by tadguy@ab20 on Wed Mar 13 20:46:16 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'binaries/pasteclip.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'binaries/pasteclip.uu'\"
else
echo shar: Extracting \"'binaries/pasteclip.uu'\" \(9262 characters\)
sed "s/^X//" >'binaries/pasteclip.uu' <<'END_OF_FILE'
Xbegin 666 pasteclip
XM```#\P`````````#``````````(```6H````QP````$```/I```%J$[Z`Q!.R
XM5?_X2.<X,)?+E<IP`$/Z`98L;(+&3J[]V"E`@LIF#DAZ`95.N@;J6$]@``$R,
XM+&R"RDZN_^(D0$J`9@Y(>@&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`<!(#____^9P#_5E.`9P#_5%.`9P#_4F#:8`#_,B`*9R(@2BQL@LI.U
XMKO_02I)G"B!2+&R"RDZN_P0@2BQL@LI.KO_*2JR"RF<,(FR"RBQL@L9.KOYB]
XM0F=.NA+V5$],WPP<3EU.=6EF9G!A<G-E+FQI8G)A<GD`17)R;W(@:6X@4&%S5
XM=&5#;&EP.B!#;W5L9"!N;W0@;W!E;B!I9F9P87)S92YL:6)R87)Y(0!%<G)O!
XM<B!I;B!087-T94-L:7`Z($]U="!O9B!M96UO<GDA`$5R<F]R(&EN(%!A<W1E-
XM0VQI<#H@0V]U;&0@;F]T(&]P96X@=&AE(&-L:7!B;V%R9"$`17)R;W(@:6X@/
XM4&%S=&5#;&EP.B!#;W5L9"!N;W0@;W!E;B!P<FEM87)Y(&-L:7`@:6X@8VQI4
XM<&)O87)D(0!%<G)O<B!I;B!087-T94-L:7`Z($]U="!O9B!M96UO<GDA`$5R7
XM<F]R(&EN(%!A<W1E0VQI<#H@1F%I;&5D('1O(')E860@=&AE(&-L:7!B;V%R:
XM9"`H17)R;W(@0V]D93H@)6QD*2$*``!(YR`@0>\`$"1(+PHO+P`02&R!&DZZ-
XM!;`T`#`"3^\`#$S?!`1.=2I/87)#[(+&1>R"QK7)9@XR/``5:PAT`"+"4<G_P
XM_"E/@M(L>``$*4Z"QDCG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`BD
XM3J[^:"E`@LYF#"X\``.`!TZN_Y1@!BI/3KH`&E!/3G5D;W,N;&EB<F%R>0!)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&<Z+R\`#"\O``PO"DZZ`0HY?``!@MX@X
XM;(+66(@P$`C```\P@"!L@M;1_`````HP$`C```\P@$_O``Q@:DCG``(@2M'\I
XM````7"QL@L9.KOZ`3-]``$CG``(@2M'\````7"QL@L9.KOZ,3-]``"E`@N`@A
XM;(+@2J@`)&<F2.<``B!L@N`@:``D(A`L;(+.3J[_@DS?0``O+(+@+PI.N@+$"
XM4$\I;(+@@N1(YP`"+&R"SDZN_\I,WT``(&R"UB"`2.<``BQL@LY.KO_$3-]`,
XM`"!L@M8A0``&9R1(YR`")#P```/M0?H`-"((+&R"SDZN_^),WT`$(&R"UB%`)
XM``PO+(+D/RR"Z$ZZ^MI<3S\`3KH/8E1/3-\$`$YU*@!(YS@R)B\`'"@O`"`F'
XM;P`D($-*J`"L9Q0@0R`H`*SE@"Q`("X`$.6`)$!@!"1L@KX0$DB`2,#0A%2`L
XM.4""ZDCG``)R`#!L@NH@""QL@L9.KO\Z3-]``"E`@NQF!DS?3!Q.=1`22(`TO
XM`#!"+P@@2E*(+P@O+(+L3KH"S$AZ`30P0M'L@NPO"$ZZ#(PO!"\++RR"[$ZZL
XM`1X@;(+L0C`@`#E\``&"Z#!")$C5[(+L4HHF2D_O`"`0$DB`-``,0``@9Q@,7
XM0@`)9Q(,0@`,9PP,0@`-9P8,0@`*9@12BF#8#!(`(&UF#!(`(F8F4HH0&DB`:
XM-`!G&A;"#$(`(F80#!(`(F8$4HI@!D(K__]@`F#>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@=4U<!2BEA/4D*T;(+H;=XP`DC`5
XMY8`@;(+D0K`(`&``_JX@`$SO`P``!"`((B\`#$H89OQ3B!#95\G__`2!``$`M
XM`&KR0B!.=4CG(#`F;P`00>R!&B1(8"H@4K'J``1D#"!24I(0@G``$`)@#G``L
XM$`(_`"\*3KH'%EQ/#$#__V<V4HL4$V;2(%*QZ@`$9`X@4E*2$+P`"G``<`I@V
XM##\\``HO"DZZ!NA<3PQ`__]G"'``3-\,!$YU</]@]DCG,#(L;P`82.<``G``\
XM0_H`UBQL@L9.KOW83-]``"E`@O!F!DS?3`Q.=4CG``(@;P`@(&@`)"!H``0L`
XM;(+P3J[_LDS?0``D0$J`9WY(YP`"0_H`H2!J`#8L;(+P3J[_H$S?0``D`&=0#
XM2.<@`B0\```#[2(7+&R"SDZN_^),WT`$)D!*@&<R(`OE@"8`($,M:``(`*0M>
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`!&<Z,`0"0``F9S(@4['K``1D#B!34I,0FG``$"K__V`.<``0&C\``
XM+PM.N@'47$\,0/__9P``PE-M__Q30F`R(%.QZP`$9!`@4U*3$*W__W``$"W_=
XM_V`0<``0+?__/P`O"TZZ`9Q<3PQ`__]G``"*4D<P+?_\4VW__+!";L(Z`C`":
XM4T)*0&<L(%.QZP`$9`X@4U*3$)IP`!`J__]@#G``$!H_`"\+3KH!6%Q/#$#_Y
XM_V=&8,P(!```9SHT!6`J(%.QZP`$9`X@4U*3$+P`('``<"!@##\\`"`O"TZZ:
XM`21<3PQ`__]G$E)',"W__%-M__RP0F[*8`#[=G#_8`#[>C`Q,C,T-38W.#E!,
XM0D-$148`,#$R,S0U-C<X.6%B8V1E9@!(YT@`0H1*@&H$1(!21$J!:@9$@0I$3
XM``%A/DI$9P)$@$S?`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@OS
XM`6$2(`$B'TJ`3G4O`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`D
XM2$`R`H+#,`%"04A!3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-2+
XM0%'*__),WP`,3G4@;P`$(`A*&&;\4TB1P"`(3G5(YP`@0>R!!"1(+PI.N@&P[
XM6$_5_````!9![(*\M<AEZDS?!`!.=4CG/"`D;P`8."\`'"`*9P`!@C0J``QG5
XM``%Z"`(`"68``7((`@`#9@`!:B!*T?P````,,!`"0._],(!*J@`(9AH,1/__P
XM9@AP`$S?!#Q.=2\*3KH"<C0J``Q83P@"``YF,"!2L>H`"&,:/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(</],WP0`3G75_````!9![(*\M<AER'``8.@_//__<
XM+PI.NOU"7$]@VDCG("`D;P`,=$$0*@`.2(`_`$ZZ`3!*0%1/9P)T(25\```$`
XM```02'@$`$ZZ`+PE0``(6$]F&"5\`````0`0($K1_`````\E2``(-#P`@"!*Q
XMT?P````,A5`E:@`(``0DJ@`(3-\$!$YU2.<`,)?+)&R"^&`0($I0B")O``RSB
XMR&<.)DHD4B`*9NQ,WPP`3G4@"V<$)I)@!"E2@OA(YP`"("H`!%"`(DHL;(+&;
XM3J[_+DS?0`!@U$CG`#`D;(+X8!PF4DCG``(@*@`$4(`B2BQL@L9.KO\N3-]`4
XM`"1+(`IFX$*L@OA,WPP`3G5(YR`@)"\`#$J"9@AP`$S?!`1.=4CG``)R`"`"T
XM4(`L;(+&3J[_.DS?0``D0$J`9@1P`&#:0?K_EBE(@OPDK(+X)4(`!"E*@O@@3
XM"E"`8,!,[P,```0@"!#99OQ.=4CG("`T+P`,,`+!_``&)$#5[(+62D)M"K1LE
XM@KQL!$J29@XY?``#@P!P_TS?!`1.=4CG``(P`L'\``8@;(+6(C`(`"QL@LY.X
XMKO\H3-]``$J`9P1P`6`"<`!@T$CG,"`T+P`03KH!7#`"P?P`!B1`U>R"UDI"]
XM;0JT;(*\;`1*DF8..7P``X,`</],WP0,3G5(YS`",&\`(E.()@@D+P`>(A(LY
XM;(+.3J[_ODS?0`PF``R`_____V882.<``BQL@LY.KO]\3-]``#E`@P!P_V"Z8
XM2.<P`G8`=``B$BQL@LY.KO^^3-]`#&"B2.<``B(O``@L;(+.3J[_N$S?0`!*S
XM@&882.<``BQL@LY.KO]\3-]``#E`@P!P_TYU<`!@^DCG,"`T+P`03KH`G#`"Y
XMP?P`!B1`U>R"UDI";0JT;(*\;`1*DF8..7P``X,`</],WP0,3G4P*@`$`D``I
XM`V8*.7P`!H,`</]@Y@@J``,`!&<62.<P`G8!=``B$BQL@LY.KO^^3-]`#$CGC
XM,`(F+P`B)"\`'B(2+&R"SDZN_]!,WT`,)@`,@/____]F&$CG``(L;(+.3J[_X
XM?$S?0``Y0(,`</]@C"`#8(A(YR``2.<``B(\```0`'``+&R"QDZN_LY,WT``Z
XM)``(```,9Q)*;(+>9@@@`DS?``1.=4ZZ``9P`&#R2.<P`G8$0?H`+B0(+P,OJ
XM`BQL@LY.KO_$(@`D'R8?+&R"SDZN_]!,WT`,/SP``4ZZ``I43TYU7D,*`$JL2
XM@P)G%"!L@P(@:``$3I`@;(,"*5"#`F#F2JR"]&<&(&R"]$Z0/R\`!$ZZ``94=
XM3TYU2.<P`#!O``PF"$JL@M9G,'0`8`H_`DZZ`7)43U)"M&R"O&WP2.<``C`L(
XM@KS!_``&(FR"UBQL@L9.KO\N3-]``$JL@OQG!B!L@OQ.D$JL@L)G%$CG``(BL
XM+(+"+&R"SDZN_Z9,WT``2JR#!F<((&R#!B"L@PI*K(,.9Q1(YP`"(FR##BQLJ
XM@L9.KOYB3-]``$JL@Q)G%$CG``(B;(,2+&R"QDZN_F),WT``2JR#%F<42.<`)
XM`B)L@Q8L;(+&3J[^8DS?0`!*K(,:9Q1(YP`"(FR#&BQL@L9.KOYB3-]``$CG0
XM``8L>``$""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 <ctype.h>
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 <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.