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