File: namedep.sh

package info (click to toggle)
espresso 6.7-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 311,068 kB
  • sloc: f90: 447,429; ansic: 52,566; sh: 40,631; xml: 37,561; tcl: 20,077; lisp: 5,923; makefile: 4,503; python: 4,379; perl: 1,219; cpp: 761; fortran: 618; java: 568; awk: 128
file content (114 lines) | stat: -rwxr-xr-x 3,393 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/bin/sh
# namedep.sh -- script that computes dependencies on Fortran 90 modules

# make sure there is no locale setting creating unneeded differences.
LC_ALL=C
export LC_ALL

# first argument is mandatory
if test $# = 0
then
    echo usage: $0 name [files]
    exit 1
fi

# run from directory where this script is
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname

# module, function or subroutine whose dependencies must be computed
name=$1
shift

# list of files to be searched
sources_all=`ls */*.f90`
if test $# = 0 ; then sources="$sources_all"
else sources="$* /dev/null" ; fi

# search for declaration of $name
# caution: must not select names that _contain_ $name
decls=`egrep -ni -e "^ *subroutine  *$name *(\(.*)?$" \
                 -e "^ *function  *$name *(\(.*)?$" \
                 -e "^ *module  *$name *$" \
       $sources | sed 's/[:(]/ /g' | awk '{print $1 "@" $2 "@" $4}'`

num=`echo $decls | wc | awk '{print $2}'`
if test $num = 0
then
    echo error: $name not found
    exit 1
elif test $num -gt 1
then
    # $name is defined in more than one place, must choose one
    echo error: there are multiple declarations:
    for decl in $decls
    do
      file=`echo $decl | sed 's/@/ /g' | awk '{print $1}'`
      echo "    $name [$file]"
    done
    echo please specify file
    exit 1
fi

# build list of all module declarations
# list format is: file_name starting_line module_name
egrep -ni "^ *module  *[a-zA-Z_][a-zA-Z_]*" $sources_all |
grep -iv procedure | # exclude "module procedure" declarations
sed 's/:/ /g' | awk '{print $1, $2, $4}' > namedep.sh.tmp1

decl=`echo $decls | sed 's/@/ /g'`
file=`echo $decl | awk '{print $1}'`
echo $name [$file]:

# find starting and ending line
start=`echo $decl | awk '{print $2}'`
end=`egrep -ni -e "^ *end  *subroutine  *$name *$" \
               -e "^ *end  *function  *$name *$" \
               -e "^ *end  *module  *$name *$" \
     $file | sed 's/:.*//'`

# look for use declarations
modules=`sed -n "$start,${end}p" $file | egrep -i "^ *use " |
         sed 's/,.*//' |             # remove ", only: ..."
         awk '{print tolower($2)}' | # cast module name to lowercase
         sort | uniq                 # remove duplicates`

# look for recursive dependencies
modules_prev=""
until test "$modules_prev" = "$modules"
do
  modules_tested="$modules_prev"
  modules_prev="$modules"
  for module in $modules
  do
    # skip module if already tested
    if test "`echo $modules_tested | tr ' ' '\n' | grep ^$module\$`" = ""
    then
	mdecl=`egrep -i " $module *$" namedep.sh.tmp1`
	file=`echo $mdecl | awk '{print $1}'`

	# find starting and ending line
	start=`echo $mdecl | awk '{print $2}'`
	end=`egrep -ni "^ *end  *module  *$module *$" $file | sed 's/:.*//'`

	# look for use declarations
	recur=`sed -n "$start,${end}p" $file | egrep -i "^ *use " |
               sed 's/,.*//' |             # remove ", only: ..."
               awk '{print tolower($2)}' | # cast module name to lowercase
               sort | uniq                 # remove duplicates`
	modules="$modules $recur"
    fi
  done
  # remove duplicates
  modules=`echo $modules | tr " " "\n" | sort | uniq`
done

# print final list of modules
for module in $modules
do
  mdecl=`grep -i $module namedep.sh.tmp1`
  file=`echo $mdecl | awk '{print $1}'`
  echo "    $module [$file]"
done

# remove temporary file
rm -f namedep.sh.tmp1