mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 01:19:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			207 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
 | 
						|
Program PtoP;
 | 
						|
{
 | 
						|
    $Id$
 | 
						|
    This file is part of the Free Pascal run time library.
 | 
						|
    Copyright (c) 1999-2002 by Michael Van Canneyt, member of
 | 
						|
    the Free Pascal development team
 | 
						|
 | 
						|
    Pascal pretty print program
 | 
						|
 | 
						|
    See the file COPYING.FPC, included in this distribution,
 | 
						|
    for details about the copyright.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
 **********************************************************************}
 | 
						|
 | 
						|
Uses PtoPu,Objects,getopts;
 | 
						|
 | 
						|
const
 | 
						|
  Version   = 'Version 1.1';
 | 
						|
  Title     = 'DelPascal';
 | 
						|
  Copyright = 'Copyright (c) 1999-2002 by the Free Pascal Development Team';
 | 
						|
 | 
						|
 | 
						|
Var
 | 
						|
  Infilename,OutFileName,ConfigFile : String;
 | 
						|
  BeVerbose : Boolean;
 | 
						|
  TheIndent,TheBufSize,TheLineSize : Integer;
 | 
						|
 | 
						|
Function StrToInt(Const S : String) : Integer;
 | 
						|
 | 
						|
Var Code : integer;
 | 
						|
    Int : integer;
 | 
						|
 | 
						|
begin
 | 
						|
  Val(S,int,Code);
 | 
						|
  StrToInt := int;
 | 
						|
  If Code<>0 then StrToInt:=0;
 | 
						|
end;
 | 
						|
 | 
						|
Procedure Usage;
 | 
						|
 | 
						|
begin
 | 
						|
  Writeln ('ptop : Usage : ');
 | 
						|
  Writeln ('ptop [-v] [-i indent] [-b bufsize ][-c optsfile][-l linesize] infile outfile');
 | 
						|
  Writeln ('     converts infile to outfile.');
 | 
						|
  Writeln ('     -c : read options from optsfile');
 | 
						|
  Writeln ('     -i : Set number of indent spaces.');
 | 
						|
  Writeln ('     -l : Set maximum output linesize.');
 | 
						|
  Writeln ('     -b : Use buffers of size bufsize');
 | 
						|
  Writeln ('     -v : be verbose');
 | 
						|
  writeln ('ptop -g ofile');
 | 
						|
  writeln ('     generate default options file');
 | 
						|
  Writeln ('ptop -h : This help');
 | 
						|
  halt(0);
 | 
						|
end;
 | 
						|
 | 
						|
Procedure Genopts;
 | 
						|
 | 
						|
Var S : PBufStream;
 | 
						|
 | 
						|
begin
 | 
						|
  S:=New(PBufStream,Init(ConfigFile,stCreate,255));
 | 
						|
  GeneratecfgFile(S);
 | 
						|
{$ifndef tp}
 | 
						|
  S^.Close;
 | 
						|
{$endif}
 | 
						|
  S^.Done;
 | 
						|
end;
 | 
						|
 | 
						|
Procedure ProcessOpts;
 | 
						|
 | 
						|
Var c : char;
 | 
						|
 | 
						|
begin
 | 
						|
  { Set defaults }
 | 
						|
  Infilename:='';
 | 
						|
  OutFileName:='';
 | 
						|
  ConfigFile:='';
 | 
						|
  TheIndent:=2;
 | 
						|
  TheBufSize:=255;
 | 
						|
  TheLineSize:=MaxLineSize;
 | 
						|
  BeVerbose:=False;
 | 
						|
  Repeat
 | 
						|
    c:=getopt('i:c:g:l:b:hv');
 | 
						|
    case c of
 | 
						|
      'i' : begin
 | 
						|
            TheIndent:=StrToInt(OptArg);
 | 
						|
            If TheIndent=0 then TheIndent:=2;
 | 
						|
            end;
 | 
						|
      'b' : begin
 | 
						|
            TheBufSize:=StrToInt(OptArg);
 | 
						|
            If TheBufSize=0 then TheBufSize:=255;
 | 
						|
            end;
 | 
						|
      'c' : ConfigFile:=OptArg;
 | 
						|
      'l' : begin
 | 
						|
            TheLineSize:=StrToInt(OptArg);
 | 
						|
            If TheLineSIze=0 Then TheLineSize:=MaxLineSize;
 | 
						|
            end;
 | 
						|
      'g' : begin
 | 
						|
            ConfigFIle:=OptArg;
 | 
						|
            GenOpts;
 | 
						|
            halt(0);
 | 
						|
            end;
 | 
						|
      'h' : usage;
 | 
						|
      'v' : BeVerbose:=True;
 | 
						|
    else
 | 
						|
    end;
 | 
						|
  until c=endofoptions;
 | 
						|
  If optind<=paramcount then
 | 
						|
    begin
 | 
						|
    InFileName:=paramstr(OptInd);
 | 
						|
    Inc(optind);
 | 
						|
    If OptInd<=paramcount then
 | 
						|
      OutFilename:=Paramstr(OptInd);
 | 
						|
    end;
 | 
						|
end; { Of ProcessOpts }
 | 
						|
 | 
						|
Var DiagS : PMemoryStream;
 | 
						|
    InS,OutS,cfgS : PBufSTream;
 | 
						|
    PPrinter : TPrettyPrinter;
 | 
						|
    P : Pchar;
 | 
						|
    i : longint;
 | 
						|
 | 
						|
 | 
						|
Procedure StreamErrorProcedure(Var S: TStream);{$ifndef fpc}FAR;{$endif}
 | 
						|
Begin
 | 
						|
 If S.Status = StError then
 | 
						|
    WriteLn('ERROR: General Access failure. Halting');
 | 
						|
 If S.Status = StInitError then
 | 
						|
    WriteLn('ERROR: Cannot Init Stream. Halting. ');
 | 
						|
 If S.Status = StReadError then
 | 
						|
    WriteLn('ERROR: Read beyond end of Stream. Halting');
 | 
						|
 If S.Status = StWriteError then
 | 
						|
    WriteLn('ERROR: Cannot expand Stream. Halting');
 | 
						|
 If S.Status = StGetError then
 | 
						|
    WriteLn('ERROR: Get of Unregistered type. Halting');
 | 
						|
 If S.Status = StPutError then
 | 
						|
    WriteLn('ERROR: Put of Unregistered type. Halting');
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
begin
 | 
						|
  StreamError:=@StreamErrorProcedure;
 | 
						|
  ProcessOpts;
 | 
						|
  if BeVerbose then
 | 
						|
    begin
 | 
						|
      writeln(Title+' '+Version);
 | 
						|
      writeln(Copyright);
 | 
						|
      Writeln;
 | 
						|
    end;
 | 
						|
  If (Length(InfileName)=0) or (Length(OutFileName)=0) Then
 | 
						|
    Usage;
 | 
						|
  Ins:=New(PBufStream,Init(InFileName,StopenRead,TheBufSize));
 | 
						|
  OutS:=New(PBufStream,Init(OutFileName,StCreate,TheBufSize));
 | 
						|
  If BeVerbose then
 | 
						|
    diagS:=New(PMemoryStream,Init(1000,255))
 | 
						|
  else
 | 
						|
    DiagS:=Nil;
 | 
						|
  If ConfigFile<>'' then
 | 
						|
    CfgS:=New(PBufStream,Init(ConfigFile,StOpenRead,TheBufSize))
 | 
						|
  else
 | 
						|
    CfgS:=Nil;
 | 
						|
  PPrinter.Create;
 | 
						|
  PPrinter.Indent:=TheIndent;
 | 
						|
  PPrinter.LineSize:=TheLineSize;
 | 
						|
  PPrinter.Ins:=Ins;
 | 
						|
  PPrinter.outS:=OutS;
 | 
						|
  PPrinter.cfgS:=CfgS;
 | 
						|
  PPrinter.DiagS:=DiagS;
 | 
						|
  PPrinter.PrettyPrint;
 | 
						|
  If Assigned(DiagS) then
 | 
						|
    begin
 | 
						|
    I:=DiagS^.GetSize;
 | 
						|
    DiagS^.Seek(0);
 | 
						|
    getmem (P,I+1);
 | 
						|
    DiagS^.Read(P[0],I);
 | 
						|
    P[I]:=#0;
 | 
						|
{$ifndef tp}
 | 
						|
    Writeln (stderr,P);
 | 
						|
    Flush(stderr);
 | 
						|
{$else}
 | 
						|
    Writeln (P);
 | 
						|
{$endif}
 | 
						|
    DiagS^.Done;
 | 
						|
    end;
 | 
						|
  If Assigned(CfgS) then
 | 
						|
    CfgS^.Done;
 | 
						|
  Ins^.Done;
 | 
						|
  OutS^.Done;
 | 
						|
end.
 | 
						|
 | 
						|
{
 | 
						|
  $Log$
 | 
						|
  Revision 1.3  2002-02-27 17:20:44  carl
 | 
						|
  + fix for BP
 | 
						|
 | 
						|
  Revision 1.2  2002/02/27 16:33:45  carl
 | 
						|
  - truncated log
 | 
						|
  * bugfix of -l parameter (was never valid)
 | 
						|
  + added version information
 | 
						|
 | 
						|
}
 |