[perl #18256] xsubpp can make nested comments in C code
Nicholas Clark [Thu, 7 Nov 2002 14:58:14 +0000 (14:58 +0000)]
From: Nicholas Clark (via RT) <perlbug@perl.org>
Message-Id: <rt-18256-41218.19.7625495305233@bugs6.perl.org>

p4raw-id: //depot/perl@18270

lib/ExtUtils/xsubpp

index 08df7e3..647ffd7 100755 (executable)
@@ -907,7 +907,19 @@ while (<$FH>) {
         my $podstartline = $.;
        do {
            if (/^=cut\s*$/) {
-               print("/* Skipped embedded POD. */\n");
+               # We can't just write out a /* */ comment, as our embedded
+               # POD might itself be in a comment. We can't put a /**/
+               # comment inside #if 0, as the C standard says that the source
+               # file is decomposed into preprocessing characters in the stage
+               # before preprocessing commands are executed.
+               # I don't want to leave the text as barewords, because the spec
+               # isn't clear whether macros are expanded before or after
+               # preprocessing commands are executed, and someone pathological
+               # may just have defined one of the 3 words as a macro that does
+               # something strange. Multiline strings are illegal in C, so
+               # the "" we write must be a string literal. And they aren't
+               # concatenated until 2 steps later, so we are safe.
+               print("#if 0\n  \"Skipped embedded POD.\"\n#endif\n");
                printf("#line %d \"$filename\"\n", $. + 1)
                  if $WantLineNumbers;
                next firstmodule