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 the OS/400 translating wrapper properly handles all translatable 28*6236dae4SAndroid Build Coastguard Worker# string options. 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 Workermy $root=$ARGV[0] || "."; 34*6236dae4SAndroid Build Coastguard Workermy $incdir = "$root/include/curl"; 35*6236dae4SAndroid Build Coastguard Workermy $os400dir = "$root/packages/OS400"; 36*6236dae4SAndroid Build Coastguard Workermy $errcount = 0; 37*6236dae4SAndroid Build Coastguard Worker 38*6236dae4SAndroid Build Coastguard Worker# Scan header file for string option definitions. 39*6236dae4SAndroid Build Coastguard Workersub scan_header { 40*6236dae4SAndroid Build Coastguard Worker my ($f)=@_; 41*6236dae4SAndroid Build Coastguard Worker my $line = ""; 42*6236dae4SAndroid Build Coastguard Worker my $incomment = 0; 43*6236dae4SAndroid Build Coastguard Worker my @stringopts; 44*6236dae4SAndroid Build Coastguard Worker 45*6236dae4SAndroid Build Coastguard Worker open(my $h, "<", "$f"); 46*6236dae4SAndroid Build Coastguard Worker while(<$h>) { 47*6236dae4SAndroid Build Coastguard Worker s/^\s*(.*?)\s*$/$1/; # Trim. 48*6236dae4SAndroid Build Coastguard Worker # Remove multi-line comment trail. 49*6236dae4SAndroid Build Coastguard Worker if($incomment) { 50*6236dae4SAndroid Build Coastguard Worker if($_ !~ /.*?\*\/\s*(.*)$/) { 51*6236dae4SAndroid Build Coastguard Worker next; 52*6236dae4SAndroid Build Coastguard Worker } 53*6236dae4SAndroid Build Coastguard Worker $_ = $1; 54*6236dae4SAndroid Build Coastguard Worker $incomment = 0; 55*6236dae4SAndroid Build Coastguard Worker } 56*6236dae4SAndroid Build Coastguard Worker if($line ne "") { 57*6236dae4SAndroid Build Coastguard Worker # Unfold line. 58*6236dae4SAndroid Build Coastguard Worker $_ = "$line $1"; 59*6236dae4SAndroid Build Coastguard Worker $line = ""; 60*6236dae4SAndroid Build Coastguard Worker } 61*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^(.*)\\$/) { 62*6236dae4SAndroid Build Coastguard Worker $line = "$1 "; 63*6236dae4SAndroid Build Coastguard Worker next; 64*6236dae4SAndroid Build Coastguard Worker } 65*6236dae4SAndroid Build Coastguard Worker # Remove comments. 66*6236dae4SAndroid Build Coastguard Worker while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) { 67*6236dae4SAndroid Build Coastguard Worker $_ = "$1 $2"; 68*6236dae4SAndroid Build Coastguard Worker } 69*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^(.*)\/\*/) { 70*6236dae4SAndroid Build Coastguard Worker $_ = "$1 "; 71*6236dae4SAndroid Build Coastguard Worker $incomment = 1; 72*6236dae4SAndroid Build Coastguard Worker } 73*6236dae4SAndroid Build Coastguard Worker s/^\s*(.*?)\s*$/$1/; # Trim again. 74*6236dae4SAndroid Build Coastguard Worker # Ignore preprocessor directives and blank lines. 75*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^(?:#|$)/) { 76*6236dae4SAndroid Build Coastguard Worker next; 77*6236dae4SAndroid Build Coastguard Worker } 78*6236dae4SAndroid Build Coastguard Worker # Handle lines that may be continued as if they were folded. 79*6236dae4SAndroid Build Coastguard Worker if($_ !~ /[;,{}]$/ || $_ =~ /[^)],$/) { 80*6236dae4SAndroid Build Coastguard Worker # Folded line. 81*6236dae4SAndroid Build Coastguard Worker $line = $_; 82*6236dae4SAndroid Build Coastguard Worker next; 83*6236dae4SAndroid Build Coastguard Worker } 84*6236dae4SAndroid Build Coastguard Worker # Keep string options only. 85*6236dae4SAndroid Build Coastguard Worker if($_ =~ /CURLOPT(?:DEPRECATED)?\s*\(\s*([^, \t]+)\s*,\s*CURLOPTTYPE_STRINGPOINT/) { 86*6236dae4SAndroid Build Coastguard Worker push(@stringopts, $1); 87*6236dae4SAndroid Build Coastguard Worker } 88*6236dae4SAndroid Build Coastguard Worker } 89*6236dae4SAndroid Build Coastguard Worker close $h; 90*6236dae4SAndroid Build Coastguard Worker return @stringopts; 91*6236dae4SAndroid Build Coastguard Worker} 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard Worker# Scan packages/OS400/ccsidcurl.c for translatable string option cases. 94*6236dae4SAndroid Build Coastguard Workersub scan_wrapper_for_strings { 95*6236dae4SAndroid Build Coastguard Worker my ($f)=@_; 96*6236dae4SAndroid Build Coastguard Worker my $inarmor = 0; 97*6236dae4SAndroid Build Coastguard Worker my @stringopts; 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker open(my $h, "<", "$f"); 100*6236dae4SAndroid Build Coastguard Worker while(<$h>) { 101*6236dae4SAndroid Build Coastguard Worker if($_ =~ /(BEGIN|END) TRANSLATABLE STRING OPTIONS/) { 102*6236dae4SAndroid Build Coastguard Worker $inarmor = $1 eq "BEGIN"; 103*6236dae4SAndroid Build Coastguard Worker } 104*6236dae4SAndroid Build Coastguard Worker elsif($inarmor && $_ =~ /case\s+([^:]+):/) { 105*6236dae4SAndroid Build Coastguard Worker push(@stringopts, $1); 106*6236dae4SAndroid Build Coastguard Worker } 107*6236dae4SAndroid Build Coastguard Worker } 108*6236dae4SAndroid Build Coastguard Worker close $h; 109*6236dae4SAndroid Build Coastguard Worker return @stringopts; 110*6236dae4SAndroid Build Coastguard Worker} 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Worker# Get translatable string options from header file. 113*6236dae4SAndroid Build Coastguard Workermy @stringdefs = scan_header("$incdir/curl.h"); 114*6236dae4SAndroid Build Coastguard Worker 115*6236dae4SAndroid Build Coastguard Worker# Get translated string options. 116*6236dae4SAndroid Build Coastguard Workermy @stringrefs = scan_wrapper_for_strings("$os400dir/ccsidcurl.c"); 117*6236dae4SAndroid Build Coastguard Worker 118*6236dae4SAndroid Build Coastguard Worker# Lists should be equal: check differences. 119*6236dae4SAndroid Build Coastguard Workermy %diff; 120*6236dae4SAndroid Build Coastguard Worker@diff{@stringdefs} = 0..$#stringdefs; 121*6236dae4SAndroid Build Coastguard Workerdelete @diff{@stringrefs}; 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard Workerforeach(keys %diff) { 124*6236dae4SAndroid Build Coastguard Worker print "$_ is not translated\n"; 125*6236dae4SAndroid Build Coastguard Worker delete $diff{$_}; 126*6236dae4SAndroid Build Coastguard Worker $errcount++; 127*6236dae4SAndroid Build Coastguard Worker} 128*6236dae4SAndroid Build Coastguard Worker 129*6236dae4SAndroid Build Coastguard Worker@diff{@stringrefs} = 0..$#stringrefs; 130*6236dae4SAndroid Build Coastguard Workerdelete @diff{@stringdefs}; 131*6236dae4SAndroid Build Coastguard Worker 132*6236dae4SAndroid Build Coastguard Workerforeach(keys %diff) { 133*6236dae4SAndroid Build Coastguard Worker print "translated option $_ does not exist\n"; 134*6236dae4SAndroid Build Coastguard Worker $errcount++; 135*6236dae4SAndroid Build Coastguard Worker} 136*6236dae4SAndroid Build Coastguard Worker 137*6236dae4SAndroid Build Coastguard Worker# Check translated string option cases are sorted alphanumerically. 138*6236dae4SAndroid Build Coastguard Workerforeach(my $i = 1; $i < $#stringrefs; $i++) { 139*6236dae4SAndroid Build Coastguard Worker if($stringrefs[$i] lt $stringrefs[$i - 1]) { 140*6236dae4SAndroid Build Coastguard Worker print("Translated string options are not sorted (" . $stringrefs[$i - 1] . 141*6236dae4SAndroid Build Coastguard Worker "/" . $stringrefs[$i] . ")\n"); 142*6236dae4SAndroid Build Coastguard Worker $errcount++; 143*6236dae4SAndroid Build Coastguard Worker last; 144*6236dae4SAndroid Build Coastguard Worker } 145*6236dae4SAndroid Build Coastguard Worker} 146*6236dae4SAndroid Build Coastguard Worker 147*6236dae4SAndroid Build Coastguard Workerexit !!$errcount; 148