This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Handle "literal string" args
authorKarl Williamson <khw@cpan.org>
Wed, 14 Aug 2019 22:42:46 +0000 (16:42 -0600)
committerNicolas R <atoomic@cpan.org>
Fri, 27 Sep 2019 22:39:30 +0000 (16:39 -0600)
Some of the macros in perl require an argument to be a literal C string,
that is, one enclosed in quotation marks.  This change causes trim_arg()
to recognize these and return them properly, and apicheck.pl to use the
passed string directly as the argument.

(cherry picked from commit bc85e4126fa938abcaecadef4cbd8678da215250)
Signed-off-by: Nicolas R <atoomic@cpan.org>
dist/Devel-PPPort/parts/apicheck.pl
dist/Devel-PPPort/parts/ppptools.pl

index 9935f07..425f620 100644 (file)
@@ -271,7 +271,9 @@ for $f (@f) {   # Loop through all the tests to add
     }
 
     # Split this type into its components
-    my($n, $p, $d) = $a =~ /^ ( \w+ (?: \s+ \w+ )* )     # type name  => $n
+    my($n, $p, $d) = $a =~ /^ (  (?: " [^"]* " )      # literal string type => $n
+                               | (?: \w+ (?: \s+ \w+ )* )    # name of type => $n
+                              )
                               \s*
                               ( \** )                 # optional pointer(s) => $p
                               (?: \s* \b const \b \s* )? # opt. const
@@ -290,9 +292,8 @@ for $f (@f) {   # Loop through all the tests to add
     # Certain types, like 'void', get remapped.
     $n = $tmap{$n} || $n;
 
-    # Use a literal of our choosing for non-format functions
-    if ($n =~ /\bconst\s+char\b/ and $p eq '*' and !$f->{'flags'}{'f'}) {
-      push @arg, '"foo"';
+    if ($n =~ / ^ " [^"]* " $/x) {  # Use the literal string, literally
+      push @arg, $n;
     }
     else {
       my $v = 'arg' . $i++;     # Argument number
index b6108e2..d85e5f8 100644 (file)
@@ -258,6 +258,9 @@ sub trim_arg        # Splits the argument into type and name, returning the
     if( s/\b(?:char|double|float|int|long|short|signed|unsigned|void)\b//g ) {
       /^ \s* (\w+) \s* $/x and $name = $1;    # Similarly for these
     }
+    elsif (/^ \s* " [^"]+ " \s+ (\w+) \s* $/x) { # A literal string (is special)
+        $name = $1;
+    }
     else {
       /^ \s* \w+ \s+ (\w+) \s* $/x and $name = $1; # Everything else.
     }