#!/usr/bin/perl # # $Id$ # $Author$ # # Simple tool that fetches the ASN.1 specifications from the # given set of RFC files. # my $inasn = 0; # Are we inside ASN.1 grammar? my $found = 0; if(-t STDIN && $#ARGV == -1) { print STDERR "Rip ASN.1 specification from RFC file\n"; print STDERR "Usage: $0 ...\n"; print STDERR "Usage: | $0\n"; exit(1); } while(<>) { # # Strip RFC page delimiters. # next if /^[A-Z].*\[Page [0-9]+\]$/; next if /^ $/; next if /^RFC [0-9].*[0-9]+$/; if($inasn == 0) { # # The least correct way to find the start of ASN # definition. # if(/^[ \t]*END[ \t]*$/) { print STDERR "Missed an ASN.1 grammar before line ". $. ."?\n"; exit(1); } my $rfcid = ''; $rfcid = $1 . '-' if($ARGV =~ /([a-z0-9]+)/i); if(/^[ \t]+([A-Za-z0-9-]+).*DEFINITIONS.*::=/) { my $fname = $rfcid . $1 . ".asn1"; open(O, "> $fname") or die "Can't open $fname"; select(O); $inasn = 1; } elsif(/^[ \t]*([A-Za-z0-9-]+).*{.*iso/) { my $fname = $rfcid . $1 . ".asn1"; my @a = ($_); my $i; for($i = 0; $i < 8; $i++) { $_ = <>; push(@a, $_); if(/DEFINITIONS/) { $_ = join('', @a); $inasn = 1; last; } } next unless $inasn; open(O, "> $fname") or die "Can't open $fname"; select(O); } else { next; } $found++; print "\n"; print "-- \n"; print "-- Grammar found in $ARGV by $0 at " . $. . "\n"; print "-- \n"; print "\n"; } print; if(/^[ \t]*END[ \t]*$/) { select(STDOUT); close(O); $inasn = 0; } } die "No ASN.1 specifications found\n" unless $found;