| #!/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"; |
| } |