xref: /aosp_15_r20/external/curl/tests/test1167.pl (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi
27*6236dae4SAndroid Build Coastguard Worker# a late evening in the #curl IRC channel.
28*6236dae4SAndroid Build Coastguard Worker#
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Workeruse strict;
31*6236dae4SAndroid Build Coastguard Workeruse warnings;
32*6236dae4SAndroid Build Coastguard Workeruse vars qw($Cpreprocessor);
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard Worker#
35*6236dae4SAndroid Build Coastguard Worker# configurehelp perl module is generated by configure script
36*6236dae4SAndroid Build Coastguard Worker#
37*6236dae4SAndroid Build Coastguard Workermy $rc = eval {
38*6236dae4SAndroid Build Coastguard Worker    require configurehelp;
39*6236dae4SAndroid Build Coastguard Worker    configurehelp->import(qw(
40*6236dae4SAndroid Build Coastguard Worker        $Cpreprocessor
41*6236dae4SAndroid Build Coastguard Worker    ));
42*6236dae4SAndroid Build Coastguard Worker    1;
43*6236dae4SAndroid Build Coastguard Worker};
44*6236dae4SAndroid Build Coastguard Worker# Set default values if configure has not generated a configurehelp.pm file.
45*6236dae4SAndroid Build Coastguard Worker# This is the case with cmake.
46*6236dae4SAndroid Build Coastguard Workerif (!$rc) {
47*6236dae4SAndroid Build Coastguard Worker    $Cpreprocessor = 'cpp';
48*6236dae4SAndroid Build Coastguard Worker}
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard Workermy $verbose=0;
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker# verbose mode when -v is the first argument
53*6236dae4SAndroid Build Coastguard Workerif($ARGV[0] eq "-v") {
54*6236dae4SAndroid Build Coastguard Worker    $verbose=1;
55*6236dae4SAndroid Build Coastguard Worker    shift;
56*6236dae4SAndroid Build Coastguard Worker}
57*6236dae4SAndroid Build Coastguard Worker
58*6236dae4SAndroid Build Coastguard Worker# we may get the dir root pointed out
59*6236dae4SAndroid Build Coastguard Workermy $root=$ARGV[0] || ".";
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker# need an include directory when building out-of-tree
62*6236dae4SAndroid Build Coastguard Workermy $i = ($ARGV[1]) ? "-I$ARGV[1] " : '';
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard Workermy $incdir = "$root/include/curl";
65*6236dae4SAndroid Build Coastguard Worker
66*6236dae4SAndroid Build Coastguard Workermy $summary=0;
67*6236dae4SAndroid Build Coastguard Workermy $misses=0;
68*6236dae4SAndroid Build Coastguard Worker
69*6236dae4SAndroid Build Coastguard Workermy @syms;
70*6236dae4SAndroid Build Coastguard Workermy %doc;
71*6236dae4SAndroid Build Coastguard Workermy %rem;
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Workersub scanenums {
74*6236dae4SAndroid Build Coastguard Worker    my ($file)=@_;
75*6236dae4SAndroid Build Coastguard Worker    my $skipit = 0;
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker    open H_IN, "-|", "$Cpreprocessor -DCURL_DISABLE_DEPRECATION $i$file" ||
78*6236dae4SAndroid Build Coastguard Worker        die "Cannot preprocess $file";
79*6236dae4SAndroid Build Coastguard Worker    while ( <H_IN> ) {
80*6236dae4SAndroid Build Coastguard Worker        my ($line, $linenum) = ($_, $.);
81*6236dae4SAndroid Build Coastguard Worker        if( /^#(line|) (\d+) \"(.*)\"/) {
82*6236dae4SAndroid Build Coastguard Worker            # if the included file isn't in our incdir, then we skip this section
83*6236dae4SAndroid Build Coastguard Worker            # until next #line
84*6236dae4SAndroid Build Coastguard Worker            #
85*6236dae4SAndroid Build Coastguard Worker            if($3 !~ /^$incdir/) {
86*6236dae4SAndroid Build Coastguard Worker                $skipit = 1;
87*6236dae4SAndroid Build Coastguard Worker                next;
88*6236dae4SAndroid Build Coastguard Worker            }
89*6236dae4SAndroid Build Coastguard Worker            # parse this!
90*6236dae4SAndroid Build Coastguard Worker            $skipit = 0;
91*6236dae4SAndroid Build Coastguard Worker            next;
92*6236dae4SAndroid Build Coastguard Worker        }
93*6236dae4SAndroid Build Coastguard Worker        if($skipit) {
94*6236dae4SAndroid Build Coastguard Worker            next;
95*6236dae4SAndroid Build Coastguard Worker        }
96*6236dae4SAndroid Build Coastguard Worker        if (/^#/) {
97*6236dae4SAndroid Build Coastguard Worker            next;
98*6236dae4SAndroid Build Coastguard Worker        }
99*6236dae4SAndroid Build Coastguard Worker        if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
100*6236dae4SAndroid Build Coastguard Worker            s/^\s+//;
101*6236dae4SAndroid Build Coastguard Worker            chomp;
102*6236dae4SAndroid Build Coastguard Worker            s/[,\s].*//;
103*6236dae4SAndroid Build Coastguard Worker            if(($_ !~ /\}(;|)/) &&
104*6236dae4SAndroid Build Coastguard Worker               ($_ ne "typedef") &&
105*6236dae4SAndroid Build Coastguard Worker               ($_ ne "enum") &&
106*6236dae4SAndroid Build Coastguard Worker               ($_ ne "=") &&
107*6236dae4SAndroid Build Coastguard Worker               ($_ !~ /^\d+$/) &&
108*6236dae4SAndroid Build Coastguard Worker               ($_ !~ /^[ \t]*$/)) {
109*6236dae4SAndroid Build Coastguard Worker                if($verbose) {
110*6236dae4SAndroid Build Coastguard Worker                    print "Source: $Cpreprocessor $i$file\n";
111*6236dae4SAndroid Build Coastguard Worker                    print "Symbol: $_\n";
112*6236dae4SAndroid Build Coastguard Worker                    print "Line #$linenum: $line\n\n";
113*6236dae4SAndroid Build Coastguard Worker                }
114*6236dae4SAndroid Build Coastguard Worker                push @syms, $_;
115*6236dae4SAndroid Build Coastguard Worker            }
116*6236dae4SAndroid Build Coastguard Worker        }
117*6236dae4SAndroid Build Coastguard Worker    }
118*6236dae4SAndroid Build Coastguard Worker    close H_IN || die "Error preprocessing $file";
119*6236dae4SAndroid Build Coastguard Worker}
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard Workersub scanheader {
122*6236dae4SAndroid Build Coastguard Worker    my ($f)=@_;
123*6236dae4SAndroid Build Coastguard Worker    scanenums($f);
124*6236dae4SAndroid Build Coastguard Worker    open H, "<$f";
125*6236dae4SAndroid Build Coastguard Worker    while(<H>) {
126*6236dae4SAndroid Build Coastguard Worker        my ($line, $linenum) = ($_, $.);
127*6236dae4SAndroid Build Coastguard Worker        if (/^#define +([^ \n]*)/) {
128*6236dae4SAndroid Build Coastguard Worker            if($verbose) {
129*6236dae4SAndroid Build Coastguard Worker                print "Source: $f\n";
130*6236dae4SAndroid Build Coastguard Worker                print "Symbol: $1\n";
131*6236dae4SAndroid Build Coastguard Worker                print "Line #$linenum: $line\n\n";
132*6236dae4SAndroid Build Coastguard Worker            }
133*6236dae4SAndroid Build Coastguard Worker            push @syms, $1;
134*6236dae4SAndroid Build Coastguard Worker        }
135*6236dae4SAndroid Build Coastguard Worker    }
136*6236dae4SAndroid Build Coastguard Worker    close H;
137*6236dae4SAndroid Build Coastguard Worker}
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard Worker
140*6236dae4SAndroid Build Coastguard Workeropendir(my $dh, $incdir) || die "Can't opendir $incdir: $!";
141*6236dae4SAndroid Build Coastguard Workermy @hfiles = grep { /\.h$/ } readdir($dh);
142*6236dae4SAndroid Build Coastguard Workerclosedir $dh;
143*6236dae4SAndroid Build Coastguard Worker
144*6236dae4SAndroid Build Coastguard Workerfor(@hfiles) {
145*6236dae4SAndroid Build Coastguard Worker    scanheader("$incdir/$_");
146*6236dae4SAndroid Build Coastguard Worker}
147*6236dae4SAndroid Build Coastguard Worker
148*6236dae4SAndroid Build Coastguard Workermy $errors = 0;
149*6236dae4SAndroid Build Coastguard Workerfor my $s (@syms) {
150*6236dae4SAndroid Build Coastguard Worker    if($s !~ /^(lib|)curl/i) {
151*6236dae4SAndroid Build Coastguard Worker        print "Bad symbols in public header files:\n" if(!$errors);
152*6236dae4SAndroid Build Coastguard Worker        $errors++;
153*6236dae4SAndroid Build Coastguard Worker        print "  $s\n";
154*6236dae4SAndroid Build Coastguard Worker    }
155*6236dae4SAndroid Build Coastguard Worker}
156*6236dae4SAndroid Build Coastguard Workerif($errors) {
157*6236dae4SAndroid Build Coastguard Worker    exit 1;
158*6236dae4SAndroid Build Coastguard Worker}
159*6236dae4SAndroid Build Coastguard Workerprintf "%d fine symbols found\n", scalar(@syms);
160