/* simple IFF chunk-dump program */ ENUM ER_NONE, ER_FILE, ER_MEM, ER_USAGE, ER_BREAK, ER_FILETYPE, ER_CORRUPT OBJECT bmhd w:INT,h:INT,x:INT,y:INT planes:CHAR masking:CHAR compression:CHAR transcolour:INT xaspect:CHAR,yaspect:CHAR pagew:INT,pageh:INT ENDOBJECT OBJECT dbhd firstindex:INT recordsize:INT ENDOBJECT DEF flen,o:PTR TO LONG,mem,handle=NIL,chunkid,ifftype,size,off=-1 PROC main() WriteF('ShowChunk v0.1 (c) 1992 $#%!\n') IF StrCmp(arg,'',1) OR StrCmp(arg,'?',2) error(ER_USAGE) ELSE flen:=FileLength(arg) handle:=Open(arg,1005) IF (flen<1) OR (handle=NIL) error(ER_FILE) ELSE IF (mem:=New(flen))=NIL error(ER_MEM) ELSE IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process() ENDIF ENDIF ENDIF error(ER_NONE) ENDPROC PROC process() DEF end o:=mem end:=o+flen IF (o[]++<>"FORM") THEN error(ER_FILETYPE) IF flen-8<>o[]++ THEN error(ER_CORRUPT) WriteF('IFF Chunk layout of file "\s" (\d bytes)\n\n',arg,flen) form(end) ENDPROC PROC form(end) DEF itype INC off itype:=ifftype sp(); writetype(); WriteF('\n') WHILE o0 FOR a:=1 TO c sp(); WriteF(' string #\d="\s"\n',i++,s) WHILE s[]++ DO NOP ENDFOR ENDIF ENDPROC PROC dbtype() DEF h:PTR TO dbhd,s,i,c,csize,t h:=o; s:=o+4; csize:=size-4 i:=h.firstindex c:=h.recordsize WHILE csize>0 t:=s[] sp(); WriteF(' type #\d=\d\n',i++,t) csize:=csize-c ENDWHILE ENDPROC PROC showbmhd() DEF b:PTR TO bmhd b:=o; WriteF('\n') sp(); WriteF('Width,Height=(\d,\d)\n',b.w,b.h) sp(); WriteF('ScreenWidth,ScreenHeight=(\d,\d)\n',b.pagew,b.pageh) sp(); WriteF('Planes=\d\n',b.planes) sp(); WriteF('Xaspect,Yaspect=(\d,\d)\n',b.xaspect,b.yaspect) sp(); WriteF('Compression=') IF b.compression THEN WriteF('ON\n') ELSE WriteF('OFF\n') sp(); WriteF('Transparant colour=\d\n\n',b.transcolour) ENDPROC PROC legal(id:PTR TO CHAR) /* call by reference */ DEF a FOR a:=0 TO 3 DO IF (id[a]<32) OR (id[a]>126) THEN id[a]:="." ENDPROC PROC pstr() sp(); WriteF('"') Write(stdout,o,size) WriteF('"\n') ENDPROC PROC error(nr) IF handle THEN Close(handle) WriteF('\n') SELECT nr CASE ER_FILE; WriteF('Could not read file "\s" !\n',arg) CASE ER_MEM; WriteF('No memory for chunks!\n') CASE ER_USAGE; WriteF('USAGE: showchunk \n') CASE ER_BREAK; WriteF('** BREAK: ShowChunk\n') CASE ER_FILETYPE; WriteF('Not an IFF file.\n') CASE ER_CORRUPT; WriteF('IFF file format corrupt.\n') ENDSELECT IF nr=ER_USAGE WriteF('recognized chunks:\n\n') WriteF('ILBM,ANIM Picture and Animation format\n') WriteF('- BMHD CMAP CAMG BODY CRNG CCRT GRAB DEST SPRT\n') WriteF(' GRAB DPAN DPPS PTXT ATXT ANFR MAHD MFHD CM16\n') WriteF(' SHAK ANHD DLTA\n\n') WriteF('8SVX Samples\n') WriteF('- VHDR NAME AUTH ANNO ATAK RLSE BODY (c)\n\n') WriteF('SMUS Score files\n') WriteF('- SHDR NAME AUTH ANNO INS1 TRAK IREV SNX1 (c)\n\n') WriteF('FTXT Text\n') WriteF('- FONT CHRS\n\n') WriteF('PREF 2.0 Preferences\n') WriteF('- PRHD FONT INPT\n\n') WriteF('MDBI Maxon SDB\n') WriteF('- STRG TYPE ILST ENUM SCOP HUNK SRCS POSN\n\n') WriteF('GXUI,GXMN,GXTX,GXBX,GXGA,GXWD GadToolsBox GUI\n') WriteF('- MEDA ITXT BBOX GADA WDDA GGUI VERS\n') WriteF('\n') ENDIF CleanUp(0) ENDPROC PROC errorid() WriteF('Unknown chunk id: "\s[4]" !\n',{chunkid}) ENDPROC PROC sp() DEF a IF off>0 THEN FOR a:=1 TO off DO WriteF('\t') ENDPROC PROC gtbchunks() SELECT chunkid CASE "MEDA"; WriteF('Menu Data\n') CASE "ITXT"; WriteF('Intuitext\n') CASE "BBOX"; WriteF('BevelBox\n') CASE "GADA"; WriteF('Gadget\n') CASE "WDDA"; WriteF('Window\n') CASE "GGUI"; WriteF('GUI definition\n') CASE "VERS"; WriteF('Future version extension\n') CASE "FORM"; WriteF('Embedded IFF in file:\n\n'); form(size+o); WriteF('\n') DEFAULT; errorid() ENDSELECT ENDPROC