my $n = shift;
my $trieref = shift;
my $identmap = shift;
+ my $concat_num = shift;
my $idt = " ";
my $indent0 = $idt x ($n + 3);
my $indent1 = $indent0 . $idt;
+ my $indent2 = $indent1 . $idt;
my $strcmp = $case_sensitive ? 'strcmp' : 'strcasecmp';
my $field;
my $suf = $trieref->{'suffix'};
$field = $identmap->{$trieref->{'name'}};
+ my $num = $concat_num->{$field};
printf "%sif (ossl_likely($strcmp(\"$suf\", s + $n) == 0", $indent0;
if (not $case_sensitive) {
$suf =~ tr/_/-/;
if ($suf ne $trieref->{'suffix'});
}
print ")) {\n";
- printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field;
- printf "%s return 0;\n", $indent1;
- printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field;
+ if (defined($num)) {
+ printf "%sif (ossl_unlikely(r->num_%s >= %s))\n", $indent1, $field, $num;
+ printf "%sreturn 0;\n", $indent2;
+ printf "%sr->%s[r->num_%s++] = (OSSL_PARAM *)p;\n", $indent1, $field, $field;
+ } else {
+ printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field;
+ printf "%sreturn 0;\n", $indent2;
+ printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field;
+ }
printf "%s}\n", $indent0;
return;
}
for my $l (sort keys %$trieref) {
if ($l eq 'val') {
$field = $identmap->{$trieref->{'val'}};
+ my $num = $concat_num->{$field};
printf "%sbreak;\n", $indent1;
printf "%scase '\\0':\n", $indent0;
- printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field;
- printf "%s return 0;\n", $indent1;
- printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field;
+ if (defined($num)) {
+ printf "%sif (ossl_unlikely(r->num_%s >= %s))\n", $indent1, $field, $num;
+ printf "%sreturn 0;\n", $indent2;
+ printf "%sr->%s[r->num_%s++] = (OSSL_PARAM *)p;\n", $indent1, $field, $field;
+ } else {
+ printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field;
+ printf "%sreturn 0;\n", $indent2;
+ printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field;
+ }
} else {
printf "%sbreak;\n", $indent1;
printf "%scase '%s':", $indent0, $l;
printf " case '%s':", uc $l if ($l =~ /[a-z]/);
}
print "\n";
- generate_decoder_from_trie($n + 1, $trieref->{$l}, $identmap);
+ generate_decoder_from_trie($n + 1, $trieref->{$l}, $identmap, $concat_num);
}
}
printf "%s}\n", $indent0;
my @params = @_;
my @keys = ();
my %prms = ();
+ my %concat_num = ();
print "/* Machine generated by util/perl/OpenSSL/paramnames.pm */\n";
# Output ettable param array
my $pname = $params[$i][0];
my $pident = $params[$i][1];
my $ptype = $params[$i][2];
+ my $pnum = $params[$i][3];
print " OSSL_PARAM_$ptype(OSSL_$pname, NULL";
print ", 0" if $ptype eq "octet_string" || $ptype eq "octet_ptr"
printf "),\n";
$prms{$pname} = $pident;
+ $concat_num{$pident} = $pnum if defined($pnum);
}
print " OSSL_PARAM_END\n};\n#endif\n\n";
printf "#ifndef %s_st\n", $decoder_name_base;
printf "struct %s_st {\n", $decoder_name_base;
foreach my $pident (sort values %prms) {
- printf " OSSL_PARAM *%s;\n", $pident;
+ if (defined($concat_num{$pident})) {
+ printf " OSSL_PARAM *%s[%s];\n", $pident, $concat_num{$pident};
+ printf " int num_%s;\n", $pident;
+ } else {
+ printf " OSSL_PARAM *%s;\n", $pident;
+ }
}
print "};\n#endif\n\n";
print " memset(r, 0, sizeof(*r));\n";
print " if (p != NULL)\n";
print " for (; (s = p->key) != NULL; p++)\n";
- generate_decoder_from_trie(0, \%t, \%prms);
+ generate_decoder_from_trie(0, \%t, \%prms, \%concat_num);
print " return 1;\n";
print "}\n#endif\n";
print "/* End of machine generated */";