params: update generation script to support multiple TRIE output

Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27392)
This commit is contained in:
Pauli 2025-04-16 17:12:59 +10:00 committed by Tomas Mraz
parent b747a48bb1
commit 7a10ecd405
1 changed files with 30 additions and 24 deletions

View File

@ -676,32 +676,37 @@ sub generate_internal_macros {
}
sub generate_trie {
my @keys = @_;
my %trie;
my $nodes = 0;
my $chars = 0;
foreach my $name (sort keys %params) {
foreach my $name (sort @keys) {
my $val = $params{$name};
if (substr($val, 0, 1) ne '*') {
my $cursor = \%trie;
$chars += length($val);
for my $i (0 .. length($val) - 1) {
my $c = substr($val, $i, 1);
if (not $case_sensitive) {
$c = '_' if $c eq '-';
$c = lc $c;
}
if (not defined $$cursor{$c}) {
$cursor->{$c} = {};
$nodes++;
}
$cursor = $cursor->{$c};
}
$cursor->{'val'} = $name;
die("Unknown parameter name '$name'\n") if !defined $val;
while (substr($val, 0, 1) eq '*') {
$val = $params{substr($val, 1)};
die("Unknown referenced parameter from '$name'\n")
if !defined $val;
}
my $cursor = \%trie;
$chars += length($val);
for my $i (0 .. length($val) - 1) {
my $c = substr($val, $i, 1);
if (not $case_sensitive) {
$c = '_' if $c eq '-';
$c = lc $c;
}
if (not defined $$cursor{$c}) {
$cursor->{$c} = {};
$nodes++;
}
$cursor = $cursor->{$c};
}
$cursor->{'val'} = $name;
}
#print "\n\n/* $nodes nodes for $chars letters*/\n\n";
return %trie;
@ -715,8 +720,6 @@ sub generate_code_from_trie {
my $indent1 = $indent0 . $idt;
my $strcmp = $case_sensitive ? 'strcmp' : 'strcasecmp';
print "int ossl_param_find_pidx(const char *s)\n{\n" if $n == 0;
if ($trieref->{'suffix'}) {
my $suf = $trieref->{'suffix'};
@ -750,7 +753,6 @@ sub generate_code_from_trie {
}
}
printf "%s}\n", $indent0;
print " return -1;\n}\n" if $n == 0;
return "";
}
@ -781,12 +783,16 @@ sub locate_long_endings {
}
sub produce_decoder {
my %t = generate_trie();
my $func_name = shift;
my @keys = @_;
my %t = generate_trie(@keys);
my $s;
locate_long_endings(\%t);
open local *STDOUT, '>', \$s;
printf "int %s(const char *s)\n{\n", $func_name;
generate_code_from_trie(0, \%t);
print " return -1;\n}\n";
return $s;
}