Program GIFDIR(Input, Output); Uses Dos, Crt; Const ProSoft = ' Gif DIRectory - Version 2.0 (C) ProSoft '+Chr(254)+' Phil R. Overman 02-02-92'; gifliteheader = chr($21)+chr($FF)+chr(11)+'GIFLITE'; giflitesearch = 100; ScreenLines = 23; Maxlinelength = 80; test0 = false; test1 = true; (* {$I-} *) Type String12 = String[12]; LineType = Packed Array[1..Maxlinelength] of char; LengthType = 0..Maxlinelength; String2 = String[2]; String3 = String[3]; String8 = Packed Array[1..8] of char; { String12 = Packed Array[1..12] of char; } String15 = String[15]; Var dodate, dotime, domegs, doextension : boolean; doversion, dopalette, doGCT : boolean; dofiledot, doall, dogiflite : boolean; CmtFound, Pause, ShowZips, isgif : Boolean; CmtSize, FileCount, LinesWritten : Word; attr, height, width, colors : Word; fileattr : word; TotalSize, position : Longint; filesize, filedate : longint; icount, jcount : integer; count, clen : Byte; megs : real; DirInfo, gifdirinfo : Searchrec; Path, Gifpath, filein : PathStr; Dir : DirStr; Name, infdatestring, gifname : NameStr; Ext : ExtStr; A, B, C, cc, ch, eoname : Char; Abyte : Byte; cs : String[1]; meg : String2; gversion, gheader : String3; filename : String[12]; infile, outfile : text; giffile : file; infdt, filedt : datetime; giffilein : String15; Drive : String2; GCTF {1 Bit} : boolean; ColorResolution {3 Bits} : byte; SortFlag {1 Bit} : boolean; SizeOfGCT {3 Bits} : byte; giflite : boolean; BackgroundColorIndex : Byte; PixelAspectRatio : Byte; SizeofPalette : Longint; { Cmt : CmtType; } (***************************************************************) Procedure BadParms; begin writeln(' Program syntax: GDIR [d:\Path][Filename[.GIF]] [/p/a/d/t/m/f/v/g/r/?|h]'); { writeln; } writeln(' Displays standard DOS DIR of GIF files, but with height, width, and colors'); { writeln; } writeln(' Output looks like this (with no parameters):'); { writeln; } writeln(' GIFNAME GIF 178152 5-11-91 640h 400w 256c'); writeln; { writeln('Enter *.* to display all files (normal Dir).'); } writeln(' Parameters:'); writeln(' /P Pauses the display, just as in the DOS Dir command.'); writeln(' /A Displays complete information, except time.'); writeln(' /D turns display of the file Date off.'); writeln(' /T turns display of the file Time on.'); writeln(' /M shows size in Megabytes instead of bytes.'); writeln(' /F displays GIFNAME.GIF instead of GIFNAME GIF'); writeln(' /E suppress display of the extension.'); writeln(' /G Check if file optimized by GIFLITE and display it if so.'); writeln(' /V displays the Version of the GIF file - GIF87a, GIF89a, etc.'); writeln(' /C displays "GCM" if the file has a Global Color Map'); writeln(' /R Resolution - displays the total number of colors in the pallette'); writeln(' /H or /? displays this Help screen.'); if Doserror > 0 then writeln; If Doserror = 18 then Writeln(' File not found'); If Doserror = 3 then writeln(' Path not found'); if Doserror > 0 then writeln; halt(98); end; (************************************************) Procedure FlipB(Var f : boolean); Begin If f then f := false else f := true; End; (************************************************) Procedure ProcessParms(s : string); var sr : searchrec; Begin If (pos('/',s) = 1) Then Begin If (Copy(s,2,1) = 'P') or (Copy(s,2,1) = 'p') then Pause := true; If (Copy(s,2,1) = 'D') or (Copy(s,2,1) = 'd') then Flipb(dodate); If (Copy(s,2,1) = 'T') or (Copy(s,2,1) = 't') then Flipb(dotime); If (Copy(s,2,1) = 'M') or (Copy(s,2,1) = 'm') then Flipb(domegs); If (Copy(s,2,1) = 'F') or (Copy(s,2,1) = 'f') then Flipb(dofiledot); If (Copy(s,2,1) = 'V') or (Copy(s,2,1) = 'v') then Flipb(doversion); If (Copy(s,2,1) = 'R') or (Copy(s,2,1) = 'r') then Flipb(dopalette); If (Copy(s,2,1) = 'G') or (Copy(s,2,1) = 'g') then Flipb(dogiflite); If (Copy(s,2,1) = 'C') or (Copy(s,2,1) = 'c') then Flipb(doGCT); If (Copy(s,2,1) = 'E') or (Copy(s,2,1) = 'e') then Flipb(doextension); If (Copy(s,2,1) = 'A') or (Copy(s,2,1) = 'a') then Begin Flipb(doall); dodate := true; dotime := false; dofiledot := false; domegs := false; doversion := true; dopalette := false; doGCT := true; doextension := true; dogiflite := true; End; If (Copy(s,2,1) = 'H') or (Copy(s,2,1) = 'h') or (Copy(s,2,1) = '?') then Badparms; End Else Begin Path := FExpand(s); { If Copy(Path,Length(Path),1) = '\' then Path := Path + '*.GIF'; } { If Pos('.',path) = 0 then path := path + '.GIF'; } { If Pos('*',Path) + Pos('?',path) + Pos('.GIF',path) = 0 then begin FindFirst(Path,$10,sr); If Doserror = 0 then Path := Path + '\*.gif'; end; } End; End; (*******************) Function Exponential(A:integer; B:byte):longint; Var yyy : longint; (* Returns A to the Bth *) Begin yyy := A; For count := 2 to B Do yyy := yyy * A; If b=0 then Exponential := 1 else Exponential := yyy; End; (**********************************) Function BV(A:byte; b:byte):byte; {BitValue} var aa : byte; (* A is the byte value - b is the bit # for which the value is desired 1-8 *) Begin aa := a; While aa >= Exponential(2,b) do dec(aa,Exponential(2,b)); If aa < Exponential(2,b-1) then BV := 0 else BV := 1; End; (***********************) Procedure ClearName; Begin For count := 1 to 12 do DirInfo.name[count] := ' '; End; (**************************) Procedure ClearABC; Begin A := ' '; B := ' '; C := ' '; End; (*******************) { Procedure ClearCmt; Begin CmtFound := False; for count := 1 to MaxCmtSize do Cmt[count] := ' '; End; } (*******************) Procedure WriteName(n : String12); Var p, q, qq, r : byte; Begin p := 0; q := 0; r := 0; If doextension then qq :=12 else qq := 8; While r < length(n) DO Begin inc(p); inc(r); if (n[p] = '.') and not dofiledot then Begin If p < 9 then write(' ':9-p); inc(q, 9-p); If doextension then Begin write(' '); inc(q); End; End else begin If (p<9) or doextension then begin write(n[p]); inc(q); end; end; End; If q < qq then write(' ':qq-q); End; (********************************) Procedure WriteDate(i : longint); Var d : datetime; Begin Unpacktime(i,d); If d.month > 9 then Write(d.month,'-') else Write('0',d.month,'-'); If d.day > 9 then Write(d.day) else Write('0',d.day); Write('-',d.year mod 100); Write(' '); End; (********************************) Procedure WriteTime(i : longint); Var d : datetime; Begin Unpacktime(i,d); Write(' '); if d.hour = 0 then Write('12') else if d.hour mod 12 > 9 then Write(d.hour mod 12) else write(' ',d.hour mod 12); if d.min = 0 then Write(':00') else if d.min > 9 then write(':',d.min) else Write(':0',d.min); If d.hour > 11 then Write('p ') else Write('a '); End; (*****************************************************) Procedure Writeline(s : Searchrec); Var xx : byte; ss: string[1]; Begin Writename(s.name); If domegs or doextension then Begin xx := (s.size+5120) div 10240; If xx < 10 then begin Str(xx:1, ss); meg := '0' + ss end else Str(xx:2, meg) End; If domegs then Write(' .',meg,' ') else Write(s.size:10); Write(' '); If dodate then Writedate(s.time); If dotime then WriteTime(s.time); If isgif then Begin Write(height:4,'h',width:4,'w',colors:4,'c '); If dopalette then Write(sizeofpalette,'R '); If doversion then Write (' ',gversion,' '); If doGCT then begin if GCTF then Write(' GCM ') else write(' ') end; If doGIFLITE then begin if GIFLITE then Write(' GL ') else write(' ng ') end; End; Writeln; End; (****************************************************) Procedure ProcessGifFile; Var result : word; BEGIN Assign(GifFile, Concat(Dir,DirInfo.name)); Reset(GifFile, 1); isgif := false; inc(filecount); inc(totalsize,dirinfo.size); ClearABC; (* See if it's a GIF file. *) Result := Pos('.',Dirinfo.name); If (result > 0) and (Copy(DirInfo.name,result,Length(DirInfo.name)-result+1) = '.GIF') then isgif := true; { Result := Filesize; } If isgif { and (result>12) } then Begin blockread(GifFile, A, 1, result); blockread(GifFile, B, 1, result); blockread(GifFile, C, 1, result); gheader := A + B + C; End; If gheader = 'GIF' Then Begin {GifFileFound!} blockread(GifFile, A, 1, result); blockread(GifFile, B, 1, result); blockread(GifFile, C, 1, result); gversion := A + B + C; blockread(GifFile, height, 2, result); blockread(GifFile, width, 2, result); blockread(GifFile, Abyte, 1, result); SizeOfGCT := BV(Abyte,1) + BV(Abyte,2)*2 + BV(Abyte,3)*4 +1; colors := Exponential(2,SizeOfGCT); If BV(Abyte,4) = 1 then SortFlag := true else SortFlag := false; ColorResolution := BV(Abyte,5) + BV(Abyte,6)*2 + BV(Abyte,7)*4 +1; SizeOfPalette := Exponential(2,ColorResolution); SizeOfPalette := Exponential(SizeofPalette,3); If BV(Abyte,8) = 1 then GCTF := true else GCTF := false; Blockread(GifFile, BackgroundColorIndex, 1); Blockread(GifFile, PixelAspectRatio, 1); If dogiflite then Begin giflite := false; icount := 0; count := 1; jcount := giflitesearch; If GCTF then inc(jcount,3*colors); While (icount < jcount) and not giflite do Begin Blockread(Giffile, A, 1, result); If A = Copy(gifliteheader, count, 1) then Begin If count = length(gifliteheader) then giflite := true else inc(count) End; Inc(icount); End; End; End; Writeline(DirInfo); Close(GifFile); Inc(LinesWritten); END; (**********************) Procedure WriteVolLabel; Var v : searchrec; c : byte; Begin FindFirst(Copy(Path,1,3)+'*.*',VolumeID,v); Write(' Volume in drive ',Copy(Path,1,1),' is '); For c := 1 to length(v.name) do if v.name[c] <> '.' then write(v.name[c]); Writeln; Write(' Directory of ',Copy(Dir,1,Length(Dir)-1)); If Copy(Dir,2,1) = ':' then Write('\'); Writeln; Writeln; End; (***************************************) Procedure ParseParms(pps : string); Begin { This only gets parms with a slash / in them. } If Pos('/',pps) <> 1 Then { This is the filename with a slash appended } Begin { ProcessParms(Copy(pps,1,Pos('/',pps)-1)); } Path := Fexpand(Copy(pps,1,Pos('/',pps)-1)); pps := Copy(pps,Pos('/',pps),Length(pps)-Pos('/',pps)+1) End; While (Pos('/',pps) > 0) and (Length(pps) > 1) Do Begin ProcessParms(Copy(pps,1,2)); pps := Copy(pps,2,Length(pps)-1); If Pos('/',pps) > 0 then pps := Copy(pps,Pos('/',pps),Length(pps)-Pos('/',pps)+1); End; End; (***************************************) Procedure Initialize; Var sr : searchrec; Begin Assign(Input,''); Reset(Input); Assign(Output,''); Rewrite(Output); Writeln; Writeln(ProSoft); Writeln; dodate := true; dotime := false; domegs := false; doextension := true; dopalette := false; doGCT := false; doversion := false; pause := false; dofiledot := false; dogiflite := true; doall := false; gheader := ' '; gversion := ' '; ClearABC; Clearname; FileCount := 0; TotalSize := 0; LinesWritten := 0; For count := 1 to Sizeof(path) do Path[count] := ' '; For count := 1 to Sizeof(Dir) do Dir[count] := ' '; For Count := 1 to Sizeof(Name) do Name[count] := ' '; For count := 1 to Sizeof(Ext) do Ext[count] := ' '; If paramcount = 0 then Path := FExpand('*.GIF') else If Pos('/',paramstr(1)) = 1 then path := FExpand('*.GIF'); For Count := 1 to paramcount do If Pos('/',paramstr(count)) > 0 then ParseParms(paramstr(count)) else Path := Fexpand(paramstr(count)); { FindFirst(Path,$10,sr); If (Doserror = 0) and (sr.attr = $10) then begin Path := Path + '\*.gif'; Path := FExpand(Path) end; } Fsplit(Path,Dir,Name,Ext); If (name = '') or (name = ' ') then name := '*'; If (Ext = '') or (Ext = ' ') then Ext := '.GIF'; Path := Dir + Name + Ext; End; (******************> Main <*********************) Begin { Main } Initialize; FindFirst(Path,$21,DirInfo); If Doserror = 0 then Begin WriteVolLabel; While DosError < 1 do Begin If (dirinfo.name = '.') or (dirinfo.name = '..') then For count := 1 to 12 do DirInfo.name[count] := ' ' else ProcessGifFile; FindNext(DirInfo); If pause and (LinesWritten = ScreenLines) and (DosError < 1) then Begin Writeln('Press any key to continue . . .'); AssignCrt(Input); Reset(Input); AssignCrt(Output); Rewrite(Output); ch := Readkey; Assign(Input,''); Reset(Input); Assign(Output,''); Rewrite(Output); Writeln; LinesWritten := 1; End; End; Write(FileCount:9,' file'); If Filecount = 1 then Write(' ') else Write('s '); cs := Copy(Path,1,1); cc := cs[1]; count := ord(cc)-64; Writeln(totalsize:12,' bytes'); Writeln(' ':16,diskfree(count):12,' bytes free '); Writeln; End Else Badparms; End.