From Vincent Helfre:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 4 Apr 2011 14:35:21 +0000 (14:35 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 4 Apr 2011 14:35:21 +0000 (14:35 +0000)
updated the script that extracts the asn1 from the specification (we modified it after noticing that it currently fails to take the IMPORT section). It should also work now to extract the WCDMA RRC (TS 25.331).

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@36442 f5534014-38df-0310-8fa8-9805f1628bb7

tools/extract_asn1_from_spec.pl

index a57623bfaa452b889b64e1f792d011100164b4c3..52d0f83c130d048facac5fc7fb55f597cdeee531 100755 (executable)
@@ -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>;
   }
 }
+