File: fixh2pasdirectives.lpr

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (124 lines) | stat: -rw-r--r-- 4,296 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
(*
 ***************************************************************************
 *                                                                         *
 *   This source is free software; you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This code 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.  See the GNU     *
 *   General Public License for more details.                              *
 *                                                                         *
 *   A copy of the GNU General Public License is available on the World    *
 *   Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also      *
 *   obtain it by writing to the Free Software Foundation,                 *
 *   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.        *
 *                                                                         *
 ***************************************************************************

  Author: Mattias Gaertner

  Abstract:
    Demonstration of how to add the missing IFDEFs, that h2pas forgets to add
    to the implementation, and how to remove unneeded IFDEFs.
    
  Usage:
    fixh2pasdirectives [-name1] [+name2] ... [filename]
    
  Parameters starting with - are macros that should be set to 'undefined',
  that means {$IFNDEF NAME} will be true.
  Parameters starting with + are macros that should be set to 'defined',
  that means {$IFDEF NAME} will be true.
  All other macros are treated as 'any'.
  Names are case insensitive.
  Otherwise the parameter is used as a filename to load.
  Example:
  
    ./fixh2pasdirectives -ENDIAN_BIG -Debug +FPC scanexamples/missingh2pasdirectives.pas
    
    This will set ENDIAN_BIG and Debug to undefined and FPC is set to '1'.
*)
program FixH2PASDirectives;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, CodeCache, CodeToolManager, DirectivesTree;
  
var
  Filename: string;
  Code: TCodeBuffer;
  Tree: TCompilerDirectivesTree;
  Changed: Boolean;
  Pass: Integer;
  i: Integer;
  p: String;
  Undefines: TStringList;
  Defines: TStringList;
begin
  Undefines:=nil;
  Defines:=nil;
  Filename:=SetDirSeparators('scanexamples/missingh2pasdirectives.pas');
  
  // parse parameters
  for i:=1 to ParamCount do begin
    p:=ParamStr(i);
    if p='' then continue;
    if p[1]='-' then begin
      if Undefines=nil then Undefines:=TStringList.Create;
      Undefines.Add(copy(p,2,length(p)));
    end
    else if p[1]='+' then begin
      if Defines=nil then Defines:=TStringList.Create;
      Defines.Add(copy(p,2,length(p)));
    end else
      Filename:=p;
  end;
  if Undefines<>nil then begin
    writeln('Undefines: ');
    writeln(Undefines.Text);
  end;
  if Defines<>nil then begin
    writeln('Defines: ');
    writeln(Defines.Text);
  end;

  // load the file
  Filename:=ExpandFileName(Filename);
  Code:=CodeToolBoss.LoadFile(Filename,false,false);
  if Code=nil then
    raise Exception.Create('loading failed '+Filename);

  // parse the directives
  Tree:=TCompilerDirectivesTree.Create;
  Tree.Parse(Code,CodeToolBoss.GetNestedCommentsFlagForFile(Code.Filename));
  writeln('-----------------------------------');
  writeln('h2pas created these directives:');
  Tree.WriteDebugReport;

  // add missing directives
  Changed:=false;
  Tree.FixMissingH2PasDirectives(Changed);
  writeln('-----------------------------------');
  writeln('after adding the missing directives:');
  Tree.WriteDebugReport;
  
  // reduce directives
  Pass:=0;
  repeat
    inc(Pass);
    Changed:=false;
    Tree.ReduceCompilerDirectives(Undefines,Defines,Changed);
    if not Changed then break;
    writeln('-----------------------------------');
    writeln('after reduce number ',Pass,':');
    Tree.WriteDebugReport;
  until false;
  
  writeln('-----------------------------------');
  writeln('Source:');
  writeln(Code.Source);
end.