diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2018-01-09 19:06:55 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2018-01-09 19:06:55 (GMT) |
commit | 01e0ebfe59d9028b0246ec4a549bd7528ada94eb (patch) | |
tree | a6c5b54db03177a1c8f3e7fb531990dfbc7bae39 /ast/getatt | |
parent | d64cf9c0bd23e752867b149be636d1bbd4501cf4 (diff) | |
download | blt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.zip blt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.tar.gz blt-01e0ebfe59d9028b0246ec4a549bd7528ada94eb.tar.bz2 |
update ast 8.6.2
Diffstat (limited to 'ast/getatt')
-rwxr-xr-x | ast/getatt | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/ast/getatt b/ast/getatt new file mode 100755 index 0000000..fb8bc78 --- /dev/null +++ b/ast/getatt @@ -0,0 +1,163 @@ +#! /usr/bin/env perl +# This script requires that Perl be in the path, and that the +# environment variable SST_DIR be set to the location of the prolat +# binary. + + $C = 1; + $fortran = 0; + $prologue = 0; + $name = ""; + $name_section = 0; + $key = ""; + $unix_script = 0; + $cmt = quotemeta( "*" ); + +# Read switches. + while ( $_ = $ARGV[0], /^-/ ) { + shift; + last if /^--$/; + if ( /^-f/ ) { $fortran = 1; $C = 0; }; + if ( /^-u/ ) { $unix_script = 1; $cmt = quotemeta( "#" ); }; + if ( /^-att/ ) { $key = "att" }; + if ( /^-class/ ) { $key = "class" }; + } + +# Set up pattern for matching language-dependent lines. + $language_symbol = "c"; + if ( $fortran ) { $language_symbol = "f"; } + if ( $unix_script ) { + $lang = $cmt . "[fc]"; + $thislang = quotemeta( "#" . $language_symbol ); + } else { + $lang = "[fc]"; + $thislang = quotemeta( $language_symbol ); + } + +# Read input lines. + line: while (<>) { + +# Skip language-specific lines that aren't wanted. + if ( /^$lang/ ) { + next line if ( !/^$thislang/ ); + +# Put "*" in first column. + s/^$thislang/\*/; + } + +# Detect end of prologue. + if ( /^$cmt$key--/o ) { + $prologue = 0; + +# Append "*-" to prologue text and save the whole prologue as an element +# in the "pro" associative array. + $pro{ $name } = $text . "*-\n"; + +# Clear the name ready for next prologue. + $name = ""; + } + +# Process the prologue contents. + if ( $prologue ) { + +# Remove trailing blanks. + s/ *$//; + +# Convert/remove sections that don't appear in external documentation. + if ( $unix_script ) { + ; + } elsif ( !$key && $C ) { + s/^($cmt *)Synopsis:$/$1Invocation:/; + s/^($cmt *)Parameters:$/$1Arguments:/; + } elsif ( !$key && $fortran ) { + s/^($cmt *)Synopsis:$/$1Invocation:/; + s/^($cmt *)Parameters:$/$1Arguments:/; + } elsif ( $key =~ /att/ ) { + s/^($cmt *)Synopsis:$/$1Invocation:/; + } elsif ( $key =~ /class/ ) { + s/^($cmt *)Constructor Function:$/$1Invocation:/; + } + +# Skip the contents of these sections... + if ( /^$cmt *Type:$/ || + /^$cmt *Class Membership:$/ || + /^$cmt *Copyright:$/ ) { + while ( <> ) { if ( /^ *$/ ) { next line } }; + } + +# Remove any #include directives from the C Synopsis (Invocation) section. + if ( !$key && $C && !$unix_script ) { + if ( /^$cmt *Invocation:$/ ) { + while ( <> && /^$cmt *#include/ ) {}; + } + } + +# If in the "Name:" section, search for the routine name, noting when +# found. + if ( $name_section && ( ( $name ) = /^. *([^ ]*) *$/ ) ) { + $name_section = 0; + }; + +# Detect the "Name:" line itself. + if ( /^$cmt *Name:$/ ) { $name_section = 1 }; + +# Change to use the standard comment character "*". + s/^$cmt/\*/; + +# Append each prologue line to the end of the prologue text. + $text = $text . $_; + } + +# Detect start of prologue and initialise prologue text. + if ( /^$cmt$key\+\+/o ) { + $prologue = 1; + $name_section = 0; + $text = "*+\n"; + }; + } + +# Output prologues in alphabetical order to a scratch file. + open( TEMP, '>/tmp/getatt' ); + foreach $name ( sort( keys( %pro ) ) ) { print( TEMP $pro{ $name } ); } + close( TEMP ); + +# Write the names to a log file, escaping special (to Latex) characters. + open( NAMES, '>getatt.labels' ); + foreach $name ( sort( keys( %pro ) ) ) { + $name =~ s/_/\\_/g; + $name =~ s/\>/\$\>\$/g; + $name =~ s/\</\$\<\$/g; + print( NAMES $name ); + } + close( NAMES ); + +# Run PROLAT on the scratch file and then delete it. + print( STDERR + `rm -f /tmp/prolat.tex; + \$SST_DIR/prolat in=/tmp/getatt atask=f single=f page=f document=f out=/tmp/prolat.tex; + rm -f /tmp/getatt` + ); + +# Read the output from PROLAT and edit the Latex macro invocations into +# their final form. + open( LATEX, '/tmp/prolat.tex' ); + while( <LATEX> ) { + if ( $unix_script ) { + ; + } elsif ( !$key && $C ) { + s/\\sstinvocation{/\\sstsynopsis{/; + s/\\sstarguments{/\\sstparameters{/; + } elsif ( $key =~ /att/ ) { + s/\\sstinvocation{/\\sstattributetype{/; + } elsif ( $key =~ /class/ ) { + s/\\sstinvocation{/\\sstconstructor{/; + } + +# Fix up constructs that don't otherwise convert to HTML properly. + s/{\\tt \'}/'/g; + s/{\\tt \"}/{\\tt{\"}}/g; + print; + } + close( LATEX ); + +# Delete the output file from PROLAT. + print( STDERR `rm -f /tmp/prolat.tex` ); |