97 lines
3.0 KiB
Perl
Executable File
97 lines
3.0 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
use strict;
|
|
use Getopt::Std;
|
|
|
|
our ($opt_V, $opt_v);
|
|
|
|
# default to 3GPP
|
|
my ($vendor) = 10415;
|
|
my ($vendor_name) = "3GPP";
|
|
|
|
sub convert_must_to_flags($) {
|
|
my ($allmust) = @_;
|
|
my ($mustfields) = "";
|
|
$mustfields .= "AVP_FLAG_VENDOR |" if ($allmust =~ m/V/);
|
|
$mustfields .= "AVP_FLAG_MANDATORY |" if ($allmust =~ m/M/);
|
|
$mustfields =~ s/ \|$//;
|
|
return $mustfields;
|
|
}
|
|
|
|
sub base_type($) {
|
|
my ($type) = @_;
|
|
|
|
return "AVP_TYPE_GROUPED" if ($type =~ m/Grouped/);
|
|
return "AVP_TYPE_OCTETSTRING" if ($type =~ m/(Address|DiameterIdentity|DiameterURI|OctetString|IPFilterRule|Time|UTF8String)/);
|
|
return "AVP_TYPE_INTEGER32" if ($type =~ m/Enumerated|Integer32/);
|
|
return "AVP_TYPE_INTEGER64" if ($type =~ m/Integer64/);
|
|
return "AVP_TYPE_UNSIGNED32" if ($type =~ m/Unsigned32/);
|
|
return "AVP_TYPE_UNSIGNED64" if ($type =~ m/Unsigned64/);
|
|
return "AVP_TYPE_FLOAT32" if ($type =~ m/Float32/);
|
|
return "AVP_TYPE_FLOAT64" if ($type =~ m/Float64/);
|
|
|
|
return "UNKNOWN TYPE: $type";
|
|
}
|
|
|
|
sub print_insert($$) {
|
|
my ($type, $name) = @_;
|
|
my $avp_type;
|
|
|
|
if ($type =~ m/(Grouped|OctetString|Integer32|Integer64|Unsigned32|Unsigned64|Float32|Float64)/) {
|
|
$avp_type = "NULL";
|
|
} elsif ($type =~ m/Enumerated/) {
|
|
print "\t\tstruct dict_object *type;\n";
|
|
print "\t\tstruct dict_type_data tdata = { AVP_TYPE_INTEGER32, \"" . ($vendor_name ? "$vendor_name/" : "") ."Enumerated($name)\", NULL, NULL, NULL };\n";
|
|
# XXX: add enumerated values
|
|
print "\t\tCHECK_dict_new(DICT_TYPE, &tdata, NULL, &type);\n";
|
|
$avp_type = "type";
|
|
} else {
|
|
$avp_type = "${type}_type";
|
|
}
|
|
|
|
print "\t\tCHECK_dict_new(DICT_AVP, &data, $avp_type, NULL);\n";
|
|
}
|
|
|
|
sub usage($) {
|
|
die("usage: org_to_fd.pl [-V vendor_name -v vendor_code] [file ...]\n");
|
|
exit(@_);
|
|
}
|
|
|
|
getopts("V:v:") || usage(1);
|
|
|
|
if (defined($opt_v)) {
|
|
$vendor = $opt_v;
|
|
if (!defined($opt_V)) {
|
|
usage(1);
|
|
}
|
|
$vendor_name = $opt_V;
|
|
}
|
|
|
|
print "\t/* The following is created automatically. Do not modify. */\n";
|
|
print "\t/* Changes will be lost during the next update. Modify the source org file instead. */\n\n";
|
|
|
|
while (<>) {
|
|
my ($dummy, $name, $code, $section, $type, $must, $may, $shouldnot, $mustnot, $encr) = split /\|/;
|
|
|
|
next if ($name =~ m/Attribute Name/);
|
|
if ($name =~ m/ # (.*)/) {
|
|
print "\t/* $1 */\n";
|
|
next;
|
|
}
|
|
|
|
|
|
$name =~ s/ *//g;
|
|
$code =~ s/ *//g;
|
|
$type =~ s/ *//g;
|
|
|
|
print "\t/* $name */\n\t{\n\t\tstruct dict_avp_data data = {\n";
|
|
print "\t\t\t$code,\t/* Code */\n";
|
|
print "\t\t\t$vendor,\t/* Vendor */\n";
|
|
print "\t\t\t\"$name\",\t/* Name */\n";
|
|
print "\t\t\t" . convert_must_to_flags("$must, $mustnot") . ",\t/* Fixed flags */\n";
|
|
print "\t\t\t" . convert_must_to_flags("$must") . ",\t/* Fixed flag values */\n";
|
|
print "\t\t\t" . base_type($type) . "\t/* base type of data */\n";
|
|
print "\t\t};\n";
|
|
print_insert($type, $name);
|
|
print "\t};\n\n";
|
|
}
|