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