dtstyle: Coverity 89011
[oweals/cde.git] / cde / util / scripts / mdepend.cpp
1 XCOMM!/bin/sh
2 XCOMM
3 XCOMM $XConsortium: mdepend.cpp,v 1.7 91/08/22 11:42:53 rws Exp $
4 XCOMM
5 XCOMM   Do the equivalent of the 'makedepend' program, but do it right.
6 XCOMM
7 XCOMM   Usage:
8 XCOMM
9 XCOMM   makedepend [cpp-flags] [-w width] [-s magic-string] [-f makefile]
10 XCOMM     [-o object-suffix]
11 XCOMM
12 XCOMM   Notes:
13 XCOMM
14 XCOMM   The C compiler used can be overridden with the environment
15 XCOMM   variable "CC".
16 XCOMM
17 XCOMM   The "-v" switch of the "makedepend" program is not supported.
18 XCOMM
19 XCOMM
20 XCOMM   This script should
21 XCOMM   work on both USG and BSD systems.  However, when System V.4 comes out,
22 XCOMM   USG users will probably have to change "silent" to "-s" instead of
23 XCOMM   "-" (at least, that is what the documentation implies).
24 XCOMM
25 CC=PREPROC
26
27 silent='-'
28
29 TMP=/tmp/mdep$$
30 CPPCMD=${TMP}a
31 DEPENDLINES=${TMP}b
32 TMPMAKEFILE=${TMP}c
33 MAGICLINE=${TMP}d
34 ARGS=${TMP}e
35
36 trap "rm -f ${TMP}*; exit 1" 1 2 15
37 trap "rm -f ${TMP}*; exit 0" 1 2 13
38
39 echo " \c" > $CPPCMD
40 if [ `wc -c < $CPPCMD` -eq 1 ]
41 then
42     c="\c"
43     n=
44 else
45     c=
46     n="-n"
47 fi
48
49 echo $n "$c" >$ARGS
50
51 files=
52 makefile=
53 magic_string='# DO NOT DELETE'
54 objsuffix='.o'
55 width=78
56 endmarker=""
57 verbose=n
58
59 while [ $# != 0 ]
60 do
61     if [ "$endmarker"x != x -a "$endmarker" = "$1" ]; then
62         endmarker=""
63     else
64         case "$1" in
65             -D*|-I*)
66                 echo $n " '$1'$c" >> $ARGS
67                 ;;
68
69             -g|-o)
70                 ;;
71
72             *)
73                 if [ "$endmarker"x = x ]; then
74                     case "$1" in        
75                         -w)
76                             width="$2"
77                             shift
78                             ;;
79                         -s)
80                             magic_string="$2"
81                             shift
82                             ;;
83                         -f)
84                             makefile="$2"
85                             shift
86                             ;;
87                         -o)
88                             objsuffix="$2"
89                             shift
90                             ;;
91                         
92                         --*)
93                             echo "$1" | sed 's/^\-\-//' >${TMP}end
94                             endmarker="`cat ${TMP}end`"
95                             rm -f ${TMP}end
96                             if [ "$endmarker"x = x ]; then
97                                 endmarker="--"
98                             fi
99                             ;;
100                         -v)
101                             verbose="y"
102                             ;;
103
104                         -cc)
105                             CC="$2"
106                             shift
107                             ;;
108
109                         -*)
110                             echo "Unknown option '$1' ignored" 1>&2
111                             ;;
112                         *)
113                             files="$files $1"
114                             ;;
115                     esac
116                 fi
117                 ;;
118         esac
119     fi
120     shift
121 done
122 echo ' $*' >> $ARGS
123
124 echo "exec $CC `cat $ARGS`" > $CPPCMD
125 chmod +x $CPPCMD
126 rm $ARGS
127
128 case "$makefile" in
129     '')
130         if [ -r makefile ]
131         then
132             makefile=makefile
133         elif [ -r Makefile ]
134         then
135             makefile=Makefile
136         else
137             echo 'no makefile or Makefile found' 1>&2
138             exit 1
139         fi
140         ;;
141     -)
142         makefile=$TMPMAKEFILE
143         ;;
144 esac
145
146 if [ "$verbose"x = "y"x ]; then 
147     cat $CPPCMD
148 fi
149
150 echo '' > $DEPENDLINES
151 for i in $files
152 do
153     $CPPCMD $i \
154       | sed -n "/^#/s;^;$i ;p"
155 done \
156   | sed -e 's|/[^/.][^/]*/\.\.||g' -e 's|/\.[^.][^/]*/\.\.||g' \
157     -e 's|"||g' -e 's| \./| |' \
158   | awk '{
159         if ($1 != $4  &&  $2 != "#ident")
160             {
161             ofile = substr ($1, 1, length ($1) - 2) "'"$objsuffix"'"
162             print ofile, $4
163             }
164         }' \
165   | sort -u \
166   | awk '
167             {
168             newrec = rec " " $2
169             if ($1 != old1)
170                 {
171                 old1 = $1
172                 if (rec != "")
173                     print rec
174                 rec = $1 ": " $2
175                 }
176             else if (length (newrec) > '"$width"')
177                 {
178                 print rec
179                 rec = $1 ": " $2
180                 }
181             else
182                 rec = newrec
183             }
184         END \
185             {
186             if (rec != "")
187                 print rec
188             }' \
189   | egrep -v '^[^:]*:[  ]*$' >> $DEPENDLINES
190
191 trap "" 1 2 13 15       # Now we are committed
192 case "$makefile" in
193     $TMPMAKEFILE)
194         ;;
195     *)
196         rm -f $makefile.bak
197         cp $makefile $makefile.bak
198         echo "Appending dependencies to $makefile"
199         ;;
200 esac
201
202 XCOMM
203 XCOMM Append the magic string and a blank line so that /^$magic_string/+1,\$d
204 XCOMM can be used to delete everything from after the magic string to the end
205 XCOMM of the file.  Then, append a blank line again and then the dependencies.
206 XCOMM
207 cat >> $makefile << END_OF_APPEND
208
209 $magic_string
210
211 END_OF_APPEND
212 ed $silent $makefile << END_OF_ED_SCRIPT
213 /^$magic_string/+1,\$d
214 w
215 q
216 END_OF_ED_SCRIPT
217 echo '' >>$makefile
218 cat $DEPENDLINES >>$makefile
219
220 case "$makefile" in
221     $TMPMAKEFILE)
222         cat $TMPMAKEFILE
223         ;;
224
225 esac
226
227 rm -f ${TMP}*
228 exit 0