This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
makedepend.SH: Deal with continuation lines
authorKarl Williamson <public@khwilliamson.com>
Sat, 23 Feb 2013 22:41:28 +0000 (15:41 -0700)
committerKarl Williamson <public@khwilliamson.com>
Mon, 25 Feb 2013 03:20:40 +0000 (20:20 -0700)
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.

makedepend.SH

index 14c546f..4bfb325 100755 (executable)
@@ -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