Browse Source

* tool to remove tabs and convert to unix/dos linefeeds

peter 23 years ago
parent
commit
c77737a105
1 changed files with 368 additions and 0 deletions
  1. 368 0
      compiler/utils/fixtab.pp

+ 368 - 0
compiler/utils/fixtab.pp

@@ -0,0 +1,368 @@
+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)<Len do
+   begin
+     inc(byte(Hstr[0]));
+     Hstr[Length(Hstr)]:=' ';
+   end;
+  ESpace:=Hstr;
+end;
+
+{****************************************************************************
+                                 Main Stuff
+****************************************************************************}
+
+var
+  Done  : array[0..1023] of string[32];
+  Total : word;
+Function FileDone(const fn:string):boolean;
+var
+  i : word;
+begin
+  i:=0;
+  while (i<Total) and (Done[i]<>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 (i<innum) do
+        begin
+          case InBuf^[i] of
+           #9 : begin
+                  WriteBuf;
+                  OutBuf^[OutNum]:=' ';
+                  inc(OutNum);
+                  inc(Col);
+                  TabCol:=(((Col-1) div TabSize)+1)*TabSize;
+                  while (Col<TabCol) do
+                   begin
+                     OutBuf^[OutNum]:=' ';
+                     inc(OutNum);
+                     inc(Col);
+                   end;
+                end;
+          #13 : begin
+                  WriteBuf;
+                  while (outnum>0) 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] <InFile(s)>'#10);
+    writeln('<Options> can be : -O<OutFile>  Specify OutFile Mask');
+    WriteLn('                   -D           Use MsDos #13#10 Eols');
+    writeln('                   -T<size>     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.
+