blob: 9cc0631c244abfd2b6b01d103f09234c1261dff5 [file] [log] [blame]
#!/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";
}