program FixTab; uses Dos; const {Files} InputExt=''; OutputExt='*'; var {General} InFile, OutFile : string[80]; ParaFile : word; {Specific} const TabSize : longint=8; DosEol : boolean=false; Verbose : boolean=false; {**************************************************************************** Routines ****************************************************************************} const {$IFDEF LINUX} PathCh='/'; {$ELSE} PathCh='\'; {$ENDIF} Function SplitPath(Const HStr:String):String; var i : byte; begin i:=Length(Hstr); while (i>0) and (Hstr[i]<>PathCh) do dec(i); SplitPath:=Copy(Hstr,1,i); end; Function SplitFileName(Const HStr:String):String; var i : byte; begin i:=Length(Hstr); while (i>0) and (Hstr[i]<>PathCh) do dec(i); SplitFileName:=Copy(Hstr,i+1,255); end; Function SplitName(Const HStr:String):String; var i,j : byte; begin i:=Length(Hstr); j:=i; while (i>0) and (Hstr[i]<>PathCh) do dec(i); while (j>0) and (Hstr[j]<>'.') do dec(j); if j<=i then j:=255; SplitName:=Copy(Hstr,i+1,j-(i+1)); end; Function SplitExtension(Const HStr:String):String; var j,i : byte; begin i:=Length(Hstr); j:=i; while (i>0) and (Hstr[i]<>PathCh) do dec(i); while (j>0) and (Hstr[j]<>'.') do dec(j); if j<=i then j:=254; SplitExtension:=Copy(Hstr,j+1,255); end; Function AddExtension(Const HStr,ext:String):String; begin if (Ext<>'') and (SplitExtension(HStr)='') then AddExtension:=Hstr+'.'+Ext else AddExtension:=Hstr; end; Function ForceExtension(Const HStr,ext:String):String; var j : byte; begin j:=length(Hstr); while (j>0) and (Hstr[j]<>'.') do dec(j); if j=0 then j:=255; ForceExtension:=Copy(Hstr,1,j-1)+'.'+Ext; end; function UCase(Const Hstr:string):string; var i : byte; begin for i:=1to Length(Hstr) do UCase[i]:=Upcase(Hstr[i]); UCase[0]:=chr(Length(Hstr)); end; Function ESpace(HStr:String;len:byte):String; begin while length(Hstr)fn) do inc(i); if Done[i]=fn then FileDone:=true else begin Done[Total]:=fn; inc(Total); FileDone:=false; end; end; procedure Convert(fn,nfn:string); type inbuftype=array[0..31999] of char; outbuftype=array[0..63999] of char; var f,g : file; inbuf : ^inbuftype; outbuf : ^outbuftype; Curr, TabCol, col, i,last, innum, outnum : longint; procedure WriteBuf; begin if i>last then begin move(InBuf^[last],OutBuf^[OutNum],i-last); inc(OutNum,(i-last)); end; Last:=i+1; end; begin {Create New FileName} if SplitExtension(nfn)='*' then nfn:=AddExtension(SplitPath(nfn)+SplitName(nfn),SplitExtension(fn)); if SplitName(nfn)='*' then begin if SplitPath(nfn)='' then nfn:=AddExtension(SplitPath(fn)+SplitName(fn),SplitExtension(nfn)) else nfn:=AddExtension(SplitPath(nfn)+SplitName(fn),SplitExtension(nfn)); end; {Done?} if FileDone(nfn) then exit; {Open Files} Write('Converting '+ESpace(fn,30)+' '); if fn=nfn then assign(g,ForceExtension(fn,'$T$')) else begin Write('-> '+ESpace(nfn,30)+' '); assign(g,nfn); end; new(inbuf); new(outbuf); assign(f,fn); {$I-} reset(f,1); {$I+} if ioresult<>0 then exit; {$I-} rewrite(g,1); {$I+} if ioresult<>0 then begin close(f); exit; end; Curr:=0; col:=1; last:=0; repeat blockread(f,InBuf^,sizeof(InBufType),innum); outnum:=0; if innum>0 then begin i:=0; while (i0) and (outbuf^[outnum-1] in [' ',#9]) do dec(outnum); end; #10 : begin WriteBuf; while (outnum>0) and (outbuf^[outnum-1] in [' ',#9]) do dec(outnum); if DosEol then begin OutBuf^[OutNum]:=#13; inc(OutNum); end; OutBuf^[OutNum]:=#10; inc(OutNum); col:=0; inc(Curr); if (curr and 31)=0 then Write(Curr:5,#8#8#8#8#8); end; else inc(col); end; inc(i); end; WriteBuf; last:=0; end; blockwrite(g,OutBuf^,outnum); until innum=0; WriteLn(Curr,' Lines'); close(g); close(f); if fn=nfn then begin erase(f); rename(g,fn); end; dispose(outbuf); dispose(inbuf); end; {**************************************************************************** General Stuff ****************************************************************************} procedure getpara; var ch : char; para : string[128]; i,j : word; procedure helpscreen; begin writeln('Usage : '+SplitName(ParamStr(0))+' [Options] '#10); writeln(' can be : -O Specify OutFile Mask'); WriteLn(' -D Use MsDos #13#10 Eols'); writeln(' -T Set Size of Tabs'); writeln(' -V be more verbose'); writeln(' -? or -H This HelpScreen'); halt(1); end; begin for i:=1to paramcount do begin para:=ucase(paramstr(i)); if (para[1]='-') then begin ch:=para[2]; delete(para,1,2); case ch of 'O' : OutFile:=AddExtension(Para,OutputExt); 'D' : DosEol:=true; 'T' : Val(Para,TabSize,j); 'V' : verbose:=true; '?','H' : helpscreen; end; end else begin if ParaFile=0 then ParaFile:=i; end; end; if (ParaFile=0) then HelpScreen; if OutFile='' then OutFile:=ForceExtension('*',OutPutExt); end; var Dir : SearchRec; i : word; begin GetPara; {Main} if Verbose then begin Writeln('fixtab v1.01 (C) 1999-2002 Peter Vreman'); Writeln('TabSize ',TabSize); if DosEol then WriteLn('Using MsDos Eols'); end; for i:=ParaFile to ParamCount do begin InFile:=AddExtension(ParamStr(i),InputExt); FindFirst(InFile,$20,Dir); while (DosError=0) do begin Convert(SplitPath(InFile)+Dir.Name,OutFile); FindNext(Dir); end; end; end.