1#!/usr/bin/env perl 2#*************************************************************************** 3# _ _ ____ _ 4# Project ___| | | | _ \| | 5# / __| | | | |_) | | 6# | (__| |_| | _ <| |___ 7# \___|\___/|_| \_\_____| 8# 9# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 10# 11# This software is licensed as described in the file COPYING, which 12# you should have received as part of this distribution. The terms 13# are also available at https://curl.se/docs/copyright.html. 14# 15# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16# copies of the Software, and permit persons to whom the Software is 17# furnished to do so, under the terms of the COPYING file. 18# 19# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20# KIND, either express or implied. 21# 22# SPDX-License-Identifier: curl 23# 24# 25########################################################################### 26# 27# Check the OS/400 translating wrapper properly handles all translatable 28# string options. 29 30use strict; 31use warnings; 32 33my $root=$ARGV[0] || "."; 34my $incdir = "$root/include/curl"; 35my $os400dir = "$root/packages/OS400"; 36my $errcount = 0; 37 38# Scan header file for string option definitions. 39sub scan_header { 40 my ($f)=@_; 41 my $line = ""; 42 my $incomment = 0; 43 my @stringopts; 44 45 open(my $h, "<", "$f"); 46 while(<$h>) { 47 s/^\s*(.*?)\s*$/$1/; # Trim. 48 # Remove multi-line comment trail. 49 if($incomment) { 50 if($_ !~ /.*?\*\/\s*(.*)$/) { 51 next; 52 } 53 $_ = $1; 54 $incomment = 0; 55 } 56 if($line ne "") { 57 # Unfold line. 58 $_ = "$line $1"; 59 $line = ""; 60 } 61 if($_ =~ /^(.*)\\$/) { 62 $line = "$1 "; 63 next; 64 } 65 # Remove comments. 66 while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) { 67 $_ = "$1 $2"; 68 } 69 if($_ =~ /^(.*)\/\*/) { 70 $_ = "$1 "; 71 $incomment = 1; 72 } 73 s/^\s*(.*?)\s*$/$1/; # Trim again. 74 # Ignore preprocessor directives and blank lines. 75 if($_ =~ /^(?:#|$)/) { 76 next; 77 } 78 # Handle lines that may be continued as if they were folded. 79 if($_ !~ /[;,{}]$/ || $_ =~ /[^)],$/) { 80 # Folded line. 81 $line = $_; 82 next; 83 } 84 # Keep string options only. 85 if($_ =~ /CURLOPT(?:DEPRECATED)?\s*\(\s*([^, \t]+)\s*,\s*CURLOPTTYPE_STRINGPOINT/) { 86 push(@stringopts, $1); 87 } 88 } 89 close $h; 90 return @stringopts; 91} 92 93# Scan packages/OS400/ccsidcurl.c for translatable string option cases. 94sub scan_wrapper_for_strings { 95 my ($f)=@_; 96 my $inarmor = 0; 97 my @stringopts; 98 99 open(my $h, "<", "$f"); 100 while(<$h>) { 101 if($_ =~ /(BEGIN|END) TRANSLATABLE STRING OPTIONS/) { 102 $inarmor = $1 eq "BEGIN"; 103 } 104 elsif($inarmor && $_ =~ /case\s+([^:]+):/) { 105 push(@stringopts, $1); 106 } 107 } 108 close $h; 109 return @stringopts; 110} 111 112# Get translatable string options from header file. 113my @stringdefs = scan_header("$incdir/curl.h"); 114 115# Get translated string options. 116my @stringrefs = scan_wrapper_for_strings("$os400dir/ccsidcurl.c"); 117 118# Lists should be equal: check differences. 119my %diff; 120@diff{@stringdefs} = 0..$#stringdefs; 121delete @diff{@stringrefs}; 122 123foreach(keys %diff) { 124 print "$_ is not translated\n"; 125 delete $diff{$_}; 126 $errcount++; 127} 128 129@diff{@stringrefs} = 0..$#stringrefs; 130delete @diff{@stringdefs}; 131 132foreach(keys %diff) { 133 print "translated option $_ does not exist\n"; 134 $errcount++; 135} 136 137# Check translated string option cases are sorted alphanumerically. 138foreach(my $i = 1; $i < $#stringrefs; $i++) { 139 if($stringrefs[$i] lt $stringrefs[$i - 1]) { 140 print("Translated string options are not sorted (" . $stringrefs[$i - 1] . 141 "/" . $stringrefs[$i] . ")\n"); 142 $errcount++; 143 last; 144 } 145} 146 147exit !!$errcount; 148