summaryrefslogtreecommitdiff
path: root/makedepend.SH
diff options
context:
space:
mode:
authorKarl Williamson <public@khwilliamson.com>2013-02-23 15:41:28 -0700
committerKarl Williamson <public@khwilliamson.com>2013-02-24 20:20:40 -0700
commit3c65df45eca48c6eefc4c409ab5a2e3a4fd64afd (patch)
tree495b5981a69ce39254db41212b565977a9febf96 /makedepend.SH
parent449353394bc5e632a2c75c2fbdd20126a76755de (diff)
downloadperl-3c65df45eca48c6eefc4c409ab5a2e3a4fd64afd.tar.gz
makedepend.SH: Deal with continuation lines
makedepend was failing to take into account the fact that preprocessor directives, like any line, may be continued onto succeeding lines by a trailing backslash. This led to errors in the C preprocessing, which were suppressed on all but os390 systems.o This commit alleviates that, but it is not a complete solution. It deletes C comments, but this being sed, it doesn't catch all nuances of C comments. We only care, however, about comments on preprocessor directive lines, and this is good enough to work on the current Perl without generating any errors, on my system. Spotted by John Goodyear.
Diffstat (limited to 'makedepend.SH')
-rwxr-xr-xmakedepend.SH27
1 files changed, 26 insertions, 1 deletions
diff --git a/makedepend.SH b/makedepend.SH
index 14c546f17f..4bfb3255bc 100755
--- a/makedepend.SH
+++ b/makedepend.SH
@@ -131,13 +131,38 @@ for file in `$cat .clist`; do
*) finc= ;;
esac
$echo "Finding dependencies for $filebase$_o."
+ # Below, we strip out all but preprocessor directives.
+ # We have to take care of situations like
+ # #if defined(FOO) BAR /* comment line 1
+ # more comment lines */
+ # If we just delete text starting from the '/*' to the end of line, we will
+ # screw up cases like
+ # #if defined(FOO) /* comment */ \
+ # && defined(BAR) /* comment */ \
+ # && defined(BAZ) /* comment */ \
+ # etc.
+ # This code processes these latter situations first; it assumes there is
+ # at most one straightforward comment per continued preprocessor line. (It
+ # would be easier to handle more general cases if sed had a non-greedy '*'
+ # quantifier; but typically preprocessor directive lines are rather
+ # simple.) The continuation line is joined, and the process repeated on
+ # the enlarged line as long as there are continuations. At the end, if
+ # there are any comments remaining, they should be like the first situation,
+ # and can just be deleted. (Subsequent lines of the comment are irrelevant
+ # and get dropped.)
( $echo "#line 2 \"$file\""; \
$sed -n <$file \
-e "/^${filebase}_init(/q" \
+ -e ': testcontinuation' \
+ -e '/^[ ]*#/s|/\*.*\*/||' \
+ -e '/\\$/{' \
+ -e 'N' \
+ -e 'b testcontinuation' \
+ -e '}' \
+ -e 's/\\\n/ /g' \
-e '/^#line/d' \
-e '/^[ ]*#/{' \
-e 's|/\*.*$||' \
- -e 's|\\$||' \
-e p \
-e '}' ) >UU/$file.c