xref: /aosp_15_r20/development/tools/findunused/findunusedtranslations (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/perl
2*90c8c64dSAndroid Build Coastguard Worker
3*90c8c64dSAndroid Build Coastguard Workersub usage {
4*90c8c64dSAndroid Build Coastguard Worker    print STDERR "Usage: findunusedtranslations values/strings.xml\n";
5*90c8c64dSAndroid Build Coastguard Worker    print STDERR "\n";
6*90c8c64dSAndroid Build Coastguard Worker    print STDERR "Will read values/strings.xml and rewrite\n";
7*90c8c64dSAndroid Build Coastguard Worker    print STDERR "values-xx/strings.xml and values-xx-rYY/strings.xml\n";
8*90c8c64dSAndroid Build Coastguard Worker    print STDERR "files to remove strings that no longer appear in the\n";
9*90c8c64dSAndroid Build Coastguard Worker    print STDERR "base strings file.\n";
10*90c8c64dSAndroid Build Coastguard Worker
11*90c8c64dSAndroid Build Coastguard Worker    exit 1;
12*90c8c64dSAndroid Build Coastguard Worker}
13*90c8c64dSAndroid Build Coastguard Worker
14*90c8c64dSAndroid Build Coastguard Workerif ($#ARGV != 0) {
15*90c8c64dSAndroid Build Coastguard Worker    usage();
16*90c8c64dSAndroid Build Coastguard Worker}
17*90c8c64dSAndroid Build Coastguard Worker
18*90c8c64dSAndroid Build Coastguard Workerunless ($ARGV[0] =~ /^(.*)\/values([^\/]*)\/(.*\.xml)/) {
19*90c8c64dSAndroid Build Coastguard Worker    print STDERR "Bad format for $ARGV[0]\n";
20*90c8c64dSAndroid Build Coastguard Worker    usage();
21*90c8c64dSAndroid Build Coastguard Worker}
22*90c8c64dSAndroid Build Coastguard Worker
23*90c8c64dSAndroid Build Coastguard Workerunless (-f $ARGV[0]) {
24*90c8c64dSAndroid Build Coastguard Worker    print STDERR "$0: $ARGV[0]: No such file\n";
25*90c8c64dSAndroid Build Coastguard Worker}
26*90c8c64dSAndroid Build Coastguard Worker
27*90c8c64dSAndroid Build Coastguard Worker$prefix = $1;
28*90c8c64dSAndroid Build Coastguard Worker$values = $2;
29*90c8c64dSAndroid Build Coastguard Worker$suffix = $3;
30*90c8c64dSAndroid Build Coastguard Worker
31*90c8c64dSAndroid Build Coastguard Workerif ($values =~ /^(-mcc[^-]*)*(-mnc[^-]*)*(.*)$/) {
32*90c8c64dSAndroid Build Coastguard Worker    $pattern1 = "$prefix/values$1$2-??$3/$suffix";
33*90c8c64dSAndroid Build Coastguard Worker    $pattern2 = "$prefix/values$1$2-??-r??$3/$suffix";
34*90c8c64dSAndroid Build Coastguard Worker} else {
35*90c8c64dSAndroid Build Coastguard Worker    $pattern1 = "$prefix/values-??$values/$suffix";
36*90c8c64dSAndroid Build Coastguard Worker    $pattern2 = "$prefix/values-??-r??$values/$suffix";
37*90c8c64dSAndroid Build Coastguard Worker}
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker@matches = (glob($pattern1), glob($pattern2));
40*90c8c64dSAndroid Build Coastguard Worker
41*90c8c64dSAndroid Build Coastguard Workeropen(IN, "<$ARGV[0]");
42*90c8c64dSAndroid Build Coastguard Workerwhile (<IN>) {
43*90c8c64dSAndroid Build Coastguard Worker    if (/<string [^>]*name="([^"]*)"/) {
44*90c8c64dSAndroid Build Coastguard Worker        $string{$1} = 1;
45*90c8c64dSAndroid Build Coastguard Worker    }
46*90c8c64dSAndroid Build Coastguard Worker    if (/<string-array [^>]*name="([^"]*)"/) {
47*90c8c64dSAndroid Build Coastguard Worker        $stringarray{$1} = 1;
48*90c8c64dSAndroid Build Coastguard Worker    }
49*90c8c64dSAndroid Build Coastguard Worker    if (/<plurals [^>]*name="([^"]*)"/) {
50*90c8c64dSAndroid Build Coastguard Worker        $plurals{$1} = 1;
51*90c8c64dSAndroid Build Coastguard Worker    }
52*90c8c64dSAndroid Build Coastguard Worker}
53*90c8c64dSAndroid Build Coastguard Workerclose(IN);
54*90c8c64dSAndroid Build Coastguard Worker
55*90c8c64dSAndroid Build Coastguard Workerfor $match (@matches) {
56*90c8c64dSAndroid Build Coastguard Worker    print "Rewriting $match\n";
57*90c8c64dSAndroid Build Coastguard Worker    $suppress = 0;
58*90c8c64dSAndroid Build Coastguard Worker    $text = "";
59*90c8c64dSAndroid Build Coastguard Worker    $changes = 0;
60*90c8c64dSAndroid Build Coastguard Worker
61*90c8c64dSAndroid Build Coastguard Worker    open(IN, "<$match");
62*90c8c64dSAndroid Build Coastguard Worker    while (<IN>) {
63*90c8c64dSAndroid Build Coastguard Worker        if (/<string [^>]*name="([^"]*)"/) {
64*90c8c64dSAndroid Build Coastguard Worker            if ($string{$1} == 0) {
65*90c8c64dSAndroid Build Coastguard Worker                $suppress = 1;
66*90c8c64dSAndroid Build Coastguard Worker                $changes = 1;
67*90c8c64dSAndroid Build Coastguard Worker            }
68*90c8c64dSAndroid Build Coastguard Worker        }
69*90c8c64dSAndroid Build Coastguard Worker        if (/<string-array [^>]*name="([^"]*)"/) {
70*90c8c64dSAndroid Build Coastguard Worker            if ($stringarray{$1} == 0) {
71*90c8c64dSAndroid Build Coastguard Worker                $suppress = 1;
72*90c8c64dSAndroid Build Coastguard Worker                $changes = 1;
73*90c8c64dSAndroid Build Coastguard Worker            }
74*90c8c64dSAndroid Build Coastguard Worker        }
75*90c8c64dSAndroid Build Coastguard Worker        if (/<plurals [^>]*name="([^"]*)"/) {
76*90c8c64dSAndroid Build Coastguard Worker            if ($plurals{$1} == 0) {
77*90c8c64dSAndroid Build Coastguard Worker                $suppress = 1;
78*90c8c64dSAndroid Build Coastguard Worker                $changes = 1;
79*90c8c64dSAndroid Build Coastguard Worker            }
80*90c8c64dSAndroid Build Coastguard Worker        }
81*90c8c64dSAndroid Build Coastguard Worker
82*90c8c64dSAndroid Build Coastguard Worker        $text .= $_ unless ($suppress);
83*90c8c64dSAndroid Build Coastguard Worker
84*90c8c64dSAndroid Build Coastguard Worker        if (/<\/string/) {
85*90c8c64dSAndroid Build Coastguard Worker            $suppress = 0;
86*90c8c64dSAndroid Build Coastguard Worker        }
87*90c8c64dSAndroid Build Coastguard Worker        if (/<\/string-array/) {
88*90c8c64dSAndroid Build Coastguard Worker            $suppress = 0;
89*90c8c64dSAndroid Build Coastguard Worker        }
90*90c8c64dSAndroid Build Coastguard Worker        if (/<\/plurals/) {
91*90c8c64dSAndroid Build Coastguard Worker            $suppress = 0;
92*90c8c64dSAndroid Build Coastguard Worker        }
93*90c8c64dSAndroid Build Coastguard Worker    }
94*90c8c64dSAndroid Build Coastguard Worker    close(IN);
95*90c8c64dSAndroid Build Coastguard Worker
96*90c8c64dSAndroid Build Coastguard Worker    if ($changes) {
97*90c8c64dSAndroid Build Coastguard Worker        open(OUT, ">$match");
98*90c8c64dSAndroid Build Coastguard Worker        print OUT $text;
99*90c8c64dSAndroid Build Coastguard Worker        close(OUT);
100*90c8c64dSAndroid Build Coastguard Worker    } else {
101*90c8c64dSAndroid Build Coastguard Worker        print "(no changes)\n";
102*90c8c64dSAndroid Build Coastguard Worker    }
103*90c8c64dSAndroid Build Coastguard Worker}
104