1*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 2*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 3*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 4*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 5*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 6*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 7*6236dae4SAndroid Build Coastguard Worker# 8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 9*6236dae4SAndroid Build Coastguard Worker# 10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 13*6236dae4SAndroid Build Coastguard Worker# 14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 17*6236dae4SAndroid Build Coastguard Worker# 18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 20*6236dae4SAndroid Build Coastguard Worker# 21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 22*6236dae4SAndroid Build Coastguard Worker# 23*6236dae4SAndroid Build Coastguard Worker########################################################################### 24*6236dae4SAndroid Build Coastguard Worker 25*6236dae4SAndroid Build Coastguard Workerpackage getpart; 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Workeruse strict; 28*6236dae4SAndroid Build Coastguard Workeruse warnings; 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard WorkerBEGIN { 31*6236dae4SAndroid Build Coastguard Worker use base qw(Exporter); 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker our @EXPORT = qw( 34*6236dae4SAndroid Build Coastguard Worker compareparts 35*6236dae4SAndroid Build Coastguard Worker fulltest 36*6236dae4SAndroid Build Coastguard Worker getpart 37*6236dae4SAndroid Build Coastguard Worker getpartattr 38*6236dae4SAndroid Build Coastguard Worker loadarray 39*6236dae4SAndroid Build Coastguard Worker loadtest 40*6236dae4SAndroid Build Coastguard Worker partexists 41*6236dae4SAndroid Build Coastguard Worker striparray 42*6236dae4SAndroid Build Coastguard Worker writearray 43*6236dae4SAndroid Build Coastguard Worker ); 44*6236dae4SAndroid Build Coastguard Worker} 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard Workeruse Memoize; 47*6236dae4SAndroid Build Coastguard Workeruse MIME::Base64; 48*6236dae4SAndroid Build Coastguard Worker 49*6236dae4SAndroid Build Coastguard Workermy @xml; # test data file contents 50*6236dae4SAndroid Build Coastguard Workermy $xmlfile; # test data file name 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Workermy $warning=0; 53*6236dae4SAndroid Build Coastguard Workermy $trace=0; 54*6236dae4SAndroid Build Coastguard Worker 55*6236dae4SAndroid Build Coastguard Worker# Normalize the part function arguments for proper caching. This includes the 56*6236dae4SAndroid Build Coastguard Worker# file name in the arguments since that is an implied parameter that affects the 57*6236dae4SAndroid Build Coastguard Worker# return value. Any error messages will only be displayed the first time, but 58*6236dae4SAndroid Build Coastguard Worker# those are disabled by default anyway, so should never been seen outside 59*6236dae4SAndroid Build Coastguard Worker# development. 60*6236dae4SAndroid Build Coastguard Workersub normalize_part { 61*6236dae4SAndroid Build Coastguard Worker push @_, $xmlfile; 62*6236dae4SAndroid Build Coastguard Worker return join("\t", @_); 63*6236dae4SAndroid Build Coastguard Worker} 64*6236dae4SAndroid Build Coastguard Worker 65*6236dae4SAndroid Build Coastguard Workersub decode_hex { 66*6236dae4SAndroid Build Coastguard Worker my $s = $_; 67*6236dae4SAndroid Build Coastguard Worker # remove everything not hex 68*6236dae4SAndroid Build Coastguard Worker $s =~ s/[^A-Fa-f0-9]//g; 69*6236dae4SAndroid Build Coastguard Worker # encode everything 70*6236dae4SAndroid Build Coastguard Worker $s =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg; 71*6236dae4SAndroid Build Coastguard Worker return $s; 72*6236dae4SAndroid Build Coastguard Worker} 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard Workersub testcaseattr { 75*6236dae4SAndroid Build Coastguard Worker my %hash; 76*6236dae4SAndroid Build Coastguard Worker for(@xml) { 77*6236dae4SAndroid Build Coastguard Worker if(($_ =~ /^ *\<testcase ([^>]*)/)) { 78*6236dae4SAndroid Build Coastguard Worker my $attr=$1; 79*6236dae4SAndroid Build Coastguard Worker while($attr =~ s/ *([^=]*)= *(\"([^\"]*)\"|([^\> ]*))//) { 80*6236dae4SAndroid Build Coastguard Worker my ($var, $cont)=($1, $2); 81*6236dae4SAndroid Build Coastguard Worker $cont =~ s/^\"(.*)\"$/$1/; 82*6236dae4SAndroid Build Coastguard Worker $hash{$var}=$cont; 83*6236dae4SAndroid Build Coastguard Worker } 84*6236dae4SAndroid Build Coastguard Worker } 85*6236dae4SAndroid Build Coastguard Worker } 86*6236dae4SAndroid Build Coastguard Worker return %hash; 87*6236dae4SAndroid Build Coastguard Worker} 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard Workersub getpartattr { 90*6236dae4SAndroid Build Coastguard Worker # if $part is undefined (ie only one argument) then 91*6236dae4SAndroid Build Coastguard Worker # return the attributes of the section 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard Worker my ($section, $part)=@_; 94*6236dae4SAndroid Build Coastguard Worker 95*6236dae4SAndroid Build Coastguard Worker my %hash; 96*6236dae4SAndroid Build Coastguard Worker my $inside=0; 97*6236dae4SAndroid Build Coastguard Worker 98*6236dae4SAndroid Build Coastguard Worker # print "Section: $section, part: $part\n"; 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard Worker for(@xml) { 101*6236dae4SAndroid Build Coastguard Worker # print "$inside: $_"; 102*6236dae4SAndroid Build Coastguard Worker if(!$inside && ($_ =~ /^ *\<$section/)) { 103*6236dae4SAndroid Build Coastguard Worker $inside++; 104*6236dae4SAndroid Build Coastguard Worker } 105*6236dae4SAndroid Build Coastguard Worker if((1 ==$inside) && ( ($_ =~ /^ *\<$part ([^>]*)/) || 106*6236dae4SAndroid Build Coastguard Worker !(defined($part)) ) 107*6236dae4SAndroid Build Coastguard Worker ) { 108*6236dae4SAndroid Build Coastguard Worker $inside++; 109*6236dae4SAndroid Build Coastguard Worker my $attr=$1; 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker while($attr =~ s/ *([^=]*)= *(\"([^\"]*)\"|([^\> ]*))//) { 112*6236dae4SAndroid Build Coastguard Worker my ($var, $cont)=($1, $2); 113*6236dae4SAndroid Build Coastguard Worker $cont =~ s/^\"(.*)\"$/$1/; 114*6236dae4SAndroid Build Coastguard Worker $hash{$var}=$cont; 115*6236dae4SAndroid Build Coastguard Worker } 116*6236dae4SAndroid Build Coastguard Worker last; 117*6236dae4SAndroid Build Coastguard Worker } 118*6236dae4SAndroid Build Coastguard Worker # detect end of section when part wasn't found 119*6236dae4SAndroid Build Coastguard Worker elsif((1 ==$inside) && ($_ =~ /^ *\<\/$section\>/)) { 120*6236dae4SAndroid Build Coastguard Worker last; 121*6236dae4SAndroid Build Coastguard Worker } 122*6236dae4SAndroid Build Coastguard Worker elsif((2 ==$inside) && ($_ =~ /^ *\<\/$part/)) { 123*6236dae4SAndroid Build Coastguard Worker $inside--; 124*6236dae4SAndroid Build Coastguard Worker } 125*6236dae4SAndroid Build Coastguard Worker } 126*6236dae4SAndroid Build Coastguard Worker return %hash; 127*6236dae4SAndroid Build Coastguard Worker} 128*6236dae4SAndroid Build Coastguard Workermemoize('getpartattr', NORMALIZER => 'normalize_part'); # cache each result 129*6236dae4SAndroid Build Coastguard Worker 130*6236dae4SAndroid Build Coastguard Workersub getpart { 131*6236dae4SAndroid Build Coastguard Worker my ($section, $part)=@_; 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard Worker my @this; 134*6236dae4SAndroid Build Coastguard Worker my $inside=0; 135*6236dae4SAndroid Build Coastguard Worker my $base64=0; 136*6236dae4SAndroid Build Coastguard Worker my $hex=0; 137*6236dae4SAndroid Build Coastguard Worker my $line; 138*6236dae4SAndroid Build Coastguard Worker 139*6236dae4SAndroid Build Coastguard Worker for(@xml) { 140*6236dae4SAndroid Build Coastguard Worker $line++; 141*6236dae4SAndroid Build Coastguard Worker if(!$inside && ($_ =~ /^ *\<$section/)) { 142*6236dae4SAndroid Build Coastguard Worker $inside++; 143*6236dae4SAndroid Build Coastguard Worker } 144*6236dae4SAndroid Build Coastguard Worker elsif(($inside >= 1) && ($_ =~ /^ *\<$part[ \>]/)) { 145*6236dae4SAndroid Build Coastguard Worker if($inside > 1) { 146*6236dae4SAndroid Build Coastguard Worker push @this, $_; 147*6236dae4SAndroid Build Coastguard Worker } 148*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /$part [^>]*base64=/) { 149*6236dae4SAndroid Build Coastguard Worker # attempt to detect our base64 encoded part 150*6236dae4SAndroid Build Coastguard Worker $base64=1; 151*6236dae4SAndroid Build Coastguard Worker } 152*6236dae4SAndroid Build Coastguard Worker elsif($_ =~ /$part [^>]*hex=/) { 153*6236dae4SAndroid Build Coastguard Worker # attempt to detect a hex-encoded part 154*6236dae4SAndroid Build Coastguard Worker $hex=1; 155*6236dae4SAndroid Build Coastguard Worker } 156*6236dae4SAndroid Build Coastguard Worker $inside++; 157*6236dae4SAndroid Build Coastguard Worker } 158*6236dae4SAndroid Build Coastguard Worker elsif(($inside >= 2) && ($_ =~ /^ *\<\/$part[ \>]/)) { 159*6236dae4SAndroid Build Coastguard Worker if($inside > 2) { 160*6236dae4SAndroid Build Coastguard Worker push @this, $_; 161*6236dae4SAndroid Build Coastguard Worker } 162*6236dae4SAndroid Build Coastguard Worker $inside--; 163*6236dae4SAndroid Build Coastguard Worker } 164*6236dae4SAndroid Build Coastguard Worker elsif(($inside >= 1) && ($_ =~ /^ *\<\/$section/)) { 165*6236dae4SAndroid Build Coastguard Worker if($inside > 1) { 166*6236dae4SAndroid Build Coastguard Worker print STDERR "$xmlfile:$line:1: error: missing </$part> tag before </$section>\n"; 167*6236dae4SAndroid Build Coastguard Worker @this = ("format error in $xmlfile"); 168*6236dae4SAndroid Build Coastguard Worker } 169*6236dae4SAndroid Build Coastguard Worker if($trace && @this) { 170*6236dae4SAndroid Build Coastguard Worker print STDERR "*** getpart.pm: $section/$part returned data!\n"; 171*6236dae4SAndroid Build Coastguard Worker } 172*6236dae4SAndroid Build Coastguard Worker if($warning && !@this) { 173*6236dae4SAndroid Build Coastguard Worker print STDERR "*** getpart.pm: $section/$part returned empty!\n"; 174*6236dae4SAndroid Build Coastguard Worker } 175*6236dae4SAndroid Build Coastguard Worker if($base64) { 176*6236dae4SAndroid Build Coastguard Worker # decode the whole array before returning it! 177*6236dae4SAndroid Build Coastguard Worker for(@this) { 178*6236dae4SAndroid Build Coastguard Worker my $decoded = decode_base64($_); 179*6236dae4SAndroid Build Coastguard Worker $_ = $decoded; 180*6236dae4SAndroid Build Coastguard Worker } 181*6236dae4SAndroid Build Coastguard Worker } 182*6236dae4SAndroid Build Coastguard Worker elsif($hex) { 183*6236dae4SAndroid Build Coastguard Worker # decode the whole array before returning it! 184*6236dae4SAndroid Build Coastguard Worker for(@this) { 185*6236dae4SAndroid Build Coastguard Worker my $decoded = decode_hex($_); 186*6236dae4SAndroid Build Coastguard Worker $_ = $decoded; 187*6236dae4SAndroid Build Coastguard Worker } 188*6236dae4SAndroid Build Coastguard Worker } 189*6236dae4SAndroid Build Coastguard Worker return @this; 190*6236dae4SAndroid Build Coastguard Worker } 191*6236dae4SAndroid Build Coastguard Worker elsif($inside >= 2) { 192*6236dae4SAndroid Build Coastguard Worker push @this, $_; 193*6236dae4SAndroid Build Coastguard Worker } 194*6236dae4SAndroid Build Coastguard Worker } 195*6236dae4SAndroid Build Coastguard Worker if($trace && @this) { 196*6236dae4SAndroid Build Coastguard Worker # section/part has data but end of section not detected, 197*6236dae4SAndroid Build Coastguard Worker # end of file implies end of section. 198*6236dae4SAndroid Build Coastguard Worker print STDERR "*** getpart.pm: $section/$part returned data!\n"; 199*6236dae4SAndroid Build Coastguard Worker } 200*6236dae4SAndroid Build Coastguard Worker if($warning && !@this) { 201*6236dae4SAndroid Build Coastguard Worker # section/part does not exist or has no data without an end of 202*6236dae4SAndroid Build Coastguard Worker # section; end of file implies end of section. 203*6236dae4SAndroid Build Coastguard Worker print STDERR "*** getpart.pm: $section/$part returned empty!\n"; 204*6236dae4SAndroid Build Coastguard Worker } 205*6236dae4SAndroid Build Coastguard Worker return @this; 206*6236dae4SAndroid Build Coastguard Worker} 207*6236dae4SAndroid Build Coastguard Workermemoize('getpart', NORMALIZER => 'normalize_part'); # cache each result 208*6236dae4SAndroid Build Coastguard Worker 209*6236dae4SAndroid Build Coastguard Workersub partexists { 210*6236dae4SAndroid Build Coastguard Worker my ($section, $part)=@_; 211*6236dae4SAndroid Build Coastguard Worker 212*6236dae4SAndroid Build Coastguard Worker my $inside = 0; 213*6236dae4SAndroid Build Coastguard Worker 214*6236dae4SAndroid Build Coastguard Worker for(@xml) { 215*6236dae4SAndroid Build Coastguard Worker if(!$inside && ($_ =~ /^ *\<$section/)) { 216*6236dae4SAndroid Build Coastguard Worker $inside++; 217*6236dae4SAndroid Build Coastguard Worker } 218*6236dae4SAndroid Build Coastguard Worker elsif((1 == $inside) && ($_ =~ /^ *\<$part[ \>]/)) { 219*6236dae4SAndroid Build Coastguard Worker return 1; # exists 220*6236dae4SAndroid Build Coastguard Worker } 221*6236dae4SAndroid Build Coastguard Worker elsif((1 == $inside) && ($_ =~ /^ *\<\/$section/)) { 222*6236dae4SAndroid Build Coastguard Worker return 0; # does not exist 223*6236dae4SAndroid Build Coastguard Worker } 224*6236dae4SAndroid Build Coastguard Worker } 225*6236dae4SAndroid Build Coastguard Worker return 0; # does not exist 226*6236dae4SAndroid Build Coastguard Worker} 227*6236dae4SAndroid Build Coastguard Worker# The code currently never calls this more than once per part per file, so 228*6236dae4SAndroid Build Coastguard Worker# caching a result that will never be used again just slows things down. 229*6236dae4SAndroid Build Coastguard Worker# memoize('partexists', NORMALIZER => 'normalize_part'); # cache each result 230*6236dae4SAndroid Build Coastguard Worker 231*6236dae4SAndroid Build Coastguard Workersub loadtest { 232*6236dae4SAndroid Build Coastguard Worker my ($file)=@_; 233*6236dae4SAndroid Build Coastguard Worker 234*6236dae4SAndroid Build Coastguard Worker if(defined $xmlfile && $file eq $xmlfile) { 235*6236dae4SAndroid Build Coastguard Worker # This test is already loaded 236*6236dae4SAndroid Build Coastguard Worker return 237*6236dae4SAndroid Build Coastguard Worker } 238*6236dae4SAndroid Build Coastguard Worker 239*6236dae4SAndroid Build Coastguard Worker undef @xml; 240*6236dae4SAndroid Build Coastguard Worker $xmlfile = ""; 241*6236dae4SAndroid Build Coastguard Worker 242*6236dae4SAndroid Build Coastguard Worker if(open(my $xmlh, "<", "$file")) { 243*6236dae4SAndroid Build Coastguard Worker binmode $xmlh; # for crapage systems, use binary 244*6236dae4SAndroid Build Coastguard Worker while(<$xmlh>) { 245*6236dae4SAndroid Build Coastguard Worker push @xml, $_; 246*6236dae4SAndroid Build Coastguard Worker } 247*6236dae4SAndroid Build Coastguard Worker close($xmlh); 248*6236dae4SAndroid Build Coastguard Worker } 249*6236dae4SAndroid Build Coastguard Worker else { 250*6236dae4SAndroid Build Coastguard Worker # failure 251*6236dae4SAndroid Build Coastguard Worker if($warning) { 252*6236dae4SAndroid Build Coastguard Worker print STDERR "file $file wouldn't open!\n"; 253*6236dae4SAndroid Build Coastguard Worker } 254*6236dae4SAndroid Build Coastguard Worker return 1; 255*6236dae4SAndroid Build Coastguard Worker } 256*6236dae4SAndroid Build Coastguard Worker $xmlfile = $file; 257*6236dae4SAndroid Build Coastguard Worker return 0; 258*6236dae4SAndroid Build Coastguard Worker} 259*6236dae4SAndroid Build Coastguard Worker 260*6236dae4SAndroid Build Coastguard Worker 261*6236dae4SAndroid Build Coastguard Worker# Return entire document as list of lines 262*6236dae4SAndroid Build Coastguard Workersub fulltest { 263*6236dae4SAndroid Build Coastguard Worker return @xml; 264*6236dae4SAndroid Build Coastguard Worker} 265*6236dae4SAndroid Build Coastguard Worker 266*6236dae4SAndroid Build Coastguard Worker# write the test to the given file 267*6236dae4SAndroid Build Coastguard Workersub savetest { 268*6236dae4SAndroid Build Coastguard Worker my ($file)=@_; 269*6236dae4SAndroid Build Coastguard Worker 270*6236dae4SAndroid Build Coastguard Worker if(open(my $xmlh, ">", "$file")) { 271*6236dae4SAndroid Build Coastguard Worker binmode $xmlh; # for crapage systems, use binary 272*6236dae4SAndroid Build Coastguard Worker for(@xml) { 273*6236dae4SAndroid Build Coastguard Worker print $xmlh $_; 274*6236dae4SAndroid Build Coastguard Worker } 275*6236dae4SAndroid Build Coastguard Worker close($xmlh); 276*6236dae4SAndroid Build Coastguard Worker } 277*6236dae4SAndroid Build Coastguard Worker else { 278*6236dae4SAndroid Build Coastguard Worker # failure 279*6236dae4SAndroid Build Coastguard Worker if($warning) { 280*6236dae4SAndroid Build Coastguard Worker print STDERR "file $file wouldn't open!\n"; 281*6236dae4SAndroid Build Coastguard Worker } 282*6236dae4SAndroid Build Coastguard Worker return 1; 283*6236dae4SAndroid Build Coastguard Worker } 284*6236dae4SAndroid Build Coastguard Worker return 0; 285*6236dae4SAndroid Build Coastguard Worker} 286*6236dae4SAndroid Build Coastguard Worker 287*6236dae4SAndroid Build Coastguard Worker# 288*6236dae4SAndroid Build Coastguard Worker# Strip off all lines that match the specified pattern and return 289*6236dae4SAndroid Build Coastguard Worker# the new array. 290*6236dae4SAndroid Build Coastguard Worker# 291*6236dae4SAndroid Build Coastguard Worker 292*6236dae4SAndroid Build Coastguard Workersub striparray { 293*6236dae4SAndroid Build Coastguard Worker my ($pattern, $arrayref) = @_; 294*6236dae4SAndroid Build Coastguard Worker 295*6236dae4SAndroid Build Coastguard Worker my @array; 296*6236dae4SAndroid Build Coastguard Worker 297*6236dae4SAndroid Build Coastguard Worker for(@$arrayref) { 298*6236dae4SAndroid Build Coastguard Worker if($_ !~ /$pattern/) { 299*6236dae4SAndroid Build Coastguard Worker push @array, $_; 300*6236dae4SAndroid Build Coastguard Worker } 301*6236dae4SAndroid Build Coastguard Worker } 302*6236dae4SAndroid Build Coastguard Worker return @array; 303*6236dae4SAndroid Build Coastguard Worker} 304*6236dae4SAndroid Build Coastguard Worker 305*6236dae4SAndroid Build Coastguard Worker# 306*6236dae4SAndroid Build Coastguard Worker# pass array *REFERENCES* ! 307*6236dae4SAndroid Build Coastguard Worker# 308*6236dae4SAndroid Build Coastguard Workersub compareparts { 309*6236dae4SAndroid Build Coastguard Worker my ($firstref, $secondref)=@_; 310*6236dae4SAndroid Build Coastguard Worker 311*6236dae4SAndroid Build Coastguard Worker my $first = join("", @$firstref); 312*6236dae4SAndroid Build Coastguard Worker my $second = join("", @$secondref); 313*6236dae4SAndroid Build Coastguard Worker 314*6236dae4SAndroid Build Coastguard Worker # we cannot compare arrays index per index since with the base64 chunks, 315*6236dae4SAndroid Build Coastguard Worker # they may not be "evenly" distributed 316*6236dae4SAndroid Build Coastguard Worker 317*6236dae4SAndroid Build Coastguard Worker # NOTE: this no longer strips off carriage returns from the arrays. Is that 318*6236dae4SAndroid Build Coastguard Worker # really necessary? It ruins the testing of newlines. I believe it was once 319*6236dae4SAndroid Build Coastguard Worker # added to enable tests on Windows. 320*6236dae4SAndroid Build Coastguard Worker 321*6236dae4SAndroid Build Coastguard Worker if($first ne $second) { 322*6236dae4SAndroid Build Coastguard Worker return 1; 323*6236dae4SAndroid Build Coastguard Worker } 324*6236dae4SAndroid Build Coastguard Worker 325*6236dae4SAndroid Build Coastguard Worker return 0; 326*6236dae4SAndroid Build Coastguard Worker} 327*6236dae4SAndroid Build Coastguard Worker 328*6236dae4SAndroid Build Coastguard Worker# 329*6236dae4SAndroid Build Coastguard Worker# Write a given array to the specified file 330*6236dae4SAndroid Build Coastguard Worker# 331*6236dae4SAndroid Build Coastguard Workersub writearray { 332*6236dae4SAndroid Build Coastguard Worker my ($filename, $arrayref)=@_; 333*6236dae4SAndroid Build Coastguard Worker 334*6236dae4SAndroid Build Coastguard Worker open(my $temp, ">", "$filename") || die "Failure writing file"; 335*6236dae4SAndroid Build Coastguard Worker binmode($temp,":raw"); # Cygwin fix by Kevin Roth 336*6236dae4SAndroid Build Coastguard Worker for(@$arrayref) { 337*6236dae4SAndroid Build Coastguard Worker print $temp $_; 338*6236dae4SAndroid Build Coastguard Worker } 339*6236dae4SAndroid Build Coastguard Worker close($temp) || die "Failure writing file"; 340*6236dae4SAndroid Build Coastguard Worker} 341*6236dae4SAndroid Build Coastguard Worker 342*6236dae4SAndroid Build Coastguard Worker# 343*6236dae4SAndroid Build Coastguard Worker# Load a specified file and return it as an array 344*6236dae4SAndroid Build Coastguard Worker# 345*6236dae4SAndroid Build Coastguard Workersub loadarray { 346*6236dae4SAndroid Build Coastguard Worker my ($filename)=@_; 347*6236dae4SAndroid Build Coastguard Worker my @array; 348*6236dae4SAndroid Build Coastguard Worker 349*6236dae4SAndroid Build Coastguard Worker if (open(my $temp, "<", "$filename")) { 350*6236dae4SAndroid Build Coastguard Worker while(<$temp>) { 351*6236dae4SAndroid Build Coastguard Worker push @array, $_; 352*6236dae4SAndroid Build Coastguard Worker } 353*6236dae4SAndroid Build Coastguard Worker close($temp); 354*6236dae4SAndroid Build Coastguard Worker } 355*6236dae4SAndroid Build Coastguard Worker return @array; 356*6236dae4SAndroid Build Coastguard Worker} 357*6236dae4SAndroid Build Coastguard Worker 358*6236dae4SAndroid Build Coastguard Worker 359*6236dae4SAndroid Build Coastguard Worker1; 360