Initial checkin of OpenFlow specification LaTeX source.
[sliver-openvswitch.git] / doc / of-spec / make_latex_input.pl
diff --git a/doc/of-spec/make_latex_input.pl b/doc/of-spec/make_latex_input.pl
new file mode 100755 (executable)
index 0000000..2febda3
--- /dev/null
@@ -0,0 +1,107 @@
+#!/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.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";