diff options
Diffstat (limited to 'tools/extract_asn1_from_spec.pl')
-rwxr-xr-x | tools/extract_asn1_from_spec.pl | 87 |
1 files changed, 40 insertions, 47 deletions
diff --git a/tools/extract_asn1_from_spec.pl b/tools/extract_asn1_from_spec.pl index a57623bfaa..52d0f83c13 100755 --- a/tools/extract_asn1_from_spec.pl +++ b/tools/extract_asn1_from_spec.pl @@ -1,80 +1,73 @@ #$Id$ #!/usr/bin/perl -# This script extracts the ASN1 definition from and TS 36.331 and generates 3 output files that can be processed by asn2wrs +# 2011 Vincent Helfre and Erwan Yvin +# This script extracts the ASN1 definition from and TS 36.331/25.331 and generates asn files that can be processed by asn2wrs # First download the specification from 3gpp.org as a word document and open it -# Then in "view" menu, select normal or web layout (needed to removed page header and footers) +# Then in "view" menu, select normal, draft or web layout (any kind that removes page header and footers) # Finally save the document as a text file -# Call the script: "perl extract_asn1_from_spec.pl 36331-xxx.txt" +# Example with TS 36.331: "perl extract_asn1_from_spec.pl 36331-xxx.txt" # It should generate: EUTRA-RRC-Definitions.asn, EUTRA-UE-Variables.asn and EUTRA-InterNodeDefinitions use warnings; $input_file = $ARGV[0]; -$def_output_file = "EUTRA-RRC-Definitions.asn"; -$var_output_file = "EUTRA-UE-Variables.asn"; -$internode_output_file = "EUTRA-InterNodeDefinitions.asn"; +$version = 0; +sub extract_spec_version; sub extract_asn1; open(INPUT_FILE, "< $input_file") or die "Can not open file $input_file"; -while (<INPUT_FILE>) { - # Process the EUTRA-RRC-Definitions section - if( m/EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=/){ - open(OUTPUT_FILE, "> $def_output_file") or die "Can not open file $def_output_file"; - syswrite OUTPUT_FILE,"$_ \n"; - syswrite OUTPUT_FILE,"BEGIN\n\n"; +extract_spec_version(); - # Get all the text delimited by -- ASN1START and -- ASN1STOP - extract_asn1(); +extract_asn1(); - syswrite OUTPUT_FILE,"END\n\n"; - close(OUTPUT_FILE); - } - - # Process the EUTRA-RRC-Variables section - if( m/EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=/){ - open(OUTPUT_FILE, "> $var_output_file") or die "Can not open file $def_output_file"; - syswrite OUTPUT_FILE,"$_ \n"; - syswrite OUTPUT_FILE,"BEGIN\n\n"; - - # Get all the text delimited by -- ASN1START and -- ASN1STOP - extract_asn1(); - - syswrite OUTPUT_FILE,"END\n\n"; - close(OUTPUT_FILE); - } - # Process the EUTRA-InterNodeDefinitions section - if( m/EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=/){ - open(OUTPUT_FILE, "> $internode_output_file") or die "Can not open file $def_output_file"; - syswrite OUTPUT_FILE,"$_ \n"; - syswrite OUTPUT_FILE,"BEGIN\n\n"; - - # Get all the text delimited by -- ASN1START and -- ASN1STOP - extract_asn1(); +close(INPUT_FILE); - syswrite OUTPUT_FILE,"END\n\n"; - close(OUTPUT_FILE); +# This subroutine extracts the version of the specification +sub extract_spec_version { + my $line; + while($line = <INPUT_FILE>){ + if($line =~ m/3GPP TS (25|36)\.331 V/){ + $version = $line; + return; + } } } -close(INPUT_FILE); - # This subroutine copies the text delimited by -- ASN1START and -- ASN1STOP in INPUT_FILE # and copies it into OUTPUT_FILE. -# It stops when it meets the keyword "END" +# The OUTPUT_FILE is opened on encounter of the keyword "DEFINITIONS AUTOMATIC TAGS" +# and closed on encounter of the keyword "END" sub extract_asn1 { - my $line = <INPUT_FILE>; + my $line; my $is_asn1 = 0; + my $output_file_name = 0; - while(($line ne "END\n") && ($line ne "END\r\n")){ + while($line = <INPUT_FILE>){ if ($line =~ m/-- ASN1STOP/) { $is_asn1 = 0; } - if ($is_asn1 == 1){ + + if($line =~ m/DEFINITIONS AUTOMATIC TAGS ::=/){ + ($output_file_name) = ($line =~ m/^([a-zA-Z\-]+)\s+DEFINITIONS AUTOMATIC TAGS ::=/); + $output_file_name = "$output_file_name".".asn"; + print "generating $output_file_name\n"; + open(OUTPUT_FILE, "> $output_file_name") or die "Can not open file $output_file_name"; + syswrite OUTPUT_FILE,"-- $version-- \$Id$output_file_name 32781 2010-05-12 05:51:54Z etxrab \$\n--\n"; + $is_asn1 = 1; + } + + if (($line =~ /END$/) && (defined fileno OUTPUT_FILE)){ + syswrite OUTPUT_FILE,"$line"; + close(OUTPUT_FILE); + $is_asn1 = 0; + } + + if (($is_asn1 == 1) && (defined fileno OUTPUT_FILE)){ syswrite OUTPUT_FILE,"$line"; } if ($line =~ m/-- ASN1START/) { $is_asn1 = 1; } - $line = <INPUT_FILE>; } } + |