xref: /aosp_15_r20/external/curl/docs/examples/version-check.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 accepts a source file as input on the command line.
27*6236dae4SAndroid Build Coastguard Worker#
28*6236dae4SAndroid Build Coastguard Worker# It first loads the 'symbols-in-versions' document and stores a lookup
29*6236dae4SAndroid Build Coastguard Worker# table for all known symbols for which version they were introduced.
30*6236dae4SAndroid Build Coastguard Worker#
31*6236dae4SAndroid Build Coastguard Worker# It then scans the given source file to dig up all symbols starting with CURL.
32*6236dae4SAndroid Build Coastguard Worker# Finally, it sorts the internal list of found symbols (using the version
33*6236dae4SAndroid Build Coastguard Worker# number as sort key) and then it outputs the most recent version number and
34*6236dae4SAndroid Build Coastguard Worker# the symbols from that version that are used.
35*6236dae4SAndroid Build Coastguard Worker#
36*6236dae4SAndroid Build Coastguard Worker# Usage:
37*6236dae4SAndroid Build Coastguard Worker#
38*6236dae4SAndroid Build Coastguard Worker#    version-check.pl [source file]
39*6236dae4SAndroid Build Coastguard Worker#
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Workeropen(S, "<../libcurl/symbols-in-versions") || die;
42*6236dae4SAndroid Build Coastguard Worker
43*6236dae4SAndroid Build Coastguard Workermy %doc;
44*6236dae4SAndroid Build Coastguard Workermy %rem;
45*6236dae4SAndroid Build Coastguard Workerwhile(<S>) {
46*6236dae4SAndroid Build Coastguard Worker    if(/(^CURL[^ \n]*) *(.*)/) {
47*6236dae4SAndroid Build Coastguard Worker        my ($sym, $rest)=($1, $2);
48*6236dae4SAndroid Build Coastguard Worker        my @a=split(/ +/, $rest);
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard Worker        $doc{$sym}=$a[0]; # when it was introduced
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker        if($a[2]) {
53*6236dae4SAndroid Build Coastguard Worker            # this symbol is documented to have been present the last time
54*6236dae4SAndroid Build Coastguard Worker            # in this release
55*6236dae4SAndroid Build Coastguard Worker            $rem{$sym}=$a[2];
56*6236dae4SAndroid Build Coastguard Worker        }
57*6236dae4SAndroid Build Coastguard Worker    }
58*6236dae4SAndroid Build Coastguard Worker
59*6236dae4SAndroid Build Coastguard Worker}
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Workerclose(S);
62*6236dae4SAndroid Build Coastguard Worker
63*6236dae4SAndroid Build Coastguard Workersub age {
64*6236dae4SAndroid Build Coastguard Worker    my ($ver)=@_;
65*6236dae4SAndroid Build Coastguard Worker
66*6236dae4SAndroid Build Coastguard Worker    my @s=split(/\./, $ver);
67*6236dae4SAndroid Build Coastguard Worker    return $s[0]*10000+$s[1]*100+$s[2];
68*6236dae4SAndroid Build Coastguard Worker}
69*6236dae4SAndroid Build Coastguard Worker
70*6236dae4SAndroid Build Coastguard Workermy %used;
71*6236dae4SAndroid Build Coastguard Workeropen(C, "<$ARGV[0]") || die;
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Workerwhile(<C>) {
74*6236dae4SAndroid Build Coastguard Worker    if(/\W(CURL[_A-Z0-9v]+)\W/) {
75*6236dae4SAndroid Build Coastguard Worker        #print "$1\n";
76*6236dae4SAndroid Build Coastguard Worker        $used{$1}++;
77*6236dae4SAndroid Build Coastguard Worker    }
78*6236dae4SAndroid Build Coastguard Worker}
79*6236dae4SAndroid Build Coastguard Worker
80*6236dae4SAndroid Build Coastguard Workerclose(C);
81*6236dae4SAndroid Build Coastguard Worker
82*6236dae4SAndroid Build Coastguard Workersub sortversions {
83*6236dae4SAndroid Build Coastguard Worker    my $r = age($doc{$a}) <=> age($doc{$b});
84*6236dae4SAndroid Build Coastguard Worker    if(!$r) {
85*6236dae4SAndroid Build Coastguard Worker        $r = $a cmp $b;
86*6236dae4SAndroid Build Coastguard Worker    }
87*6236dae4SAndroid Build Coastguard Worker    return $r;
88*6236dae4SAndroid Build Coastguard Worker}
89*6236dae4SAndroid Build Coastguard Worker
90*6236dae4SAndroid Build Coastguard Workermy @recent = reverse sort sortversions keys %used;
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Worker# the most recent symbol
93*6236dae4SAndroid Build Coastguard Workermy $newsym = $recent[0];
94*6236dae4SAndroid Build Coastguard Worker# the most recent version
95*6236dae4SAndroid Build Coastguard Workermy $newver = $doc{$newsym};
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Workerprint "The scanned source uses these symbols introduced in $newver:\n";
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Workerfor my $w (@recent) {
100*6236dae4SAndroid Build Coastguard Worker    if($doc{$w} eq $newver) {
101*6236dae4SAndroid Build Coastguard Worker        printf "  $w\n";
102*6236dae4SAndroid Build Coastguard Worker        next;
103*6236dae4SAndroid Build Coastguard Worker    }
104*6236dae4SAndroid Build Coastguard Worker    last;
105*6236dae4SAndroid Build Coastguard Worker}
106