diff options
Diffstat (limited to 'doc/tools/src2html1.4a/src2html')
-rw-r--r-- | doc/tools/src2html1.4a/src2html | 589 |
1 files changed, 589 insertions, 0 deletions
diff --git a/doc/tools/src2html1.4a/src2html b/doc/tools/src2html1.4a/src2html new file mode 100644 index 0000000000..df238ba76c --- /dev/null +++ b/doc/tools/src2html1.4a/src2html @@ -0,0 +1,589 @@ +#!/usr/local/bin/perl +# Src2html: Take a source tree and generate Html documents that have hyperlinks +# to the definition of structures, variables, functions, and preprocessor +# definitions. Read the manual page for details on how to use the program. +# +# Version 1.4-alpha. Written by Warren Toomey wkt@cs.adfa.oz.au +# +# 19th January 1996 +# + +if ($#ARGV <= 0 || $#ARGV > 4) { # Check arg count + print(STDERR "Usage: $0 [-na] [-nl] [-d num] input_description\n"); + print(STDERR " -na: Don't produce top-level category files\n"); + print(STDERR " -nl: Don't produce per-letter files\n"); + print(STDERR " -d: Set debugging to given number (0-3)\n"); + exit(1); +} + +# Set up default option values +$NoLetters= 0; +$NoAll= 0; +$Debug=0; +$Top= $ARGV[$#ARGV]; +$Top=~ s/\.s2h$//; + +# Parse the options +for ($i=0; $i<= $#ARGV; $i++) { + if ($ARGV[$i] eq "-na") { $NoAll= 1; next; } + if ($ARGV[$i] eq "-nl") { $NoLetters= 1; next; } + if ($ARGV[$i] eq "-d") { $i++; $Debug= $ARGV[$i]; next; } +} + +$Title{"m"}= "Macros"; +$Title{"d"}= "Defines"; +$Title{"f"}= "Functions"; +$Title{"v"}= "Variables"; +$Title{"s"}= "Structs"; +$Title{"u"}= "Unions"; +$Title{"t"}= "Typedefs"; +$Title{"e"}= "Enums"; +$Title{"g"}= "All symbols"; + +&get_s2h; # Read the description file +&make_dirs; # Make directories as needed +&make_ctags; # Generate ctags for all src +&parse_ctags; # Parse ctags, generate html ptr files +foreach $i (keys(%Dirinfo)) +{ &rewrite_src($i); } # Rewrite the src code +exit(0); # and exit + + +## get_s2h: Opens the source description file, reads it, and sets up some +## variables describing where some directories are, and the source directories +## to process. Variables used are: +## Srctree - The root of the source tree we are processing +## Htmlroot - The directory where all WWW documents are kept +## Htmldir - The directory under Htmlroot for this source tree +## Htmltree - The root of the destination tree for the Html code +## Newsrctree - The directory in Htmltree to store the new Htmlised code +## Headers - The directory where we keep information to prepend in some docs +## Formdir - The place to put the index searching script +## Dirinfo{} - The list of dirs and the info about the directory +## Dotdir{} - The directory name with /'s -> .'s + +sub get_s2h { + $Newsrctree= 'newsrc'; # Set up as default + $Headers= '.'; + + + ######################################################### + # make sure we dump out the last bit of the last file.... + + # Print out the remainder of the + # current file, incl. the buffered line + if ($In_file == 1) { + if ("$line" ne "") { print OUT $line; } + while (<IN>) { + s/\&/&/g; s/\</</g; s/\>/>/g; print OUT; + } + print OUT "\n\n\n\n\n\n\n\n</pre></body>\n"; + close(IN); close(OUT); + } + ######################################################### + + open(S2H,$ARGV[$#ARGV]) # Open descript + || die "$0: can't open $ARGV[$#ARGV]: $!\n"; + + while(<S2H>) { # Read in input lines + next if /^#/; # Skip comments + if ( /^set\s+Srctree\s+(\S+)/ ) { + $Srctree = $1; next; # Set the variable + } + if ( /^set\s+Htmlroot\s+(\S+)/ ) { + $Htmlroot = $1; next; # Set the variable + } + if ( /^set\s+Htmldir\s+(\S+)/ ) { + $Htmldir = $1; next; # Set the variable + } + if ( /^set\s+Newsrctree\s+(\S+)/ ) { + $Newsrctree = $1; next; # Set the variable + } + if ( /^set\s+Headers\s+(\S+)/ ) { + $Headers = $1; next; # Set the variable + } + if ( /^set\s+Formdir\s+(\S+)/ ) { + $Formdir = $1; next; # Set the variable + } + if ( /^dir\s+(\S+)\s+(.*)/ ) { + $Dirinfo{$1}= $2; $Dotdir{$1}=$1; + $Dotdir{$1}=~ s/\//./g; + next; # Get dir commands + } + if ( /^\n/ ) { next; } # Ignore blank lines + # Bad input line, give warning + chop; print "$_: Bad line, ignoring\n"; next; + } + close(S2H); + if (!defined($Srctree)) { die "$0: Srctree undefined in $ARGV[$#ARGV]\n"; } + if (!defined($Htmlroot)) { die "$0: Htmlroot undefined in $ARGV[$#ARGV]\n"; } + if (!defined($Htmldir)) { die "$0: Htmldir undefined in $ARGV[$#ARGV]\n"; } + $Htmltree= "$Htmlroot/$Htmldir"; +} + +## make_dirs: Make the directories need to store the Html documents, and also +## check to make sure that the input directories exist. We depend upon mkdir(1) +## having the -p option to make intermediate directories as needed. + +sub make_dirs { + local($i); + + foreach $i (keys(%Dirinfo)) { # Check that the directories exist + if (! -e "$Srctree/$i") { + die "$0: Input dir $Srctree/$i doesn't exist\n"; + } + if (! -d "$Srctree/$i") { + die "$0: Input dir $Srctree/$i is not a directory\n"; + } + } + if (! -e "$Htmltree") { + system("mkdir -p $Htmltree") && die "$0: Can't mkdir $Htmltree\n"; + } + if (! -e "$Htmltree/$Newsrctree") { + system("mkdir -p $Htmltree/$Newsrctree") + && die "$0: Can't mkdir $Htmltree/$Newsrctree\n"; + } + if (! -e "$Htmltree/ctags") { + system("mkdir -p $Htmltree/ctags") && die "$0: Can't mkdir ctags\n"; + } + foreach $i (keys(%Dirinfo)) { + if (! -e "$Htmltree/$Newsrctree/$i") { + system("mkdir -p $Htmltree/$Newsrctree/$i") + && die "$0: Can't mkdir $Htmltree/$Newsrctree/$i\n"; + } + } +} + +## make_ctags: Process all the source code, creating the ctags files. +## The Ctagsfile{} array is set up to hold the name of the ctags files +## created. + +sub make_ctags { + local($i); + + foreach $i (keys(%Dirinfo)) { + $Ctagsfile{$i}= "$Htmltree/ctags/$Dotdir{$i}.ctags"; + if ($Debug > 0 ) { print "Generating ctags for $Ctagsfile{$i}\n"; } + system("(cd $Srctree; ctags-new -d -t -w -y $i/*) > $Ctagsfile{$i}") + && print "$0: ctags failed on $Srctree/$i\n"; + } +} + + +## parse_ctags: Parse the ctags file produced by make_ctags, creating several +## arrays of information. The arrays created are: +## Macro{} - The name of every macro and its name lowercased +## Def{} - The name of every define and its name lowercased +## Func{} - The name of every function and its name lowercased +## Var{} - The name of every variable and its name lowercased +## Struct{} - The name of every struct and its name lowercased +## Union{} - The name of every union and its name lowercased +## Type{} - The name of every typedef and its name lowercased +## Enum{} - The name of every enum and its name lowercased +## Nfile{} - The directory in which the symbol was found +## Nline{} - The line number where the symbol was found + +sub parse_ctags { + local($i); + local($low); + + foreach $i (keys(%Dirinfo)) { + open(CTAGS,$Ctagsfile{$i}) || die "$0: Can't open $Ctagsfile{$i}, $!\n"; + if ($Debug > 0) { print "Parsing $Ctagsfile{$i} to build ptr files\n"; } + while (<CTAGS>) { + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+Preprocessor macro/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Macro{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+Preprocessor define/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Def{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C struct/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Struct{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C union/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Union{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C typedef/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Type{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C enum/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Enum{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C function/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Func{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + if ( /^(\w+)\s+(\d+)\s+(\S+)\s+C variable/ ) { + ($low=$1)=~tr/A-Z_/a-z/d; $Var{$low}=$1; + $Nfile{$1}= $3; $Nline{$1}= $2; next; + } + print "$0: In Ctagsfile{$i}, don't recognise $_"; + } + close(CTAGS); + &make_dir_html($i); + undef %Macro; undef %Def; undef %Func; undef %Var; + undef %Struct; undef %Union; undef %Type; undef %Enum; + } + &make_top_html; +} + +## make_letters_html: Make the lowest HTML documents, i.e those per-directory +## per-type per-letter Htmls that point directly at the source code. +## Arguments are: Dir name, prefix, title, Name/dir list +## If the file is created, set $Exists(letter) positive, else to 0. + +sub make_letters_html { + local($dir)= $_[0]; + local($pref)= $_[1]; + local($title)= $_[2]; + local(*type)= $_[3]; + local($htmlfile); + local($let)="@"; + + foreach $i ( "a".."z" ) { $Exists{$i}=0; } + foreach $name (sort keys( %type )) { + if (substr($name,0,1) ne $let) { + if ($let ne "@") { + print HTML "</ul></body>\n"; + close(HTML); + $Exists{$let}= 1; + } + $let= substr($name, 0, 1); + $htmlfile= "$Htmltree/$Dotdir{$dir}.$pref$let.html"; + open(HTML, "> $htmlfile") || die "$0: Can't open $htmlfile, $!\n"; + + print HTML "<head>\n<title>$title starting with "; + print HTML "`$let' in $dir</title>\n"; + print HTML "</head><body><h1>$title starting with "; + print HTML "`$let' in $dir</h1><p>\n"; + print HTML "<ul>\n"; + } + print HTML "<li><a href=\"$Newsrctree/$Nfile{$type{$name}}"; + print HTML ".html#$type{$name}\">$type{$name}</a> "; + print HTML "$Nfile{$type{$name}}:$Nline{$type{$name}}\n"; next; + } + print HTML "</ul></body>\n"; + close(HTML); + $Exists{$let}= 1; +} + +## make_type_html: Make the type htmls. If there are <50 symbols for the +## directory, create the per-directory per-type html document only. Otherwise +## for every letter grep symbols, call make_lowest_letter_html, and +## finally create the per-directory per-type html document that points only +## at the letter files created. +## Arguments are: Dir name, prefix, title, Name/dir list + +sub make_type_html { + local($dir)= $_[0]; + local($pref)= $_[1]; + local($title)= $_[2]; + local(*type)= $_[3]; + local($i); + local($htmlfile); + local(@keys)= keys(%type); + local($name); + + $Exists{$title}=0; + if ( $#keys < 0 ) { return; } + if ($Debug > 0) { + $i= $#keys + 1; + print "The associative array for $dir $title has $i elements\n"; + } + if ( ($#keys < 50) || ($NoLetters == 1) ) { + $htmlfile= "$Htmltree/$Dotdir{$dir}.$pref.html"; + open(HTML, "> $htmlfile") || die "$0: Can't open $htmlfile, $!\n"; + print HTML "<head>\n<title>$title in $dir</title>\n"; + print HTML "</head><body><h1>$title in $dir</h1>\n"; + print HTML "<ul>\n"; + foreach $name (sort keys( %type )) { + print HTML "<li><a href=\"$Newsrctree/$Nfile{$type{$name}}"; + print HTML ".html#$type{$name}\">$type{$name}</a> "; + print HTML "$Nfile{$type{$name}}:$Nline{$type{$name}}\n"; next; + } + print HTML "</ul></body>\n"; + close(HTML); + $Exists{$title}=1; + } + else { + &make_letters_html($dir, $pref, $title, *type); + + open(HTML, "> $Htmltree/$Dotdir{$dir}.$pref.html") + || die "$0: Can't open $htmlfile.$pref.html, $!\n"; + print HTML "<head>\n<title>$title in $dir</title>\n"; + print HTML "</head><body><h1>$title in $dir</h1><p>\n"; + print HTML "<ul>\n"; + + foreach $i ( "a".."z" ) { + if ($Exists{$i} > 0) { # A file exists + print HTML "<li><a href=\"$Dotdir{$dir}.$pref$i.html\">"; + print HTML "$i</a>\n"; $Exists{$title}++; $Exists{$i}=0; + } + } + print HTML "</ul></body>\n"; + close(HTML); + if ($Exists{$title} == 0) { unlink($htmlfile); } + } +} + +## asappend: Append the contents of the second associative array to the +## first. + +sub asappend { + local(*To)= $_[0]; + local(*From)= $_[1]; + local($i); + + foreach $i (keys(%From)) { $To{$i}= $From{$i} ; } +} + +## make_dir_html: Make the html document for the directory. Use the +## Exist{} array to determine what types to include on the document. +## Arguments are: Dir name + +sub make_dir_html { + local($dir)= $_[0]; + local($i); + local(@keys); + + if ($Debug > 1) { print"In makedir, dir is $dir\n"; } + &make_type_html($dir, "f", $Title{"f"}, *Func); + &make_type_html($dir, "m", $Title{"m"}, *Macro); + &make_type_html($dir, "d", $Title{"d"}, *Def); + &make_type_html($dir, "v", $Title{"v"}, *Var); + &make_type_html($dir, "s", $Title{"s"}, *Struct); + &make_type_html($dir, "u", $Title{"u"}, *Union); + &make_type_html($dir, "t", $Title{"t"}, *Type); + &make_type_html($dir, "e", $Title{"e"}, *Enum); + + if ($NoAll != 1) { + &asappend(*GFunc, *Func); + &asappend(*GMacro, *Macro); + &asappend(*GDef, *Def); + &asappend(*GVar, *Var); + &asappend(*GStruct, *Struct); + &asappend(*GUnion, *Union); + &asappend(*GType, *Type); + &asappend(*GEnum, *Enum); + } + + &asappend(*Alldir, *Func); + &asappend(*Alldir, *Macro); + &asappend(*Alldir, *Def); + &asappend(*Alldir, *Var); + &asappend(*Alldir, *Struct); + &asappend(*Alldir, *Union); + &asappend(*Alldir, *Type); + &asappend(*Alldir, *Enum); + if ($NoLetters != 1) { + &make_letters_html($dir, "g", $Title{"g"}, *Alldir); + } + undef %Alldir; + + open(HTML, "> $Htmltree/$Dotdir{$dir}.html") + || die "$0: Can't open $Htmltree/$Dotdir{$dir}.html, $!\n"; + print HTML "<head>\n<title>Cross-references for $dir</title>\n"; + print HTML "</head><body><h1>Cross-references for $dir</h1><p>\n"; + if (-f "$Headers/$Dotdir{$dir}.hdr" ) { + open(TOPHDR, "$Headers/$Dotdir{$dir}.hdr"); + while (<TOPHDR>) { print HTML; } + close(TOPHDR); + } + + if (defined($Formdir)) { + print HTML "<hr><form action=\"$Formdir/src2html.cgi\" "; + print HTML "method=\"POST\">\n"; + print HTML "<input type=\"submit\" value=\"Search\">\n"; + print HTML "<input type= \"text\" "; + print HTML "name=\"$Htmldir/$Newsrctree\">\n"; + print HTML "Enter a symbol's name here to quickly find it.\n"; + print HTML "</form><hr>\n"; + } + print HTML "<h1>Cross-references for $dir by type</h1><p><ul>\n"; + + foreach $i ( "f","m","d","v","s","u","t","e" ) { + if ($Exists{$Title{$i}} > 0) { # A type exists + print HTML "<li><a href=\"$Dotdir{$dir}.$i.html\">"; + print HTML "$Title{$i}</a>\n"; + $Exists{$dir}++; $Exists{$Title{$i}}=0; + } + } + print HTML "</ul><p>\n"; + if ($NoLetters != 1) { + print HTML "<h1>Cross-references for $dir by letter</h1><p><ul>\n"; + foreach $i ( "a".."z" ) { + if ($Exists{$i} > 0) { # A letter exists + print HTML "<li><a href=\"$Dotdir{$dir}.g$i.html\">"; + print HTML "$i</a>\n"; $Exists{$i}=0; + } + } + } + print HTML "</ul></body>\n"; + close(HTML); +} + +## Make_top_html: Make the top html document by making the ones below +## it and then adding links to them. + +sub make_top_html { + local($i); + local(@keys); + + $Dotdir{$Top}=$Top; + &make_type_html($Top, "f", $Title{"f"}, *GFunc); + &make_type_html($Top, "m", $Title{"m"}, *GMacro); + &make_type_html($Top, "d", $Title{"d"}, *GDef); + &make_type_html($Top, "v", $Title{"v"}, *GVar); + &make_type_html($Top, "s", $Title{"s"}, *GStruct); + &make_type_html($Top, "u", $Title{"u"}, *GUnion); + &make_type_html($Top, "t", $Title{"t"}, *GType); + &make_type_html($Top, "e", $Title{"e"}, *GEnum); + + open(HTMLTOP, "> $Htmltree/$Top.html") + || die "$0: Can't open $Htmltree/$Top.html, $!\n"; + print HTMLTOP "<head>\n<title>Cross-references for $Top</title>\n"; + print HTMLTOP "</head><body><h1>Cross-references for $Top</h1><p>\n"; + + if (-f "$Headers/$Top.hdr" ) { + open(TOPHDR, "$Headers/$Top.hdr"); + while (<TOPHDR>) { print HTMLTOP; } + close(TOPHDR); + } + + if (defined($Formdir)) { + print HTMLTOP "<hr><form action=\"$Formdir/src2html.cgi\" "; + print HTMLTOP "method=\"POST\">\n"; + print HTMLTOP "<input type=\"submit\" value=\"Search\">\n"; + print HTMLTOP "<input type= \"text\" "; + print HTMLTOP "name=\"$Htmldir/$Newsrctree\">\n"; + print HTMLTOP "Enter a symbol's name here to quickly find it.\n"; + print HTMLTOP "</form><hr>\n"; + } + print HTMLTOP "<h2>Cross-references by directory</h2><p>\n"; + print HTMLTOP "<ul>\n"; + + foreach $i (sort keys(%Dirinfo)) { + if ($Exists{$i} > 0) { # A dir exists + print HTMLTOP "<li><a href=\"$Dotdir{$i}.html\">"; + print HTMLTOP "$i</a> $Dirinfo{$i}\n"; $Exists{$i}=0; + } + } + if ($NoAll != 1) { + print HTMLTOP "</ul><p><h2>Cross-references by type</h2><p><ul>\n"; + foreach $i ( "f","m","d","v","s","u","t","e" ) { + if ($Exists{$Title{$i}} > 0) { # A type exists + print HTMLTOP "<li><a href=\"$Top.$i.html\">"; + print HTMLTOP "$Title{$i}</a>\n"; + } + } + if ($NoLetters != 1) { + print HTMLTOP "</ul><p><h2>All Cross-references for $Top"; + print HTMLTOP "</h2><p><ul>\n"; + &asappend(*Alltop, *GFunc); + &asappend(*Alltop, *GMacro); + &asappend(*Alltop, *GDef); + &asappend(*Alltop, *GVar); + &asappend(*Alltop, *GStruct); + &asappend(*Alltop, *GUnion); + &asappend(*Alltop, *GType); + &asappend(*Alltop, *GEnum); + + if ($Debug > 0) { print "Making top letters\n"; } + &make_letters_html($Top, "g", $Title{"g"}, *Alltop); + if ($Debug > 0) { print "Making top letters, part 2\n"; } + foreach $i ( "a".."z" ) { + if ($Exists{$i} > 0) { + print HTMLTOP "<li><a href=\"$Dotdir{$Top}.g$i.html\">"; + print HTMLTOP "$i</a>\n"; + } + } + } + } + print HTMLTOP "</ul>\n"; + print HTMLTOP "<hr>This source tree was made with "; + print HTMLTOP "<a href=\"http://minnie.cs.adfa.oz.au/Src2html/index.html"; + print HTMLTOP "\">src2html</a>.</body>\n"; + close(HTMLTOP); +} + + +## rewrite_src: Reread the ctags file for the given directory, and +## rewrite the source code, adding in anchor points and bolding symbols. +## This is messy as we can have multiple symbols on a single source line, +## therefore we must buffer each line while reading from the ctags file. +## +sub rewrite_src { + local($dir)= $_[0]; + local($i); + local($file)=""; + local($line)=""; + local($symb); + local($cnt); + local($nextcnt); + + $In_file=0; + open(CTAGS,"sort +2 -3 +1n -2 $Ctagsfile{$dir} |") + || die "$0: Can't open sorted $Ctagsfile{$dir}, $!\n"; + if ($Debug > 0) { print "Rewriting source in $dir\n"; } + while (<CTAGS>) { + # Get the next file, line, symbol + if (/^(\w+)\s+(\d+)\s+([A-Za-z0-9_\+\-\.\/]+)/) { + if ($Debug > 2) { print "Symb $1 at $2 in $3\n"; } + $nextcnt= $2; $symb=$1; + # If it's in a new file + if ("$file" ne "$3") { + # Print out the remainder of the + # current file, incl. the buffered line + if ($In_file == 1) { + if ("$line" ne "") { print OUT $line; } + while (<IN>) { + s/\&/&/g; s/\</</g; s/\>/>/g; print OUT; + } + print OUT "\n\n\n\n\n\n\n\n\n\n</pre></body>\n"; + close(IN); close(OUT); + } + $file= "$3"; + # Open the new file & do the preamble + open(IN, "$Srctree/$file") || + print "Cannot open $Srctree/$file\n"; + open(OUT, "> $Htmltree/$Newsrctree/$file.html"); + $In_file=1; + print OUT "<head>\n<title>$file Source</title>\n"; + print OUT "</head><body>\n"; + print OUT "<h1>Source to $file</h1>\n"; + if (defined($Formdir)) { + print OUT "<hr><form action=\"$Formdir/src2html.cgi\" "; + print OUT "method=\"POST\">\n"; + print OUT "<input type=\"submit\" value=\"Search\">\n"; + print OUT "<input type= \"text\" "; + print OUT "name=\"$Htmldir/$Newsrctree\">\n"; + print OUT "Enter a symbol's name here to quickly find it.\n"; + print OUT "</form><hr>\n"; + } + print OUT "<pre>\n"; + # Get the first line + $cnt=1; $line = <IN>; + $line=~ s/\&/&/g; + $line=~ s/\</</g; + $line=~ s/\>/>/g; + } + } + # Print all lines until one with a symb + while ($cnt < $nextcnt) { + print OUT $line; $cnt++; $line= <IN>; + $line=~ s/\&/&/g; + $line=~ s/\</</g; + $line=~ s/\>/>/g; + } + # Now rewrite the line + $line=~ s/$symb/<a name="$symb"<\/a><b>$symb<\/b>/; + next; + } + close(CTAGS); close(IN); close(OUT); +} |