|  | #! /usr/bin/perl | 
|  |  | 
|  | use strict; | 
|  | use warnings; | 
|  |  | 
|  | my $debug = $ENV{DEBUG}; | 
|  |  | 
|  | # This scripts finds DEPRECATEDIN declarations and converts them to | 
|  | # C declarations with the corresponding OSSL_DEPRECATEDIN attribute | 
|  | # macro.  It also makes sure they are guarded them with a corresponding | 
|  | # '#ifndef OPENSSL_NO_DEPRECATED', and pays extra attention to only have | 
|  | # one such guard around a group of deprecations for the same version. | 
|  |  | 
|  | my $parens_re = | 
|  | qr/( | 
|  | \(                   # The start of what we recurse on | 
|  | (?: | 
|  | (?> [^()]+ )     # Non-parens, without backtracking | 
|  | | | 
|  | (?-1)            # Recurse to start of parens group | 
|  | )* | 
|  | \)                   # The end of what we recurse on | 
|  | )/x; | 
|  |  | 
|  | my $deprecated_kw_re = qr/(DEPRECATEDIN)_(\d+_\d+(?:_\d+)?)/; | 
|  | my $deprecated_re = | 
|  | qr/ | 
|  | $deprecated_kw_re | 
|  | \( | 
|  | ( | 
|  | (?: | 
|  | (?> [^()]+ ) | 
|  | | | 
|  | $parens_re | 
|  | )* | 
|  | ) | 
|  | \) | 
|  | /x; | 
|  | my $headertext; | 
|  | { | 
|  | local $/; | 
|  | $headertext = <STDIN>; | 
|  | } | 
|  | $headertext =~ s/\R/\n/g; | 
|  |  | 
|  | my $cppspaces = ''; | 
|  | my $last_cppspaces = ''; | 
|  | my $currentguard = ""; | 
|  | my $cnt = 0; | 
|  | while ( $headertext =~ m/(.*?)                          # $1 | 
|  | (                              # $2 | 
|  | ^ | 
|  | (?| | 
|  | (\#)(\s*)(if)?.*?      # $3 ('#') | 
|  | # $4 (spaces) | 
|  | # $5 ('if'?) | 
|  | | | 
|  | \s*$deprecated_kw_re\(.*? | 
|  | # $3 = 'DEPRECATEDIN' | 
|  | # $4 (vers) | 
|  | ) | 
|  | \n | 
|  | ) | 
|  | /msx ) { | 
|  | my $before = $1; | 
|  | my $capture = $2; | 
|  | my $after = $'; | 
|  |  | 
|  | my $deprecation = ''; | 
|  | my $test = $capture.$'; | 
|  | my $version = undef; | 
|  |  | 
|  | print STDERR "DEBUG: captured:\n$capture" | 
|  | if $debug; | 
|  |  | 
|  | if ($3 eq '#') { | 
|  | # Treat preprocessor lines (count spaces) | 
|  | $cppspaces = $4; | 
|  | $cppspaces .= ' ' if (defined $5 && $5 eq 'if'); | 
|  | print STDERR "DEBUG: cpp spaces set to ", length($cppspaces), "\n" | 
|  | if $debug; | 
|  | $before .= $capture; | 
|  | } elsif ($test =~ m/^\s*$deprecated_re(.*?\n)/) { | 
|  | # Treat DEPRECATEDIN_... | 
|  | $version = $2; | 
|  | $deprecation = "OSSL_DEPRECATEDIN_$version $3;$5"; | 
|  | $after = $';            # Different from the previous! | 
|  | print STDERR "DEBUG: changed to:\n$deprecation\n" | 
|  | if $debug; | 
|  | } | 
|  |  | 
|  | if ($currentguard ne '' | 
|  | && (defined $version && $currentguard ne $version | 
|  | || $before !~ /^\s*$/s)) { | 
|  | print "#${last_cppspaces}endif\n"; | 
|  | $cppspaces = substr($cppspaces, 0, -1); | 
|  | $currentguard = ""; | 
|  | } | 
|  | print $before; | 
|  | if ($deprecation) { | 
|  | if ($currentguard eq '' && defined $version) { | 
|  | $currentguard = $version; | 
|  | print "#${cppspaces}ifndef OPENSSL_NO_DEPRECATED_$version\n"; | 
|  | $last_cppspaces = $cppspaces; | 
|  | $cppspaces .= ' '; | 
|  | print STDERR "DEBUG: cpp spaces set to ", length($cppspaces), "\n" | 
|  | if $debug; | 
|  | } | 
|  | print $deprecation; | 
|  | } | 
|  | $headertext = $after; | 
|  | } | 
|  | print "#endif\n" if $currentguard ne ''; | 
|  | print $headertext; |