amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/29/91)
Submitted-by: karl@sugar.hackercorp.com (Karl Lehenbauer) Posting-number: Volume 91, Issue 077 Archive-name: audio/fziff/part01 As promised, here is FZIFF, the companion program to CASIO. After you use CASIO to download a 16-bit sample from your Casio FZ-1, you can use FZIFF to convert it to an IFF 8SVX sample file. There are some gotchas, see the README file for details. #!/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 1 (of 1)." # Contents: 8svx.h Makefile README cleanup.c fziff.c fziff.uu iff.c # iff.h libraries.c prototypes.h # Wrapped by tadguy@ab20 on Thu Mar 28 11:20:36 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f '8svx.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'8svx.h'\" else echo shar: Extracting \"'8svx.h'\" \(2262 characters\) sed "s/^X//" >'8svx.h' <<'END_OF_FILE' X/* 8svx.h include file for IFF 8-bit sampled voices X * essentially cribbed from EA IFF documentation X * KEL 21-Feb-87 X */ X X#ifndef I8SVX_H X X#define I8SVX_H X X#define ID_8SVX MakeID('8', 'S', 'V', 'X') X#define ID_VHDR MakeID('V', 'H', 'D', 'R') X Xtypedef LONG Fixed; /* A fixed-point value, 16 bits to the left of the X * point and 16 to the right. A Fixed is a number X * of 216ths, i.e. 65536ths. */ X X#define Unity 0x1000L /* Unity = Fixed 1.0 = maximum volume */ X X/* sCompression: Choice of compression algorithm applied to the samples */ X X#define sCmpNone 0 /* not compressed */ X#define sCmpFibDelta 1 /* Fibonacci-delta encoding */ X/* can be more kinds in the future */ X Xtypedef struct { X ULONG oneShotHiSamples, /* # samples in the high octave 1-shot part */ X repeatHiSamples, /* # samples in the high octave repeat part */ X samplesPerHiCycle; /* # samples/cycle in high octave, else 0 */ X UWORD samplesPerSec; /* data sampling rate */ X UBYTE ctOctave, /* # octaves of waveforms */ X sCompression; /* data compression technique used */ X Fixed volume; /* playback volume from 0 to Unity (full X * volume). Map this value into the output X * hardware's dynamic range. */ X } Voice8Header; X X#define ID_NAME MakeID('N', 'A', 'M', 'E') X /* NAME chunk contains a CHAR [], the voice's name. */ X X#define ID_Copyright MakeID('(','c',')',' ') X /* "(c) " chunk contains a CHAR [], the FORM's copyright notice. */ X X#ifndef ID_AUTH X#define ID_AUTH MakeID('A','U','T','H') X#endif X /* AUTH chunk contains a CHAR [], the author's name. */ X X#define ID_ANNO MakeID('A', 'N', 'N', 'O') X /* ANNO chunk contains a CHAR [], author's text annotations. */ X X#define ID_ATAK MakeID('A', 'T', 'A', 'K') X#define ID_RLSE MakeID('R', 'L', 'S', 'E') X Xtypedef struct { X UWORD duration; /* segment duration in milliseconds, > 0 */ X Fixed dest; /* destination volume factor */ X } EGPoint; X X/* ATAK and RLSE chunks contain an EGPoint[] piecewise-linear envelope. */ X/* The envelope defines a function of time returning Fixed values. It's X * used to scale the nominal volume specified in the Voice8Header. */ X X#define ID_BODY MakeID('B', 'O', 'D', 'Y') X X/* BODY chunk contains a BYTE[], array of audio data samples. */ X X#endif X X/* end of 8svx.h */ END_OF_FILE if test 2262 -ne `wc -c <'8svx.h'`; then echo shar: \"'8svx.h'\" unpacked with wrong size! fi # end of '8svx.h' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(197 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X#CFLAGS= -n +p -DDEBUG +Iincludes.pre X#CFLAGS= +p +Iincludes.pre XCFLAGS= -so X XOFILES= fziff.o iff.o libraries.o X X.c.o: X cc $(CFLAGS) $*.c X Xall: fziff X Xfziff: $(OFILES) X ln -g $(OFILES) -lhack -lc X END_OF_FILE if test 197 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(3216 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X XThis program includes source and executable for the program FZIFF, Xa program for converting 16-bit samples downloaded from a Casio XFZ-1 synthesizer to the IFF 8SVX sample format on the Amiga. X XTo use it, use the CASIO program to download a sample to a file, Xas in "casio train_whistle.fz1", then use FZIFF to convert it, Xas in "fziff train_whistle.fz1 train_whistle.iff" X XAlthough the program does convert the file into a IFF X8SVX file, something is wrong with the result, so you have to Xuse Audiomaster or the equivalent to clean it up. Sorry about this, Xbut I haven't had time to look at it and am not too likely to the Xway things have been going. Source is included if you want to give Xit a try. X XWhen you use audiomaster to edit the sample, there will be some garbage Xright at the beginning (possibly a noncompliant IFF header?), use the Xcut-and-paste function to trim it out. Also, set the playback frequency Xto 18000. X XIf you sampled on the FZ-1 at 36000 samples per second, you can use XAudiomaster at this point to downsample to 18K SPS. (Note that the XAmiga can't play a sample at faster than around 25K SPS.) I have Xfound that sampling at 36000 and downsampling with Audiomaster seems Xto result in the best sound, regrettable because it doubles the transit Xtime from the FZ-1, disk space used on the Amiga during the transfer Xprocess, etc, etc. X XSource code is included, so the advanced experimenter may want to find Xthe bug. If you do so, please send me an update. Also, this program Xconverts 16-bit samples to 8-bit ones. X XThe extremely advanced guru may want to write a sound player that can Xdiddle the 6-bit channel volume in a manner coordinated with the Xplaying of the sounds to derive some sort of near-14-bit companded Xaudio. I would go about it by subdividing the sample into parts the Xsize of which are selected such that between each part you can get out Xto the volume register, extract an RMS volume from the subpart by doing Xthe appropriate calculation, determine a 6-bit volume for the volume Xregister and extract full-scale 8-bit samples for the sample portion. XI was planning to do this but now I pretty much for sure will never get Xaround to it. It's a big, hard job, but if you do it, you'll learn a Xton about audio and about the Amiga. I might be able to help a little, Xbut not much. (If you do it, please send me a copy, or at least drop Xa note) X XThese programs are more like works-in-progress than finished, quality Xthings, but they are usable and, as I'm unlikely to ever finish them Xbeyond what they are now, I thought I'd make them available for those Xwho could use them. I would very much have liked to have gotten them Xfrom somewhere rather than writing them myself, even in their present Xcondition, so I'll save the next guy some time. Perhaps you'll do Xthe same with some cool utility you've written, it's nice to at least Xknow that someone is using it, rather than another great program sitting Xthere rotting on your hard disk, plus its nice to see your name in the XFred Fish lists and the Amazing Computing resource guides. X XShare And Enjoy, X XKarl Lehenbauer X3918 Panorama XMissouri City, TX, USA 77459 X XInternet: karl@hackercorp.com XUsenet: uunet!sugar!karl END_OF_FILE if test 3216 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'cleanup.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'cleanup.c'\" else echo shar: Extracting \"'cleanup.c'\" \(2258 characters\) sed "s/^X//" >'cleanup.c' <<'END_OF_FILE' X/* cleanup - Hackercorp Hackercore, standard cleanup management routines, v1.1 X X This code is released to the public domain, 4/25/88, by Peter da Silva X and Karl Lehenbauer X X Usage: X X add_cleanup(cleanup_routine); X void cleanup_routine(); X X Add a routine to the cleanup list. When cleanup is called, routines X passed as arguments to add_cleanup will be executed in the reverse X order in which they were received. See the source to the IFF CAT X archiver, iffar, for an example of how to use this. X X void cleanup() X X Execute all the routines passed as arguments to add_cleanup X X panic(s) X char *s; X X Abort the program by printing a panic message including string "s" X on stderr, flushing stdout and stderr, calling cleanup and exiting. X X _abort() X By defining _abort to call panic, entering control-C while using X stdio will cause the program to abort, executing your cleanup X routines. Also note that Manx sdb calls _abort when the user X requests an exit, so your cleanup routines will be executed then X as well. X*/ X X#include <exec/memory.h> X#include <stdio.h> X Xstruct _clean X{ X int (*function)(); X struct _clean *next; X} *cleanlist = NULL; X X/* add_cleanup X * given a function, add it to a list of functions to call when cleanup X * is executed X */ Xadd_cleanup(function) Xint (*function)(); X{ X struct _clean *ptr; X X ptr = AllocMem(sizeof(struct _clean), MEMF_PUBLIC); X if(!ptr) X return 0; X ptr->function = function; X ptr->next = cleanlist; X cleanlist = ptr; X} X X/* cleanup X * call all the functions that were passed as arguments to add_cleanup X * this run X */ Xcleanup() X{ X struct _clean *ptr; X int (*f)(); X X while(cleanlist) X { X /* locate the next cleanup function and get the function pointer */ X ptr = cleanlist; X cleanlist = cleanlist->next; X f = ptr->function; X X /* cleanup must clean up after itself */ X FreeMem(ptr, sizeof(struct _clean)); X X /* execute the function */ X (*f)(); X } X} X X/* panic - abort with an error message */ X Xshort panic_in_progress = 0; X Xpanic(s) Xchar *s; X{ X fflush(stdout); X fprintf(stderr,"panic: %s\n",s); X fflush(stderr); X if (!panic_in_progress) X { X cleanup(); X exit(10); X } X fprintf(stderr,"double panic!\n"); X exit(11); X} X X_abort() X{ X panic("^C or other C library abort"); X} END_OF_FILE if test 2258 -ne `wc -c <'cleanup.c'`; then echo shar: \"'cleanup.c'\" unpacked with wrong size! fi # end of 'cleanup.c' fi if test -f 'fziff.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fziff.c'\" else echo shar: Extracting \"'fziff.c'\" \(2223 characters\) sed "s/^X//" >'fziff.c' <<'END_OF_FILE' X/* hilo - print highest and lowest sample values */ X X#include <stdio.h> X#include <fcntl.h> X#include <functions.h> X#include <hackercorp/iff.h> X#include <hackercorp/8svx.h> X X#include "prototypes.h" X XVoice8Header v8head; X Xshort buffer[512]; X Xchar *program_name = "fziff"; X Xlong nsamples; XUBYTE *bodyp; X Xvoid freebody(void) X{ X if (bodyp) X FreeMem(bodyp,nsamples); X} X Xmain(int argc, char *argv[]) X{ X int fzfd, svxfd; X UBYTE *outp; X int i; X X if (argc != 3) X { X fprintf(stderr,"usage: fziff fz1dumpfilename new8svxfilename\n"); X exit(1); X } X X init_libs(); X X /* open the sample file read from the casio fz-1 by karl's fz-1 read stuff */ X if ((fzfd = open(argv[1],O_RDONLY)) == -1) X { X perror(argv[1]); X exit(2); X } X X /* eventually get the real number from the voice parameters */ X nsamples = (lseek(fzfd,0L,2) - 1024) / 2; X X /* initialize the VHDR chunk */ X v8head.oneShotHiSamples = nsamples; X v8head.repeatHiSamples = 0; X v8head.samplesPerHiCycle = 0; X v8head.samplesPerSec = 17987; /* get it out of the header eventually */ X v8head.ctOctave = 0; X v8head.sCompression = 0; X v8head.volume = 65535; X X /* skip the voice parameters for now - this assumes, as the casio dumper X * does, only one voice and no banks */ X if (lseek(fzfd, 1024L,0) == -1) X { X perror(argv[1]); X exit(3); X } X X /* get that IFF file open, we have to cleanup from now on */ X if ((svxfd = CreateIFF(argv[2],ID_FORM,ID_8SVX)) == -1) X panic("unable to create IFF 8SVX file\n"); X X if (!WriteChunk(svxfd,ID_VHDR,&v8head,sizeof(v8head))) X panic("unable to write VHDR chunk"); X X if (!WriteTextChunk(svxfd,ID_NAME,argv[2])) X panic("unable to write NAME chunk"); X X/* X if (!WriteTextChunk(svxfd,ID_Copyright,"Copyright (C) 1989 Hackercorp. All Rights Reserved.")) X panic("unable to write Copyright chunk"); X X if (!WriteTextChunk(svxfd,ID_ANNO,"sampled on a 16-bit synth and converted for the Amiga by Karl Lehenbauer/Hackercorp")); X X*/ X X if ((bodyp = AllocMem(nsamples,0)) == NULL) X panic("unable to alloc sample memory"); X X add_cleanup(freebody); X outp = bodyp; X while (read(fzfd,&buffer[0],1024) == 1024) X { X for (i = 0; i < 512; i++) X *outp++ = buffer[i] & 0xff; X } X WriteChunk(svxfd,ID_BODY,bodyp,nsamples); X X Rewrite_IFF_header(svxfd); X exit(0); X} X END_OF_FILE if test 2223 -ne `wc -c <'fziff.c'`; then echo shar: \"'fziff.c'\" unpacked with wrong size! fi # end of 'fziff.c' fi if test -f 'fziff.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fziff.uu'\" else echo shar: Extracting \"'fziff.uu'\" \(13566 characters\) sed "s/^X//" >'fziff.uu' <<'END_OF_FILE' Xbegin 644 fziff XM```#\P`````````#``````````(```AY```!YP````$```/I```(>4[Z"Y)*! XMK(,F9Q0O#B`L@RHB;(,F+&R#+DZN_RXL7TYU2.<X,"1O`!P,KP````,`&&<88 XM2'H!ODAL@9!.N@BP2'@``4ZZ'VI/[P`,3KH%=$*G+RH`!$ZZ#VHF``R`____9 XM_U!/9A(O*@`$3KH(J$AX``).NA\\4$](>``"0J<O`TZZ'8`$@```!`!R`DZZU XM&QHI0(,J*6R#*H,R0JR#-D*L@SHY?$9#@SY"+(-`0BR#02E\``#__X-"0J=(/ XM>`0`+P-.NAU`#(#_____3^\`&&82+RH`!$ZZ"#Y(>``#3KH>TE!/2'DX4U98H XM2'E&3U)-+RH`"$ZZ`[XH``R`_____T_O``QF"DAZ`1Q.N@4X6$](>``42&R#? XM,DAY5DA$4B\$3KH"8$J`3^\`$&8*2'H!%DZZ!1)83R\J``A(>4Y!344O!$ZZI XM`L)*@$_O``QF"DAZ`0].N@3P6$\O#G(`("R#*BQL@RY.KO\Z+%\I0(,F9@I(X XM>@$(3KH$SEA/2'K^C$ZZ!9`F;(,F6$](>`0`2&R#1B\#3KH0!`R````$`$_OL XM``QF)'0`(`+0@$'L@T8P,`@`2,`"@````/\6P%*"#((```(`;>!@PB\L@RHO# XM+(,F2'E"3T19+P1.N@&J+P1.N@)20J=.NAW.3^\`&$S?#!Q.=69Z:69F`'5S^ XM86=E.B!F>FEF9B!F>C%D=6UP9FEL96YA;64@;F5W.'-V>&9I;&5N86UE"@!U' XM;F%B;&4@=&\@8W)E871E($E&1B`X4U98(&9I;&4*`'5N86)L92!T;R!W<FET1 XM92!62$12(&-H=6YK`'5N86)L92!T;R!W<FET92!.04U%(&-H=6YK`'5N86)L# XM92!T;R!A;&QO8R!S86UP;&4@;65M;W)Y`$CG(``D+P`((`("@````'](@$C`+ XM+P`@`N"``H````!_2(!(P"\`(`)R$.*@`H````!_2(!(P"\`(`)R&.*@`H``' XM``!_2(!(P"\`2'H"+$AL@9!.N@8$3^\`&$S?``1.=4Y5__@K;0`,__@K;0`0J XM__Q(>``(2&W_^"\M``A.NANT#(#_____3^\`#&802'H!\TZZ!>QP`%A/3EU.Q XM=7`!8/A(YR``)"\`""`O`!18@"\`+R\`$"\"8:A*@$_O``QF"'``3-\`!$YU> XM2'@`!$AO`!0O`DZZ&UX,@/____]/[P`,9P1P`6`"<`!@V$CG,``F+P`,)"\`, XM&"\"+R\`%"\#3KK_8$J`3^\`#&8(<`!,WP`,3G5*@F<F+P(O+P`8+P-.NAL2G XM#(#_____3^\`#&8.2'H!8DZZ!4IP`%A/8-`(`@``9RA(>``!2&R`!B\#3KH:Q XMY`R`_____T_O``QF#DAZ`31.N@4<<`!83V"B<`%@GDCG("`D;P`4+PI.NA2.+ XM)``O`B\*+R\`'"\O`!Q.NO]>3^\`%$S?!`1.=4CG,``D+P`,2'@``D*G+P).7 XMNAG")@`,@/____]/[P`,9A)(>@#A3KH$OG``6$],WP`,3G5"IT*G+P).NAF8_ XM#(#_____3^\`#&8.2'H`N4ZZ!)9P`%A/8-8@`U&`+P!(>4-!5"`O`DZZ_F!*M XM@$_O``QF#DAZ`*1.N@1N<`!83V"N<`%@JDCG("`D;P`,2'@!M"\*3KH*["0`< XM#(#_____4$]F$"\*3KH$0'#_6$],WP0$3G5"IR\O`!@O+P`8+P).NOY(2H!/; XM[P`09A)(>@!Q2&R!D$ZZ`^QP_U!/8-`@`F#,)6,E8R5C)6,`5W)I=&5#:'5NK XM:TAE861E<@!7<FET94-H=6YK`')E=W)I=&5?249&7VAE861E<@!R97=R:71EX XM7TE&1E]H96%D97(Z(%=R:71E0VAU;FM(96%D97(`8W)E871E7V%R8VAI=F4Z2 XM(&-O=6QD;B=T('=R:71E($-!5"!C:'5N:VAE861E<B!O9B!N97<@87)C:&EVA XM90H`2JR`"&<0+PXB;(`(+&R#+DZN_F(L7TYU2'K_YDZZ`48O#G``0_H`("QL" XM@RY.KOW8+%\I0(`(6$]F"DAZ`!Q.N@!86$].=6EN='5I=&EO;BYL:6)R87)Y# XM`$-A;B=T(&]P96X@:6YT=6ET:6]N+FQI8G)A<GD``$AX``E(>@"62'@``DZZ0 XM&)I.N@$42'@`"DZZ&79/[P`03G5.5?^<2.<@('0`2FR`#&<62'H`M$AZ`+!(1 XM>@!J3KH!F'0!3^\`##E\``&`#$'M``PD2"\*+RT`"$AM_YQ.N@SP2'H`A$AZE XM`(!(;?^<3KH!:$I"3^\`&&803KH`JDAX``I.NAD,6$]@"DAX`!1.NAD`6$],[ XMWP0$3EU.=5Y#(&%B;W)T"@!$;W5B;&4@<&%N:6,@9&5T96-T960A("!3>7-TT XM96T@;6%Y(&)E('5N<F5L:6%B;&4@=6YL97-S(')E8F]O=&5D(0!004Y)0P!(E XMYP`@+PYR`7`(+&R#+DZN_SHL7R1`2H!F"DAZ`%!.NO\46$\DKP`()6R`#@`$H XM*4J`#DS?!`!.=4CG`#!*K(`.9R0D;(`.(&R`#BEH``2`#B92+PYP"")*+&R#P XM+DZN_RXL7TZ38-9,WPP`3G55;F%B;&4@=&\@86QL;V-A=&4@;65M;W)Y(&9O@ XM<B!A(&-L96%N=7`@9G5N8W1I;VX``$CG("`D;P`,)"\`%$(2%7P``0`!%7P`N XM`0`"2H)G!'`&8`)P`35```1*@F<$<`-@`G``-4``!D*J``A"J@`0)6\`$``,3 XM(`I,WP0$3G5.5?],2.<@("1M``A(>@#:2&W_8$ZZ%80O+(`"2&W_8$ZZ"Q)(% XM>``!2&W_8$AM_^QA@EAM__)8;?_P+RW_^$ZZ$&8D`$AX``$O"DAM_]A.NO]D@ XM+PI.NA!0L()/[P`P;PHO"DZZ$$(D`%A/0>W_V"M(__P&;0`2_]Y8;?_<2'@`- XM`2\M``Q(;?_$3KK_*DAX``$O+0`02&W_L$ZZ_QI([4P,_TQV0B`M_TPB`.>(] XMT($&@````"@D`'(`<`!![?^P)DA![?_$)$A![?_L(DB1R"QL@`A.KOZD3.U,, XM#/],3^\`&$S?!`1.74YU365S<V%G92!F<F]M(`!(YR`@0>\`%"1(+PHO+P`41 XM+R\`%$ZZ"K8D`"`"3^\`#$S?!`1.=4CG`"`D;P`((`IG'DH29QI(;(&0+PI." XMN@"62&R!D$AZ`$A.N@"*3^\`$"\LAT9.N@(6)$!*@%A/9RA*$F<D2&R!D"\LR XMAT9.N@'^6$\O`$ZZ`%Y(;(&02'@`"DZZ`!!/[P`03-\$`$YU.B```$CG("`DD XM+P`,)&\`$"`*9P9*:@`,9@AP_TS?!`1.=2!2L>H`!&0,(%)2DA""<``0`F#FY XM<``0`B\`+PI.N@\:4$]@UDCG(#`F;P`0)&\`%&`T(%*QZ@`$9`P@4E*2$()PH XM`!`"8`YP`!`"+P`O"DZZ#NA03PR`_____V8(</],WPP$3G52BQ039LAP`&#P< XM`$YO('-U8V@@9FEL92!O<B!D:7)E8W1O<GD`07)G(&QI<W0@=&]O(&QO;F<`^ XM0F%D(&9I;&4@9&5S8W)I<'1O<@!.;W0@96YO=6=H(&UE;6]R>0!&:6QE(&5XS XM:7-T<P!);G9A;&ED(&%R9W5M96YT`$9I;&4@=&%B;&4@;W9E<F9L;W<`5&]O[ XM(&UA;GD@;W!E;B!F:6QE<P!.;W0@82!C;VYS;VQE`%!E<FUI<W-I;VX@9&5N? XM:65D`$DO3R!E<G)O<@!.;R!S<&%C92!L969T(&]N(&1E=FEC90!297-U;'0@C XM=&]O(&QA<F=E`$%R9W5M96YT(&]U="!O9B!D;VUA:6X`17AE8R!F;W)M870@3 XM97)R;W(`4F5A9"UO;FQY(&9I;&4@<WES=&5M`$-R;W-S+61E=FEC92!R96YA' XM;64`3F]T:&EN9R!T;R!R96%D`$CG(``D+P`(2H)M&@R"````$FX2(`+E@$'LY XM@!(@,`@`3-\`!$YU0?H`!B`(8/)5;FMN;W=N(&5R<F]R`"I/87)#[(,F1>R#I XM)K7)9@XR/`$=:PAT`"+"4<G__"E/ATHL>``$*4Z#+DCG@(`(+@`$`2EG$$OZL XM``A.KO_B8`9"I_-?3G-#^@`B3J[^:"E`ATYF#"X\``.`!TZN_Y1@!BI/3KH`B XM&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4CG`"!(YP`"(CP``0``,"R#','\^ XM``8L;(,N3J[_.DS?0``I0(=29AY(YP$&F\TN/``!```L;(,N3J[_E$S?8(`N/ XM;(=*3G4@;(=20F@`!"!LAU(Q?``!`!`@;(=2,7P``0`*(&R'2B`LATJ0J``$) XM4(`I0(=6(&R'5B"\34%.6$CG``*3R2QL@RY.KO[:3-]``"1`2JH`K&<\+R\`I XM#"\O``PO"DZZ`0PI?`````&'6B!LAU)8B#`0`$"``#"`(&R'4M'\````"C`0\ XM`$"``#"`3^\`#&!J2.<``B!*T?P```!<+&R#+DZN_H!,WT``2.<``B!*T?P`> XM``!<+&R#+DZN_HQ,WT``*4"'7B!LAUY*J``D9R9(YP`"(&R'7B!H`"0B$"QL0 XMATY.KO^"3-]``"\LAUXO"DZZ!.A03RELAUZ'8DCG``(L;(=.3J[_RDS?0``@: XM;(=2((!(YP`"+&R'3DZN_\1,WT``(&R'4B%```9G)$CG(`(D/````^U!^@`T4 XM(@@L;(=.3J[_XDS?0`0@;(=2(4``#"\LAV(O+(=F3KKR<E!/+P!.NA'X6$],_ XMWP0`3G4J`$CG.#(F+P`<*"\`("9O`"0@0TJH`*QG%"!#("@`K.6`+$`@+@`0, XMY8`D0&`$)&R#'A`22(!(P-"$5(`I0(=J2.<``G(`("R':BQL@RY.KO\Z3-]`; XM`"E`AVYF!DS?3!Q.=1`22(!(P"0`+P(@2E*(+P@O+(=N3KH%!DAZ`4H@0M'LQ XMAVXO"$ZZ#T@O!"\++RR';DZZ`30@;(=N0C`H`"E\`````8=F)$+5[(=N4HHF1 XM2D_O`"`0$DB`2,`D``R`````(&<@#((````)9Q@,@@````QG$`R"````#6<(B XM#((````*9@12BF#,#!(`(&UV#!(`(F8J4HH0&DB`2,`D`&<<%L(,@@```")FF XM$`P2`")F!%**8`9"*___8`)@VF`X$!I(@$C`)`!G+`R"````(&<D#((````)< XM9QP,@@````QG%`R"````#6<,#((````*9P06PF#*0AM*@F8"4XI2K(=F8`#_C XM4D(32.<``G(`("R'9N6`6(`L;(,N3J[_.DS?0``I0(=B9@A"K(=F8`#^T'0`F XM)&R';F`:(`+E@"!LAV(AB@@`+PI.N@DVU<!2BEA/4H*TK(=F;>`@`N6`(&R'. XM8D*P"`!@`/Z8(`!,[P,```0@""(O``Q*&&;\4X@0V5?)__P$@0`!``!J\D(@@ XM3G4O+P`(2'@#`2\O``QA!D_O``Q.=4CG/C(L;P`D*"\`*$ZZ#Z8F;(=2=`!@D XM$'(&(`).NA'@2K,(`&<04H(P;(,<L<)NZ'8(8``!3@@$``EG7DCG(`)T_R(O3 XM``0L;(=.3J[_K$S?0`0J`&=$2.<``B(%+&R'3DZN_Z9,WT``2.<``B(7+&R'V XM3DZN_[A,WT``2H!F'$CG``(L;(=.3J[_?$S?0``F``R`````S68``.I(YR`"8 XM)#P```/M(B\`!"QLATY.KO_B3-]`!"1`(`IF``"D"`0`"&8&=@%@``"\2.<@8 XM`B0\```#[B(O``0L;(=.3J[_XDS?0`0D0$J`9A9(YP`"+&R'3DZN_WQ,WT``+ XM)@!@``"&2.<``G`A0_H`P"QL@RY.KOW83-]``"P`9Q1(YP`"(D8L;(,N3J[^3 XM8DS?0`!@,$CG,`)V`4'Z`)XD""(*+&R'3DZN_]!,WT`,2.<P`G;_=``B"BQLC XMATY.KO^^3-]`#&`P(`0"@```!0`,@```!0!F($CG``(B"BQLATY.KO_<3-]`C XM`'8%*4.'1G#_3-],?$YU<@8@`DZZ$&HGB@@`<@8@`DZZ$%XWA`@$"`0`"V<69 XM2.<P`G8!=``B"BQLATY.KO^^3-]`#"`"8,)D;W,N;&EB<F%R>0```$CG,"`DE XM+P`03KH-UG(&(`).NA`8)$#5[(=22H)M##!L@QRQPF\$2I)F$"E\`````X=&? XM</],WP0,3G4P*@`$2,`"@`````,,@`````%F#"E\````!H=&</]@VDCG,`(F_ XM+P`D)"\`("(2+&R'3DZN_]9,WT`,)@`,@/____]F&$CG``(L;(=.3J[_?$S?; XM0``I0(=&</]@GB`#8)I(YS`R+&\`&$CG``)P`$/Z`-8L;(,N3J[]V$S?0``IF XM0(=R9@9,WTP,3G5(YP`"(&\`("!H`"0@:``$+&R'<DZN_[),WT``)$!*@&=^_ XM2.<``D/Z`*$@:@`V+&R'<DZN_Z!,WT``)`!G4$CG(`(D/````^TB%RQLATY.6 XMKO_B3-]`!"9`2H!G,B`+Y8`F`"!#+6@`"`"D+4L`G$CG(`(D/````^U!^@!6G XM(@@L;(=.3J[_XDS?0`0M0`"@2.<``B!*+&R'<DZN_Z9,WT``2.<``B)LAW(L, XM;(,N3J[^8DS?0`!"K(=R8`#_0&EC;VXN;&EB<F%R>0!724Y$3U<`*@!,[P,`V XM``0@"$H89OQ32!#99OQ.=4SO`P``!"`((B\`#&`"$-E7R?_\9PP$@0`!``!JI XM\$YU0AA1R?_\!($``0``:O).=4Y5_^I(YR`@)&T`"#M\!`C_]BM*_^HK2O_R7 XM*TK_[@:M``!____N+RT`$"\M``Q(;?_J3KH`%B0`0C(H`"`"3^\`#$S?!`1.] XM74YU3E7]]$CG/S(F;0`(+&T`$'X`)&T`#!829@H@!TS?3/Q.74YU4HH,`P`EC XM9T(D!R!3L>L`!&0,(%-2DQ"#<``0`V`.<``0`R\`+PM.N@304$\,@/____]G) XM``1D4H(6$F8$(`)@N%**#`,`)6;"+@)X`"M\````(/_\%AIP`!`#8&8(Q```O XM8/((Q``!8.P(Q``"8.8(Q``#8.!8CB0N__Q*@FP&",0``$2"%AI@5BM\````> XM,/_\=`!@&"`"YX!R`!(#T('0@M"")``$@@```#`6&G``$`-![(!C$#```$B`! XM"````F;48!P$0``@9Z!70&>B7T!GI%-`9XY50&>$5T!GK&"R*T+_^"0\``!]Z XMQ@P#`"YF7!8:#`,`*F846(XD+O_\2H)L!B0\``!]QA8:8#!T`&`8(`+G@'(`C XM$@/0@=""T((D``2"````,!8:<``0`T'L@&,0,```2(`(```"9M0,@@``?<9GK XM""M\````(/_\*@(,`P!H9@8(Q``'8!8,`P!L9@8(Q``&8`H,`P!,9@8(Q``(@ XM%AHK2@`,<``0`V```8Y@``,:"`0`!V<*6(X@;O_\,(=@&`@$``9G"EB.(&[_X XM_""'8`A8CB!N__P@AW0`8``!J%B.)&[__"\*3KH#""0`#(4``'W&6$]G!K2%B XM;P(D!6```898CA8N__]![?WX)$@0@W0!8``!<G0(8!``1`!(=GAT$&`&",0`O XM!'0*#`,`6&8(0?H"GB`(8`9!^@*G(`@K0/WT"`0`!F<(6(XL+O_\8!0(!``$H XM9PA8CBPN__Q@!EB.+"[__`@$``1G"DJ&;`9$A@C$``5![?_X)$@,A0``?<9FT XM`GH!2H9F!$J%9QPB`B`&3KH%K"!M_?05,`@`(@(@!DZZ!:@L`&;D0>W_^)'*, XM)`@(!``#9VX,`P!O9A1*@F<*#!(`,&<(M(5M!"H"4H5@5`P#`'AG!@P#`%AFD XM2$J"9T0,$@`P9SZTA6P00>W]^K'*9`@5/``P4H)@[`@$``!F'`RM````,/_\& XM9A(@`E2`L*W_^&P(*BW_^%6%8,H5`Q4\`#!4@K2%;!!![?WXL<ID"!4\`#!2) XM@F#L8$P$0``E9P#^R`1``#-G`/[8!$``"V<`_K)30&<`_LY;0&<`_LA;0&<`Z XM_E!30&<`_JY30&<`_JQ70&<`_FQ50&<`_JY70&<`_J!@`/XJ"`0`!&<H"`0`W XM!6<&%3P`+6`:"`0``6<&%3P`*V`."`0``F<&%3P`(&`"4X)2@MZ""`0``&8`7 XM`)`,K0```##__&9""`0`!&<\,`0"0``F9S0@4['K``1D#B!34I,0FG``$"K_V XM_V`.<``0&B\`+PM.N@$T4$\,@/____]G``#(4ZW_^%."8#0@4['K``1D$"!3= XM4I,0K?__<``0+?__8!!P`!`M__\O`"\+3KH`^E!/#(#_____9P``CE*'("W_2 XM^%.M__BP@F[`*@(@`E."2H!G+B!3L>L`!&0.(%-2DQ":<``0*O__8`YP`!`:( XM+P`O"TZZ`+103PR`_____V=(8,H(!```9SPD!6`L(%.QZP`$9`X@4U*3$+P`R XM('``<"!@#$AX`"`O"TZZ`'Y03PR`_____V<24H<@+?_X4ZW_^+"";LA@`/M8[ XM</]@`/M<,#$R,S0U-C<X.4%"0T1%1@`P,3(S-#4V-S@Y86)C9&5F`"!O``0@= XM"$H89OQ32)'`(`A.=4CG`"!![(%D)$@O"DZZ`;Y83]7\````%D'L@QRUR&7J6 XM3-\$`$YU2.<\("1O`!@H+P`<(`IG``&0-"H`#&<``8@(`@`)9@`!@`@"``-F$ XM``%X($K1_`````PP$`)`[_TP@$JJ``AF'`R$_____V8(<`!,WP0\3G4O"DZZQ XM`R8T*@`,6$\(`@`.9C0@4K'J``AC'DAX``$@$I"J``0O`!`J``Y(@$C`+P!.W XMN@2J3^\`#"2J``@@:@`0T=(E2``$#(3_____9@1V`&`"%@0@$I"J``@J`#`"N XM`D``H&=.#(3_____9R(@4E*2$(,@2M'\````##`0",``#C"`-`!!^O\$*4B'( XM=E*%#(3_____9PP,`P`*9P:ZJ@`0901X_V`,)5(`!'``$`-@`/]*"`(`#F<PH XM2H5G'"\%+RH`"!`J``Y(@$C`+P!.N@34L(5/[P`,9EX@2M'\````##`0"(``< XM#C"`#(3_____9A(DJ@`()6H`"``$<``0`V``_OI!^OZ&*4B'=B!*T?P````,^ XM,!`(P``.,(`DJ@`((&H`$-'2)4@`!"!24I(0@W``$`-@`/[&($K1_`````PP- XM$`C```(P@"5J``@`!"2J``AP_V``_J9.5?_V2.<X("1M``AT`"`*9P9*:@`,Q XM9@IP_TS?!!Q.74YU""H``0`,9@HO"DZZ`*"$@%A/$"H`#DB`2,`O`$ZZ!JR$8 XM@`@J````#5A/9PHO*@`(3KH!]%A/2FH`%&=.2'H`:DAM__=.N@*N."H`%'8`4 XM4$]P`#`$<@I.N@#:!H`````P<@>2@T'M__<1@!@`2,2)_``*4H,,@P````5MC XMU$(M__](;?_W3KH#<%A/0I)"J@`$0JH`"$)J``Q*@F<&</]@`/]8<`!@`/]2^ XM5$U0`$CG`"`D;P`((`IF1$'L@60D2$IJ``QG)C`J``P"0`((9AQ(>/__+PI.S XMNOUB#(#_____4$]F"'#_3-\$`$YUU?P````60>R#'+7(9<9P`&#H2'C__R\*9 XM3KK]-%!/8-I(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*1 XM@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&+ XM(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`3 XM#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5(YR`@7 XM)&\`#'1!$"H`#DB`2,`O`$ZZ`3I*@%A/9P)T(25\```$```02'@$`$ZZ`,8EY XM0``(6$]F&"5\`````0`0($K1_`````\E2``(-#P`@"!*T?P````,<``P$#("Q XM2,&`@3"`)6H`"``$)*H`"$S?!`1.=4CG`#"7RR1LAWI@$"!*4(@B;P`,L\AGD XM#B9*)%(@"F;L3-\,`$YU(`MG!":28`0I4H=Z2.<``B`J``10@")*+&R#+DZN8 XM_RY,WT``8-1(YP`P)&R'>F`<)E)(YP`"("H`!%"`(DHL;(,N3J[_+DS?0``DL XM2R`*9N!"K(=Z3-\,`$YU2.<@("0O``Q*@F8(<`!,WP0$3G5(YP`"<@`@`E"`G XM+&R#+DZN_SI,WT``)$!*@&8$<`!@VD'Z_Y8I2(=^)*R'>B5"``0I2H=Z(`I0; XM@&#`3.\#```$(`@0V6;\3G5(YR`@)"\`#'(&(`).N@02)$#5[(=22H)M##!L] XM@QRQPF\$2I)F$"E\`````X=&</],WP0$3G5(YP`"<@8@`DZZ`^`@;(=2(C`(F XM`"QLATY.KO\H3-]``$J`9P1P`6`"<`!@SDCG,"`D+P`03KH!:G(&(`).N@.L' XM)$#5[(=22H)M##!L@QRQPF\$2I)F$"E\`````X=&</],WP0,3G5(YS`"("\`( XM)%.`)@`D+P`@(A(L;(=.3J[_ODS?0`PF``R`_____V882.<``BQLATY.KO]\B XM3-]``"E`AT9P_V"Z2.<P`G8`=``B$BQLATY.KO^^3-]`#&"B2.<``B(O``@L^ XM;(=.3J[_N$S?0`!*@&882.<``BQLATY.KO]\3-]``"E`AT9P_TYU<`!@^DCG( XM,"`D+P`03KH`I'(&(`).N@+F)$#5[(=22H)M##!L@QRQPF\$2I)F$"E\````$ XM`X=&</],WP0,3G4P*@`$`D```V8,*7P````&AT9P_V#D""H``P`$9Q9(YS`"4 XM=@%T`"(2+&R'3DZN_[Y,WT`,2.<P`B8O`"0D+P`@(A(L;(=.3J[_T$S?0`PF2 XM``R`_____V882.<``BQLATY.KO]\3-]``"E`AT9P_V"*(`-@ADCG(`!(YP`"> XM(CP``!``<``L;(,N3J[^SDS?0``D``@```QG$DJLAUIF""`"3-\`!$YU3KKF2 XM=G``8/)*K(>"9Q0@;(>"(&@`!$Z0(&R'@BE0AX)@YDJLAW9G!B!LAW9.D"\OS XM``1.N@`&6$].=4CG,``F+P`,2JR'4F<R=`!@"B\"3KH!<%A/4H(P;(,<L<)N# XM[DCG``(P+(,<P?P`!B)LAU(L;(,N3J[_+DS?0`!*K(=^9P8@;(=^3I!*K(,B3 XM9Q1(YP`"(BR#(BQLATY.KO^F3-]``$JLAX9G""!LAX8@K(>*2JR'CF<42.<`U XM`B)LAXXL;(,N3J[^8DS?0`!*K(>29Q1(YP`"(FR'DBQL@RY.KOYB3-]``$JL= XMAY9G%$CG``(B;(>6+&R#+DZN_F),WT``2JR'FF<42.<``B)LAYHL;(,N3J[^Y XM8DS?0`!(YP`&+'@`!`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<RI?2JR'7F8\7 XM2JR';F<T2.<``B`LAVHB;(=N+&R#+DZN_RY,WT``2.<``B`LAV;E@%B`(FR'0 XM8BQL@RY.KO\N3-]``&`D2.<``BQL@RY.KO]\3-]``$CG``(B;(=>+&R#+DZN( XM_H9,WT``2.<``B)LATXL;(,N3J[^8DS?0``@`RYLATI.=4S?``Q.=4CG("`DQ XM+P`,<@8@`DZZ`$HD0-7LAU)*@FT,,&R#'+'";P1*DF80*7P````#AT9P_TS?L XM!`1.=3`J``0"0(``9A)(YP`"(A(L;(=.3J[_W$S?0`!"DG``8-A(YW``-`'$+ XMP"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),WP`.3G4``````^P````!`````0``Q XM#`P````````#\@```^H```#)```![```````````````````"@H```H+```*C XM)0``"C<```I+```*70``"FD```IZ```*C@``"J(```JP```*P@``"LP```KDG XM```*]0``"PP```L>```+-```"T@````3`"`@("`@("`@(#`P,#`P("`@("`@T XM("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`( XM"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("4 XM`@("`@("`@("`@("`D!`0$`@````````````````````````````````````Z XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM`````````````````````````````````@````````$`````````````````# XM``0``0`````!```````````````````$``(``````0``````````````````- XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````%``````````````#[````!0``````````````!`````4````&````!P`O XM```@````)````"@````L````,````#0````X````/````$````!$````2```\ XB`$P```!0````5````%@````````#\@```^L````!```#\D``A X`` Xend Xsize 9664 END_OF_FILE if test 13566 -ne `wc -c <'fziff.uu'`; then echo shar: \"'fziff.uu'\" unpacked with wrong size! fi # end of 'fziff.uu' fi if test -f 'iff.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'iff.c'\" else echo shar: Extracting \"'iff.c'\" \(3195 characters\) sed "s/^X//" >'iff.c' <<'END_OF_FILE' X/* iffar - IFF CAT archiver, IFF support functions X X By Karl Lehenbauer, 4/25/88. X This code is released to the public domain. X See the README file for more information. X X*/ X X/* culled general purpose IFF file cracking routines for Karl's X * IFF Stuff by Karl Lehenbauer, based originally on public domain IFF X * code from Electronic Arts, 2/24/88 X */ X X#include <exec/types.h> X#include <exec/memory.h> X#include <stdio.h> X#include <fcntl.h> X#include <ctype.h> X#include <hackercorp/assert.h> X X#include <hackercorp/iff.h> X X#include "prototypes.h" X Xextern long lseek(); X Xextern ULONG nextchunk(); X X/* print a chunkID to stderr */ Xvoid PutID(ID id) X{ X fprintf(stderr,"%c%c%c%c", X (char)((id>>24L) & 0x7f), X (char)((id>>16L) & 0x7f), X (char)((id>>8) & 0x7f), X (char)(id & 0x7f) ); X} X X/* write a chunk header, that's the 4-byte chunk ID and a 4-byte X * chunk length X */ Xint WriteChunkHeader(int fd,ULONG chunktype,long length) X{ X ChunkHeader chunkheader; X X chunkheader.ckID = chunktype; X chunkheader.ckSize = length; X X if (write(fd,&chunkheader,sizeof(chunkheader)) == -1) X { X perror("WriteChunkHeader"); X return(0); X } X return(1); X} X X/* write a chunk that has a four character subtype, like FORM, CAT or LIST X*/ Xint WriteSuperChunkHeader(int fd, ULONG chunktype, ULONG subtype, long length) X{ X if (!WriteChunkHeader(fd,chunktype,length+sizeof(subtype))) X return(0); X return(write(fd,&subtype,sizeof(subtype)) != -1); X} X X/* write a chunk header and body, that's the 8-byte header and the data X * to match the specified length X */ Xint WriteChunk(int fd, ULONG chunktype, void *data, long length) X{ X static char zero = '\0'; X X if (!WriteChunkHeader(fd,chunktype,length)) X return(0); X X /* if there's a body, write it out */ X if (length != 0) X if (write(fd,data,length) == -1) X { X perror("WriteChunk"); X return(0); X } X X /* if the length is odd, write out an additional zero byte */ X if (length & 1) X if (write(fd,&zero,1) == -1) X { X perror("WriteChunk"); X return(0); X } X return(1); X} X Xint WriteTextChunk(int fd,ULONG chunktype,char *text) X{ X int len = strlen(text); X return(WriteChunk(fd,chunktype,text,len)); X} X X/* rewrite_IFF_header - write (filesize - sizeof(ChunkHeader)) into X * IFF file's header, assumes file is open for write X */ Xint Rewrite_IFF_header(int fd) X{ X long filesize; X X /* get filesize by seeking to EOF */ X if ((filesize = lseek(fd,0,2)) == -1) X { X perror("rewrite_IFF_header"); X return(0); X } X X /* go back to the beginning of the file */ X if (lseek(fd,0,0) == -1) X { X perror("rewrite_IFF_header"); X return(0); X } X X if (!WriteChunkHeader(fd,ID_CAT,(filesize - sizeof(ChunkHeader)))) X { X perror("rewrite_IFF_header: WriteChunkHeader"); X return(0); X } X X return(1); X} X X/* create an IFF file by opening it for write and writing the type and subtype X */ Xint CreateIFF(char *filename, ULONG type, ULONG subtype) X{ X int fd; X X if ((fd = creat(filename, 0664)) == -1) X { X perror(filename); X return(-1); X } X X if (!WriteSuperChunkHeader(fd,type,subtype,0L)) X { X fprintf(stderr,"create_archive: couldn't write CAT chunkheader of new archive\n"); X return(-1); X } X X /* success, return the archive fd */ X return(fd); X} X X/* end of iff.c */ END_OF_FILE if test 3195 -ne `wc -c <'iff.c'`; then echo shar: \"'iff.c'\" unpacked with wrong size! fi # end of 'iff.c' fi if test -f 'iff.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'iff.h'\" else echo shar: Extracting \"'iff.h'\" \(2280 characters\) sed "s/^X//" >'iff.h' <<'END_OF_FILE' X#ifndef IFF_H X#define IFF_H X/*----------------------------------------------------------------------*/ X/* IFF.H defs for IFF-85 Interchange Format Files. 1/22/86 */ X/* */ X/* By Jerry Morrison and Steve Shaw, Electronic Arts. */ X/* This software is in the public domain. */ X/*----------------------------------------------------------------------*/ X X/* mods by Karl Lehenbauer, 1987, 1988 */ X X#ifndef LIBRARIES_DOS_H X#include "libraries/dos.h" X#endif X Xtypedef LONG ID; X X/* Four-character IDentifier builder.*/ X#define MakeID(a,b,c,d) ( (LONG)(a)<<24L | (LONG)(b)<<16L | (c)<<8 | (d) ) X X/* Standard group IDs. A chunk with one of these IDs contains a X SubTypeID followed by zero or more chunks.*/ X#define ID_FORM MakeID('F','O','R','M') X#define ID_PROP MakeID('P','R','O','P') X#define ID_LIST MakeID('L','I','S','T') X#define ID_CAT MakeID('C','A','T',' ') X#define ID_FILLER MakeID(' ',' ',' ',' ') X#define ID_FNAM MakeID('F','N','A','M') X#define ID_MISC MakeID('M','I','S','C') X X/* The IDs "FOR1".."FOR9", "LIS1".."LIS9", & "CAT1".."CAT9" are reserved X * for future standardization.*/ X X/* ---------- Chunk ----------------------------------------------------*/ X X/* All chunks start with a type ID and a count of the data bytes that X follow--the chunk's "logicl size" or "data size". If that number is odd, X a 0 pad byte is written, too. */ X Xtypedef struct { X ID ckID; X LONG ckSize; X } ChunkHeader; X Xtypedef struct { X ID ckID; X LONG ckSize; X UBYTE ckData[ 1 /*REALLY: ckSize*/ ]; X } Chunk; X X/* define the maximum reasonable chunk size - the real max is around 2^32, X * but we need some reasonability limit to check for */ X#define MAXCHUNKSIZE 900000 X X/* The Grouping chunks (LIST, FORM, PROP, & CAT) contain concatenations of X * chunks after a subtype ID that identifies the content chunks. X * "FORM type XXXX", "LIST of FORM type XXXX", "PROPerties associated X * with FORM type XXXX", or "conCATenation of XXXX".*/ Xtypedef struct { X ID ckID; X LONG ckSize; /* this ckSize includes "grpSubID".*/ X ID grpSubID; X } GroupHeader; X Xtypedef struct { X ID ckID; X LONG ckSize; X ID grpSubID; X UBYTE grpData[ 1 /*REALLY: ckSize-sizeof(grpSubID)*/ ]; X } GroupChunk; X X X#endif IFF_H X END_OF_FILE if test 2280 -ne `wc -c <'iff.h'`; then echo shar: \"'iff.h'\" unpacked with wrong size! fi # end of 'iff.h' fi if test -f 'libraries.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libraries.c'\" else echo shar: Extracting \"'libraries.c'\" \(430 characters\) sed "s/^X//" >'libraries.c' <<'END_OF_FILE' X#include <functions.h> X#include <exec/types.h> X#include <exec/devices.h> X#include <intuition/intuition.h> X#include <ctype.h> X Xstruct IntuitionBase *IntuitionBase = NULL; X Xvoid trash_libs(void) X{ X if (IntuitionBase) X CloseLibrary(IntuitionBase); X} X Xvoid init_libs(void) X{ X add_cleanup(trash_libs); X X if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L))) X panic("Can't open intuition.library"); X X} X END_OF_FILE if test 430 -ne `wc -c <'libraries.c'`; then echo shar: \"'libraries.c'\" unpacked with wrong size! fi # end of 'libraries.c' fi if test -f 'prototypes.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'prototypes.h'\" else echo shar: Extracting \"'prototypes.h'\" \(573 characters\) sed "s/^X//" >'prototypes.h' <<'END_OF_FILE' X/* iff.c */ Xvoid PutID(long id); Xint WriteChunkHeader(int fd, unsigned long chunktype, long length); Xint WriteSuperChunkHeader(int fd, unsigned long chunktype, unsigned long subtype, long length); Xint WriteChunk(int fd, unsigned long chunktype, void *data, long length); Xint WriteTextChunk(int fd, unsigned long chunktype, char *text); Xint Rewrite_IFF_header(int fd); Xint CreateIFF(char *filename, unsigned long type, unsigned long subtype); X/* fziff.c */ Xvoid freebody(void); Xint main(int argc, char **argv); X/* libraries.c */ Xvoid trash_libs(void); Xvoid init_libs(void); END_OF_FILE if test 573 -ne `wc -c <'prototypes.h'`; then echo shar: \"'prototypes.h'\" unpacked with wrong size! fi # end of 'prototypes.h' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. 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.