Files
openflow/doc/of-spec/make_latex_input.pl
T

118 lines
2.3 KiB
Perl
Executable File

#!/usr/bin/perl -w
use strict;
sub handle_comment {
my ($comment) = @_;
my $next_line;
do {
$next_line = <INFILE>;
chomp $next_line;
$comment .= $next_line . "\n";
} until ( $next_line =~ m/\*\// );
return $comment;
}
sub handle_define {
my ( $var, $val ) = @_;
open( OUTFILE, ">define/$var" );
print OUTFILE $val;
close(OUTFILE);
}
sub handle_multiline {
my ( $dir, $filename, $line_orig, $last_comment ) = @_;
open( OUTFILE, ">$dir/$filename" );
#print OUTFILE "\\scriptsize\n";
print OUTFILE "\\begin{footnotesize}\n";
print OUTFILE "\\begin{verbatim}\n";
#print OUTFILE "\\begin{lstlisting}[frame=htb]{$filename}\n";
print OUTFILE $last_comment;
print OUTFILE $line_orig;
my $next_line;
do {
$next_line = <INFILE>;
chomp $next_line;
print OUTFILE $next_line . "\n";
} until ( $next_line eq '};' );
# add assertion line for structs
if ( $dir eq 'struct' ) {
$next_line = <INFILE>;
print OUTFILE $next_line;
}
print OUTFILE "\\end{verbatim}\n";
#print OUTFILE "\\end{lstlisting}\n";
print OUTFILE "\\end{footnotesize}\n";
close(OUTFILE);
}
#----------------------------------------
use File::Path;
foreach my $type ( 'enum', 'struct', 'define' ) {
if ( -d $type ) {
rmtree($type);
}
mkdir $type;
}
open( INFILE, "<../../include/openflow/openflow.h" );
my $last_comment;
while (<INFILE>) {
# Good practice to store $_ value because
# subsequent operations may change it.
my ($line) = $_;
my $line_orig = $line;
my @line_split = split ' ', $line;
if ( not defined( $line_split[0] ) ) {
$last_comment = '';
}
# Handle single-line comment
elsif ( $line =~ m/^\/\*.*\*\// ) {
$last_comment = $line;
#print $last_comment;
}
# Handle multi-line comment
elsif ( $line =~ m/^\/\*/ ) {
$last_comment = handle_comment($line_orig);
#print $last_comment;
}
# Handle define
elsif ( $line_split[0] eq '#define' ) {
handle_define( $line_split[1], $line_split[2] );
$last_comment = '';
}
# Handle enum
elsif ( $line_split[0] eq 'enum' ) {
handle_multiline( 'enum', $line_split[1], $line_orig, $last_comment );
$last_comment = '';
}
# Handle struct
elsif ( $line_split[0] eq 'struct' ) {
handle_multiline( 'struct', $line_split[1], $line_orig, $last_comment );
$last_comment = '';
}
}
print "completed\n";