summaryrefslogtreecommitdiff
path: root/tools/extract_asn1_from_spec.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/extract_asn1_from_spec.pl')
-rwxr-xr-xtools/extract_asn1_from_spec.pl87
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>;
}
}
+