1 | #!/usr/bin/perl |
---|
2 | #!/usr/local/apps/perl/current/bin/perl |
---|
3 | # |
---|
4 | # (C) Copyright 2010- ECMWF. |
---|
5 | # |
---|
6 | # This software is licensed under the terms of the Apache Licence Version 2.0 |
---|
7 | # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. |
---|
8 | # |
---|
9 | # In applying this licence, ECMWF does not waive the privileges and immunities |
---|
10 | # granted to it by virtue of its status as an intergovernmental organisation |
---|
11 | # nor does it submit to any jurisdiction. |
---|
12 | |
---|
13 | # Modified to cope with rttov files which have built in interface |
---|
14 | # blocks that just need to be parsed out. |
---|
15 | # Paul Burton 2010 |
---|
16 | |
---|
17 | use strict; |
---|
18 | use warnings; |
---|
19 | #use lib "/home/rd/rdx/bin/prepifs/perl"; |
---|
20 | use Fortran90_stuff; |
---|
21 | use Data::Dumper; |
---|
22 | $Data::Dumper::Indent = 1; |
---|
23 | |
---|
24 | my $rttov_intf=0; |
---|
25 | |
---|
26 | { |
---|
27 | my (@files); |
---|
28 | (@files) = @ARGV; |
---|
29 | &setup_parse(); |
---|
30 | my $locintfbldir=$ENV{LOC_INTFBDIR} or die "LOC_INTFBDIR not defined "; |
---|
31 | my $intfbldir=$ENV{INTFBDIR} or die "INTFBDIR not defined "; |
---|
32 | our $study_called; |
---|
33 | FILE:for (@files) { |
---|
34 | my (@interface_block); |
---|
35 | my (@line_hash); |
---|
36 | chomp; |
---|
37 | # Read in lines from file |
---|
38 | my $fname = $_; |
---|
39 | |
---|
40 | my $int_block_fname=$fname; |
---|
41 | $int_block_fname=~s/\.F90/.intfb.h/; |
---|
42 | $int_block_fname=~s#.*/(.+)$#$1#; |
---|
43 | my $ofname=$intfbldir.'/'.$int_block_fname; |
---|
44 | my $nfname=$locintfbldir.'/'.$int_block_fname; |
---|
45 | |
---|
46 | # Do nothing if file hasn't changed since intfb already created |
---|
47 | |
---|
48 | if ( (-f $nfname) && |
---|
49 | ( (stat($nfname))[9] > (stat($fname))[9] )) { |
---|
50 | print "INTERFACE BLOCK $int_block_fname UP TO DATE\n"; |
---|
51 | next FILE; |
---|
52 | } |
---|
53 | |
---|
54 | # skip .h files, Nils |
---|
55 | my $base = $_; |
---|
56 | ( $base = $fname ) =~ s/\.(\w+)\s*$//; |
---|
57 | my $suffix = $1; |
---|
58 | next if ( $suffix eq "h" ); |
---|
59 | # end Nils |
---|
60 | my @statements=(); |
---|
61 | my %prog_info=(); |
---|
62 | my @lines = &readfile($fname); |
---|
63 | |
---|
64 | $rttov_intf=0; |
---|
65 | if ($fname=~/^satrad\//) { |
---|
66 | if (grep(/^!INTF_END/,@lines)) { |
---|
67 | print "Working on rttov file $fname\n"; |
---|
68 | $rttov_intf=1; |
---|
69 | &create_rttov_interface_block(\@lines,\@interface_block,\%prog_info); |
---|
70 | } else { |
---|
71 | # satrad file without INTF_END marker - ignore |
---|
72 | print "Ignoring satrad file $fname (no INTF_END marker)\n"; |
---|
73 | next; |
---|
74 | } |
---|
75 | } else { |
---|
76 | print "Working on file $fname\n"; |
---|
77 | &expcont(\@lines,\@statements); |
---|
78 | $study_called=0; |
---|
79 | &study(\@statements,\%prog_info); |
---|
80 | # print Dumper(\%prog_info); |
---|
81 | } |
---|
82 | unless($prog_info{is_module}) { |
---|
83 | if ($rttov_intf) { |
---|
84 | @lines=@interface_block; |
---|
85 | } else { |
---|
86 | &create_interface_block(\@statements,\@interface_block); |
---|
87 | &cont_lines(\@interface_block,\@lines,\@line_hash); |
---|
88 | } |
---|
89 | if ( -f $nfname ) { |
---|
90 | my @nldlines=&readfile($nfname); |
---|
91 | if(&eq_array(\@nldlines, \@lines)){ |
---|
92 | print "INTERFACE BLOCK $int_block_fname NOT UPDATED \n" ; |
---|
93 | next FILE; |
---|
94 | } |
---|
95 | } |
---|
96 | if ( -f $ofname ) { |
---|
97 | my @oldlines=&readfile($ofname); |
---|
98 | if(&eq_array(\@oldlines, \@lines)){ |
---|
99 | print "INTERFACE BLOCK $int_block_fname UNCHANGED \n" ; |
---|
100 | next FILE; |
---|
101 | } |
---|
102 | } |
---|
103 | print "WRITE INTERFACE BLOCK $int_block_fname \n"; |
---|
104 | print "$nfname \n"; |
---|
105 | &writefile($nfname,\@lines); |
---|
106 | } |
---|
107 | } |
---|
108 | } |
---|
109 | sub eq_array { |
---|
110 | my ($ra, $rb) = @_; |
---|
111 | return 0 unless $#$ra == $#$rb; |
---|
112 | for my $i (0..$#$ra) { |
---|
113 | return 0 unless $ra->[$i] eq $rb->[$i]; |
---|
114 | } |
---|
115 | return 1; |
---|
116 | } |
---|
117 | |
---|
118 | sub create_rttov_interface_block { |
---|
119 | my ($lines,$intfblk,$prog_info)=(@_); |
---|
120 | my ($line,$on,$what,@intf); |
---|
121 | $on=1; |
---|
122 | $what=""; |
---|
123 | for $line (@{$lines}) { |
---|
124 | $on=1 if ($line=~/^\s*!\s*INTF_ON\s*$/); |
---|
125 | $on=0 if ($line=~/^\s*!\s*INTF_OFF\s*$/); |
---|
126 | last if ($line=~/^\s*!INTF_END\s*$/); |
---|
127 | if ($what eq "") { |
---|
128 | $what="SUBROUTINE" if ($line=~/^\s*SUBROUTINE/i); |
---|
129 | $what="FUNCTION" if ($line=~/\s*FUNCTION/i); |
---|
130 | $what="MODULE" if ($line=~/^\s*MODULE/i); |
---|
131 | $what="PROGRAM" if ($line=~/^\s*PROGRAM/i); |
---|
132 | } |
---|
133 | next if ($line=~/^\s*!/ || $line=~/^\s*$/ || !$on ); |
---|
134 | push(@intf,$line); |
---|
135 | } |
---|
136 | die "Cannot guess if file contains a SUBROUTINE or FUNCTION.\n" unless $what; |
---|
137 | $prog_info->{is_module}=1 if ($what eq "MODULE"); |
---|
138 | @{$intfblk}=("INTERFACE\n",@intf,"END $what\n","END INTERFACE\n"); |
---|
139 | } |
---|
140 | |
---|