ssl/statem: Replace size_t with int and add the checks
[openssl.git] / util / fix-deprecation
1 #! /usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 my $debug = $ENV{DEBUG};
7
8 # This scripts finds DEPRECATEDIN declarations and converts them to
9 # C declarations with the corresponding OSSL_DEPRECATEDIN attribute
10 # macro.  It also makes sure they are guarded them with a corresponding
11 # '#ifndef OPENSSL_NO_DEPRECATED', and pays extra attention to only have
12 # one such guard around a group of deprecations for the same version.
13
14 my $parens_re =
15     qr/(
16            \(                   # The start of what we recurse on
17                (?:
18                    (?> [^()]+ )     # Non-parens, without backtracking
19                |
20                    (?-1)            # Recurse to start of parens group
21                )*
22            \)                   # The end of what we recurse on
23        )/x;
24
25 my $deprecated_kw_re = qr/(DEPRECATEDIN)_(\d+_\d+(?:_\d+)?)/;
26 my $deprecated_re =
27     qr/
28           $deprecated_kw_re
29           \(
30           (
31               (?:
32                   (?> [^()]+ )
33               |
34                   $parens_re
35               )*
36           )
37           \)
38     /x;
39 my $headertext;
40 {
41     local $/;
42     $headertext = <STDIN>;
43 }
44 $headertext =~ s/\R/\n/g;
45
46 my $cppspaces = '';
47 my $last_cppspaces = '';
48 my $currentguard = "";
49 my $cnt = 0;
50 while ( $headertext =~ m/(.*?)                          # $1
51                          (                              # $2
52                              ^
53                              (?|
54                                  (\#)(\s*)(if)?.*?      # $3 ('#')
55                                                         # $4 (spaces)
56                                                         # $5 ('if'?)
57                              |
58                                  \s*$deprecated_kw_re\(.*?
59                                                         # $3 = 'DEPRECATEDIN'
60                                                         # $4 (vers)
61                              )
62                              \n
63                          )
64                         /msx ) {
65     my $before = $1;
66     my $capture = $2;
67     my $after = $';
68
69     my $deprecation = '';
70     my $test = $capture.$';
71     my $version = undef;
72
73     print STDERR "DEBUG: captured:\n$capture"
74         if $debug;
75
76     if ($3 eq '#') {
77         # Treat preprocessor lines (count spaces)
78         $cppspaces = $4;
79         $cppspaces .= ' ' if (defined $5 && $5 eq 'if');
80         print STDERR "DEBUG: cpp spaces set to ", length($cppspaces), "\n"
81             if $debug;
82         $before .= $capture;
83     } elsif ($test =~ m/^\s*$deprecated_re(.*?\n)/) {
84         # Treat DEPRECATEDIN_...
85         $version = $2;
86         $deprecation = "OSSL_DEPRECATEDIN_$version $3;$5";
87         $after = $';            # Different from the previous!
88         print STDERR "DEBUG: changed to:\n$deprecation\n"
89             if $debug;
90     }
91
92     if ($currentguard ne ''
93         && (defined $version && $currentguard ne $version
94             || $before !~ /^\s*$/s)) {
95         print "#${last_cppspaces}endif\n";
96         $cppspaces = substr($cppspaces, 0, -1);
97         $currentguard = "";
98     }
99     print $before;
100     if ($deprecation) {
101         if ($currentguard eq '' && defined $version) {
102             $currentguard = $version;
103             print "#${cppspaces}ifndef OPENSSL_NO_DEPRECATED_$version\n";
104             $last_cppspaces = $cppspaces;
105             $cppspaces .= ' ';
106             print STDERR "DEBUG: cpp spaces set to ", length($cppspaces), "\n"
107                 if $debug;
108         }
109         print $deprecation;
110     }
111     $headertext = $after;
112 }
113 print "#endif\n" if $currentguard ne '';
114 print $headertext;