xref: /aosp_15_r20/external/curl/tests/getpart.pm (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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