1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker# 25*6236dae4SAndroid Build Coastguard Worker########################################################################### 26*6236dae4SAndroid Build Coastguard Worker# 27*6236dae4SAndroid Build Coastguard Worker# Check that the deprecated statuses of functions and enum values in header 28*6236dae4SAndroid Build Coastguard Worker# files, manpages and symbols-in-versions are in sync. 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard Workeruse strict; 31*6236dae4SAndroid Build Coastguard Workeruse warnings; 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Workeruse File::Basename; 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Workermy $root=$ARGV[0] || "."; 36*6236dae4SAndroid Build Coastguard Workermy $incdir = "$root/include/curl"; 37*6236dae4SAndroid Build Coastguard Workermy $docdir = "$root/docs"; 38*6236dae4SAndroid Build Coastguard Workermy $libdocdir = "$docdir/libcurl"; 39*6236dae4SAndroid Build Coastguard Workermy $errcode = 0; 40*6236dae4SAndroid Build Coastguard Worker 41*6236dae4SAndroid Build Coastguard Worker# Symbol-indexed hashes. 42*6236dae4SAndroid Build Coastguard Worker# Values are: 43*6236dae4SAndroid Build Coastguard Worker# X Not deprecated 44*6236dae4SAndroid Build Coastguard Worker# ? Deprecated in unknown version 45*6236dae4SAndroid Build Coastguard Worker# x.yy.z Deprecated in version x.yy.z 46*6236dae4SAndroid Build Coastguard Workermy %syminver; # Symbols-in-versions deprecations. 47*6236dae4SAndroid Build Coastguard Workermy %hdr; # Public header files deprecations. 48*6236dae4SAndroid Build Coastguard Workermy %funcman; # Function manpages deprecations. 49*6236dae4SAndroid Build Coastguard Workermy %optman; # Option manpages deprecations. 50*6236dae4SAndroid Build Coastguard Worker 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Worker# Scan header file for public function and enum values. Flag them with 53*6236dae4SAndroid Build Coastguard Worker# the version they are deprecated in, if some. 54*6236dae4SAndroid Build Coastguard Workersub scan_header { 55*6236dae4SAndroid Build Coastguard Worker my ($f)=@_; 56*6236dae4SAndroid Build Coastguard Worker my $line = ""; 57*6236dae4SAndroid Build Coastguard Worker my $incomment = 0; 58*6236dae4SAndroid Build Coastguard Worker my $inenum = 0; 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard Worker open(my $h, "<", "$f"); 61*6236dae4SAndroid Build Coastguard Worker while(<$h>) { 62*6236dae4SAndroid Build Coastguard Worker s/^\s*(.*?)\s*$/$1/; # Trim. 63*6236dae4SAndroid Build Coastguard Worker # Remove multi-line comment trail. 64*6236dae4SAndroid Build Coastguard Worker if($incomment) { 65*6236dae4SAndroid Build Coastguard Worker if($_ !~ /.*?\*\/\s*(.*)$/) { 66*6236dae4SAndroid Build Coastguard Worker next; 67*6236dae4SAndroid Build Coastguard Worker } 68*6236dae4SAndroid Build Coastguard Worker $_ = $1; 69*6236dae4SAndroid Build Coastguard Worker $incomment = 0; 70*6236dae4SAndroid Build Coastguard Worker } 71*6236dae4SAndroid Build Coastguard Worker if($line ne "") { 72*6236dae4SAndroid Build Coastguard Worker # Unfold line. 73*6236dae4SAndroid Build Coastguard Worker $_ = "$line $1"; 74*6236dae4SAndroid Build Coastguard Worker $line = ""; 75*6236dae4SAndroid Build Coastguard Worker } 76*6236dae4SAndroid Build Coastguard Worker # Remove comments. 77*6236dae4SAndroid Build Coastguard Worker while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) { 78*6236dae4SAndroid Build Coastguard Worker $_ = "$1 $2"; 79*6236dae4SAndroid Build Coastguard Worker } 80*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^(.*)\/\*/) { 81*6236dae4SAndroid Build Coastguard Worker $_ = "$1 "; 82*6236dae4SAndroid Build Coastguard Worker $incomment = 1; 83*6236dae4SAndroid Build Coastguard Worker } 84*6236dae4SAndroid Build Coastguard Worker s/^\s*(.*?)\s*$/$1/; # Trim again. 85*6236dae4SAndroid Build Coastguard Worker # Ignore preprocessor directives and blank lines. 86*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^(?:#|$)/) { 87*6236dae4SAndroid Build Coastguard Worker next; 88*6236dae4SAndroid Build Coastguard Worker } 89*6236dae4SAndroid Build Coastguard Worker # Handle lines that may be continued as if they were folded. 90*6236dae4SAndroid Build Coastguard Worker if($_ !~ /[;,{}]$/) { 91*6236dae4SAndroid Build Coastguard Worker # Folded line. 92*6236dae4SAndroid Build Coastguard Worker $line = $_; 93*6236dae4SAndroid Build Coastguard Worker next; 94*6236dae4SAndroid Build Coastguard Worker } 95*6236dae4SAndroid Build Coastguard Worker if($_ =~ /CURLOPTDEPRECATED\(/) { 96*6236dae4SAndroid Build Coastguard Worker # Handle deprecated CURLOPT_* option. 97*6236dae4SAndroid Build Coastguard Worker if($_ !~ /CURLOPTDEPRECATED\(\s*(\S+)\s*,(?:.*?,){2}\s*(.*?)\s*,.*"\)/) { 98*6236dae4SAndroid Build Coastguard Worker # Folded line. 99*6236dae4SAndroid Build Coastguard Worker $line = $_; 100*6236dae4SAndroid Build Coastguard Worker next; 101*6236dae4SAndroid Build Coastguard Worker } 102*6236dae4SAndroid Build Coastguard Worker $hdr{$1} = $2; 103*6236dae4SAndroid Build Coastguard Worker } 104*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /CURLOPT\(/) { 105*6236dae4SAndroid Build Coastguard Worker # Handle non-deprecated CURLOPT_* option. 106*6236dae4SAndroid Build Coastguard Worker if($_ !~ /CURLOPT\(\s*(\S+)\s*(?:,.*?){2}\)/) { 107*6236dae4SAndroid Build Coastguard Worker # Folded line. 108*6236dae4SAndroid Build Coastguard Worker $line = $_; 109*6236dae4SAndroid Build Coastguard Worker next; 110*6236dae4SAndroid Build Coastguard Worker } 111*6236dae4SAndroid Build Coastguard Worker $hdr{$1} = "X"; 112*6236dae4SAndroid Build Coastguard Worker } 113*6236dae4SAndroid Build Coastguard Worker else { 114*6236dae4SAndroid Build Coastguard Worker my $version = "X"; 115*6236dae4SAndroid Build Coastguard Worker 116*6236dae4SAndroid Build Coastguard Worker # Get other kind of deprecation from this line. 117*6236dae4SAndroid Build Coastguard Worker if($_ =~ /CURL_DEPRECATED\(/) { 118*6236dae4SAndroid Build Coastguard Worker if($_ !~ /^(.*)CURL_DEPRECATED\(\s*(\S+?)\s*,.*?"\)(.*)$/) { 119*6236dae4SAndroid Build Coastguard Worker # Folded line. 120*6236dae4SAndroid Build Coastguard Worker $line = $_; 121*6236dae4SAndroid Build Coastguard Worker next; 122*6236dae4SAndroid Build Coastguard Worker } 123*6236dae4SAndroid Build Coastguard Worker $version = $2; 124*6236dae4SAndroid Build Coastguard Worker $_ = "$1 $3"; 125*6236dae4SAndroid Build Coastguard Worker } 126*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^CURL_EXTERN\s+.*\s+(\S+?)\s*\(/) { 127*6236dae4SAndroid Build Coastguard Worker # Flag public function. 128*6236dae4SAndroid Build Coastguard Worker $hdr{$1} = $version; 129*6236dae4SAndroid Build Coastguard Worker } 130*6236dae4SAndroid Build Coastguard Worker elsif($inenum && $_ =~ /(\w+)\s*[,=}]/) { 131*6236dae4SAndroid Build Coastguard Worker # Flag enum value. 132*6236dae4SAndroid Build Coastguard Worker $hdr{$1} = $version; 133*6236dae4SAndroid Build Coastguard Worker } 134*6236dae4SAndroid Build Coastguard Worker } 135*6236dae4SAndroid Build Coastguard Worker # Remember if we are in an enum definition. 136*6236dae4SAndroid Build Coastguard Worker $inenum |= ($_ =~ /\benum\b/); 137*6236dae4SAndroid Build Coastguard Worker if($_ =~ /}/) { 138*6236dae4SAndroid Build Coastguard Worker $inenum = 0; 139*6236dae4SAndroid Build Coastguard Worker } 140*6236dae4SAndroid Build Coastguard Worker } 141*6236dae4SAndroid Build Coastguard Worker close $h; 142*6236dae4SAndroid Build Coastguard Worker} 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Worker# Scan function manpage for options. 145*6236dae4SAndroid Build Coastguard Worker# Each option has to be declared as ".IP <option>" where <option> starts with 146*6236dae4SAndroid Build Coastguard Worker# the prefix. Flag each option with its deprecation version, if some. 147*6236dae4SAndroid Build Coastguard Workersub scan_man_for_opts { 148*6236dae4SAndroid Build Coastguard Worker my ($f, $prefix)=@_; 149*6236dae4SAndroid Build Coastguard Worker my $opt = ""; 150*6236dae4SAndroid Build Coastguard Worker my $line = ""; 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker open(my $m, "<", "$f"); 153*6236dae4SAndroid Build Coastguard Worker while(<$m>) { 154*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^\./) { 155*6236dae4SAndroid Build Coastguard Worker # roff directive found: end current option paragraph. 156*6236dae4SAndroid Build Coastguard Worker my $o = $opt; 157*6236dae4SAndroid Build Coastguard Worker $opt = ""; 158*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^\.IP\s+((?:$prefix)_\w+)/) { 159*6236dae4SAndroid Build Coastguard Worker # A new option has been found. 160*6236dae4SAndroid Build Coastguard Worker $opt = $1; 161*6236dae4SAndroid Build Coastguard Worker } 162*6236dae4SAndroid Build Coastguard Worker $_ = $line; # Get full paragraph. 163*6236dae4SAndroid Build Coastguard Worker $line = ""; 164*6236dae4SAndroid Build Coastguard Worker s/\\f.//g; # Remove font formatting. 165*6236dae4SAndroid Build Coastguard Worker s/\s+/ /g; # One line with single space only. 166*6236dae4SAndroid Build Coastguard Worker if($o) { 167*6236dae4SAndroid Build Coastguard Worker $funcman{$o} = "X"; 168*6236dae4SAndroid Build Coastguard Worker # Check if paragraph is mentioning deprecation. 169*6236dae4SAndroid Build Coastguard Worker while($_ =~ /(?:deprecated|obsoleted?)\b\s*(?:in\b|since\b)?\s*(?:version\b|curl\b|libcurl\b)?\s*(\d[0-9.]*\d)?\b\s*(.*)$/i) { 170*6236dae4SAndroid Build Coastguard Worker $funcman{$o} = $1 || "?"; 171*6236dae4SAndroid Build Coastguard Worker $_ = $2; 172*6236dae4SAndroid Build Coastguard Worker } 173*6236dae4SAndroid Build Coastguard Worker } 174*6236dae4SAndroid Build Coastguard Worker } 175*6236dae4SAndroid Build Coastguard Worker else { 176*6236dae4SAndroid Build Coastguard Worker # Text line: accumulate. 177*6236dae4SAndroid Build Coastguard Worker $line .= $_; 178*6236dae4SAndroid Build Coastguard Worker } 179*6236dae4SAndroid Build Coastguard Worker } 180*6236dae4SAndroid Build Coastguard Worker close $m; 181*6236dae4SAndroid Build Coastguard Worker} 182*6236dae4SAndroid Build Coastguard Worker 183*6236dae4SAndroid Build Coastguard Worker# Scan manpage for deprecation in DESCRIPTION and/or AVAILABILITY sections. 184*6236dae4SAndroid Build Coastguard Workersub scan_man_page { 185*6236dae4SAndroid Build Coastguard Worker my ($path, $sym, $table)=@_; 186*6236dae4SAndroid Build Coastguard Worker my $version = "X"; 187*6236dae4SAndroid Build Coastguard Worker 188*6236dae4SAndroid Build Coastguard Worker if(open(my $fh, "<", "$path")) { 189*6236dae4SAndroid Build Coastguard Worker my $section = ""; 190*6236dae4SAndroid Build Coastguard Worker my $line = ""; 191*6236dae4SAndroid Build Coastguard Worker 192*6236dae4SAndroid Build Coastguard Worker while(<$fh>) { 193*6236dae4SAndroid Build Coastguard Worker if($_ =~ /\.so\s+man3\/(.*\.3\b)/) { 194*6236dae4SAndroid Build Coastguard Worker # Handle manpage inclusion. 195*6236dae4SAndroid Build Coastguard Worker scan_man_page(dirname($path) . "/$1", $sym, $table); 196*6236dae4SAndroid Build Coastguard Worker $version = exists($$table{$sym})? $$table{$sym}: $version; 197*6236dae4SAndroid Build Coastguard Worker } 198*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /^\./) { 199*6236dae4SAndroid Build Coastguard Worker # Line is a roff directive. 200*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^\.SH\b\s*(\w*)/) { 201*6236dae4SAndroid Build Coastguard Worker # Section starts. End previous one. 202*6236dae4SAndroid Build Coastguard Worker my $sh = $section; 203*6236dae4SAndroid Build Coastguard Worker 204*6236dae4SAndroid Build Coastguard Worker $section = $1; 205*6236dae4SAndroid Build Coastguard Worker $_ = $line; # Previous section text. 206*6236dae4SAndroid Build Coastguard Worker $line = ""; 207*6236dae4SAndroid Build Coastguard Worker s/\\f.//g; 208*6236dae4SAndroid Build Coastguard Worker s/\s+/ /g; 209*6236dae4SAndroid Build Coastguard Worker s/\\f.//g; # Remove font formatting. 210*6236dae4SAndroid Build Coastguard Worker s/\s+/ /g; # One line with single space only. 211*6236dae4SAndroid Build Coastguard Worker if($sh =~ /DESCRIPTION|DEPRECATED/) { 212*6236dae4SAndroid Build Coastguard Worker while($_ =~ /(?:deprecated|obsoleted?)\b\s*(?:in\b|since\b)?\s*(?:version\b|curl\b|libcurl\b)?\s*(\d[0-9.]*\d)?\b\s*(.*)$/i) { 213*6236dae4SAndroid Build Coastguard Worker # Flag deprecation status. 214*6236dae4SAndroid Build Coastguard Worker if($version ne "X" && $version ne "?") { 215*6236dae4SAndroid Build Coastguard Worker if($1 && $1 ne $version) { 216*6236dae4SAndroid Build Coastguard Worker print "error: $sym manpage lists unmatching deprecation versions $version and $1\n"; 217*6236dae4SAndroid Build Coastguard Worker $errcode++; 218*6236dae4SAndroid Build Coastguard Worker } 219*6236dae4SAndroid Build Coastguard Worker } 220*6236dae4SAndroid Build Coastguard Worker else { 221*6236dae4SAndroid Build Coastguard Worker $version = $1 || "?"; 222*6236dae4SAndroid Build Coastguard Worker } 223*6236dae4SAndroid Build Coastguard Worker $_ = $2; 224*6236dae4SAndroid Build Coastguard Worker } 225*6236dae4SAndroid Build Coastguard Worker } 226*6236dae4SAndroid Build Coastguard Worker } 227*6236dae4SAndroid Build Coastguard Worker } 228*6236dae4SAndroid Build Coastguard Worker else { 229*6236dae4SAndroid Build Coastguard Worker # Text line: accumulate. 230*6236dae4SAndroid Build Coastguard Worker $line .= $_; 231*6236dae4SAndroid Build Coastguard Worker } 232*6236dae4SAndroid Build Coastguard Worker } 233*6236dae4SAndroid Build Coastguard Worker close $fh; 234*6236dae4SAndroid Build Coastguard Worker $$table{$sym} = $version; 235*6236dae4SAndroid Build Coastguard Worker } 236*6236dae4SAndroid Build Coastguard Worker} 237*6236dae4SAndroid Build Coastguard Worker 238*6236dae4SAndroid Build Coastguard Worker 239*6236dae4SAndroid Build Coastguard Worker# Read symbols-in-versions. 240*6236dae4SAndroid Build Coastguard Workeropen(my $fh, "<", "$libdocdir/symbols-in-versions") || 241*6236dae4SAndroid Build Coastguard Worker die "$libdocdir/symbols-in-versions"; 242*6236dae4SAndroid Build Coastguard Workerwhile(<$fh>) { 243*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^((?:CURL|LIBCURL)\S+)\s+\S+\s*(\S*)\s*(\S*)$/) { 244*6236dae4SAndroid Build Coastguard Worker if($3 eq "") { 245*6236dae4SAndroid Build Coastguard Worker $syminver{$1} = "X"; 246*6236dae4SAndroid Build Coastguard Worker if($2 ne "" && $2 ne ".") { 247*6236dae4SAndroid Build Coastguard Worker $syminver{$1} = $2; 248*6236dae4SAndroid Build Coastguard Worker } 249*6236dae4SAndroid Build Coastguard Worker } 250*6236dae4SAndroid Build Coastguard Worker } 251*6236dae4SAndroid Build Coastguard Worker} 252*6236dae4SAndroid Build Coastguard Workerclose($fh); 253*6236dae4SAndroid Build Coastguard Worker 254*6236dae4SAndroid Build Coastguard Worker# Get header file names, 255*6236dae4SAndroid Build Coastguard Workeropendir(my $dh, $incdir) || die "Can't opendir $incdir"; 256*6236dae4SAndroid Build Coastguard Workermy @hfiles = grep { /\.h$/ } readdir($dh); 257*6236dae4SAndroid Build Coastguard Workerclosedir $dh; 258*6236dae4SAndroid Build Coastguard Worker 259*6236dae4SAndroid Build Coastguard Worker# Get functions and enum symbols from header files. 260*6236dae4SAndroid Build Coastguard Workerfor(@hfiles) { 261*6236dae4SAndroid Build Coastguard Worker scan_header("$incdir/$_"); 262*6236dae4SAndroid Build Coastguard Worker} 263*6236dae4SAndroid Build Coastguard Worker 264*6236dae4SAndroid Build Coastguard Worker# Get function statuses from manpages. 265*6236dae4SAndroid Build Coastguard Workerforeach my $sym (keys %hdr) { 266*6236dae4SAndroid Build Coastguard Worker if($sym =~/^(?:curl|curlx)_\w/) { 267*6236dae4SAndroid Build Coastguard Worker scan_man_page("$libdocdir/$sym.3", $sym, \%funcman); 268*6236dae4SAndroid Build Coastguard Worker } 269*6236dae4SAndroid Build Coastguard Worker} 270*6236dae4SAndroid Build Coastguard Worker 271*6236dae4SAndroid Build Coastguard Worker# Get options from function manpages. 272*6236dae4SAndroid Build Coastguard Workerscan_man_for_opts("$libdocdir/curl_easy_setopt.3", "CURLOPT"); 273*6236dae4SAndroid Build Coastguard Workerscan_man_for_opts("$libdocdir/curl_easy_getinfo.3", "CURLINFO"); 274*6236dae4SAndroid Build Coastguard Worker 275*6236dae4SAndroid Build Coastguard Worker# Get deprecation status from option manpages. 276*6236dae4SAndroid Build Coastguard Workerforeach my $sym (keys %syminver) { 277*6236dae4SAndroid Build Coastguard Worker if($sym =~ /^(?:CURLOPT|CURLINFO)_\w+$/) { 278*6236dae4SAndroid Build Coastguard Worker scan_man_page("$libdocdir/opts/$sym.3", $sym, \%optman); 279*6236dae4SAndroid Build Coastguard Worker } 280*6236dae4SAndroid Build Coastguard Worker} 281*6236dae4SAndroid Build Coastguard Worker 282*6236dae4SAndroid Build Coastguard Worker# Print results. 283*6236dae4SAndroid Build Coastguard Workermy %keys = (%syminver, %funcman, %optman, %hdr); 284*6236dae4SAndroid Build Coastguard Workermy $leader = <<HEADER 285*6236dae4SAndroid Build Coastguard WorkerLegend: 286*6236dae4SAndroid Build Coastguard Worker<empty> Not listed 287*6236dae4SAndroid Build Coastguard WorkerX Not deprecated 288*6236dae4SAndroid Build Coastguard Worker? Deprecated in unknown version 289*6236dae4SAndroid Build Coastguard Workerx.yy.z Deprecated in version x.yy.z 290*6236dae4SAndroid Build Coastguard Worker 291*6236dae4SAndroid Build Coastguard WorkerSymbol symbols-in func man opt man .h 292*6236dae4SAndroid Build Coastguard Worker -versions 293*6236dae4SAndroid Build Coastguard WorkerHEADER 294*6236dae4SAndroid Build Coastguard Worker ; 295*6236dae4SAndroid Build Coastguard Workerforeach my $sym (sort {$a cmp $b} keys %keys) { 296*6236dae4SAndroid Build Coastguard Worker if($sym =~ /^(?:CURLOPT|CURLINFO|curl|curlx)_\w/) { 297*6236dae4SAndroid Build Coastguard Worker my $s = exists($syminver{$sym})? $syminver{$sym}: " "; 298*6236dae4SAndroid Build Coastguard Worker my $f = exists($funcman{$sym})? $funcman{$sym}: " "; 299*6236dae4SAndroid Build Coastguard Worker my $o = exists($optman{$sym})? $optman{$sym}: " "; 300*6236dae4SAndroid Build Coastguard Worker my $h = exists($hdr{$sym})? $hdr{$sym}: " "; 301*6236dae4SAndroid Build Coastguard Worker my $r = " "; 302*6236dae4SAndroid Build Coastguard Worker 303*6236dae4SAndroid Build Coastguard Worker # There are deprecated symbols in symbols-in-versions that are aliases 304*6236dae4SAndroid Build Coastguard Worker # and thus not listed anywhere else. Ignore them. 305*6236dae4SAndroid Build Coastguard Worker "$f$o$h" =~ /[X ]{3}/ && next; 306*6236dae4SAndroid Build Coastguard Worker 307*6236dae4SAndroid Build Coastguard Worker # Check for inconsistencies between deprecations from the different sources. 308*6236dae4SAndroid Build Coastguard Worker foreach my $k ($s, $f, $o, $h) { 309*6236dae4SAndroid Build Coastguard Worker $r = $r eq " "? $k: $r; 310*6236dae4SAndroid Build Coastguard Worker if($k ne " " && $r ne $k) { 311*6236dae4SAndroid Build Coastguard Worker if($r eq "?") { 312*6236dae4SAndroid Build Coastguard Worker $r = $k ne "X"? $k: "!"; 313*6236dae4SAndroid Build Coastguard Worker } 314*6236dae4SAndroid Build Coastguard Worker elsif($r eq "X" || $k ne "?") { 315*6236dae4SAndroid Build Coastguard Worker $r = "!"; 316*6236dae4SAndroid Build Coastguard Worker } 317*6236dae4SAndroid Build Coastguard Worker } 318*6236dae4SAndroid Build Coastguard Worker } 319*6236dae4SAndroid Build Coastguard Worker 320*6236dae4SAndroid Build Coastguard Worker if($r eq "!") { 321*6236dae4SAndroid Build Coastguard Worker print $leader; 322*6236dae4SAndroid Build Coastguard Worker $leader = ""; 323*6236dae4SAndroid Build Coastguard Worker printf("%-38s %-11s %-9s %-9s %s\n", $sym, $s, $f, $o, $h); 324*6236dae4SAndroid Build Coastguard Worker $errcode++; 325*6236dae4SAndroid Build Coastguard Worker } 326*6236dae4SAndroid Build Coastguard Worker } 327*6236dae4SAndroid Build Coastguard Worker} 328*6236dae4SAndroid Build Coastguard Worker 329*6236dae4SAndroid Build Coastguard Workerexit $errcode; 330