mirror of https://gerrit.osmocom.org/asn1c
87 lines
1.6 KiB
Perl
87 lines
1.6 KiB
Perl
|
#!/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 <rfc-file.txt> ...\n";
|
|||
|
print STDERR "Usage: <someprog> | $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;
|