1#! /usr/bin/env perl 2# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. 3# 4# Licensed under the Apache License 2.0 (the "License"). You may not use 5# this file except in compliance with the License. You can obtain a copy 6# in the file LICENSE in the source distribution or at 7# https://www.openssl.org/source/license.html 8 9use strict; 10use OpenSSL::Test qw/:DEFAULT srctop_file/; 11 12setup("test_ordinals"); 13 14plan tests => 2; 15 16ok(testordinals(srctop_file("util", "libcrypto.num")), "Test libcrypto.num"); 17ok(testordinals(srctop_file("util", "libssl.num")), "Test libssl.num"); 18 19sub testordinals 20{ 21 my $filename = shift; 22 my $cnt = 0; 23 my $ret = 1; 24 my $qualifier = ""; 25 my $newqual; 26 my $lastfunc = ""; 27 28 open(my $fh, '<', $filename); 29 while (my $line = <$fh>) { 30 my @tokens = split(/(?:\s+|\s*:\s*)/, $line); 31 #Check the line looks sane 32 if ($#tokens < 5 || $#tokens > 6) { 33 print STDERR "Invalid line:\n$line\n"; 34 $ret = 0; 35 last; 36 } 37 if ($tokens[3] eq "NOEXIST") { 38 #Ignore this line 39 next; 40 } 41 #Some ordinals can be repeated, e.g. if one is VMS and another is !VMS 42 $newqual = $tokens[4]; 43 $newqual =~ s/!//g; 44 my $number = $tokens[1]; 45 $number = $cnt + 1 if $number eq '?'; 46 $number = $cnt if $number eq '?+'; 47 if ($cnt > $number 48 || ($cnt == $number && ($qualifier ne $newqual 49 || $qualifier eq ""))) { 50 print STDERR "Invalid ordinal detected: ".$tokens[1]."\n"; 51 $ret = 0; 52 last; 53 } 54 $cnt = $tokens[1]; 55 $qualifier = $newqual; 56 $lastfunc = $tokens[0]; 57 } 58 close($fh); 59 60 return $ret; 61} 62