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