Thread (19 messages) 19 messages, 5 authors, 2021-05-17

Re: [RFC] scripts: kernel-doc: reduce repeated regex expressions into variables

From: Aditya Srivastava <hidden>
Date: 2021-04-23 12:20:41
Also in: linux-doc, lkml

On 23/4/21 1:03 am, Lukas Bulwahn wrote:
Aditya Srivastava [off-list ref] schrieb am Do., 22. Apr. 2021,
21:18:
quoted
There are some regex expressions in the kernel-doc script, which are used
repeatedly in the script.

Reduce such expressions into variables, which can be used everywhere.

A quick manual check found that no errors and warnings were added/removed
in this process.

Suggested-by: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Aditya Srivastava <redacted>
---
 scripts/kernel-doc | 89 ++++++++++++++++++++++++++--------------------
 1 file changed, 50 insertions(+), 39 deletions(-)
diff --git a/scripts/kernel-doc b/scripts/kernel-doc
index 2a85d34fdcd0..579c9fdd275f 100755
--- a/scripts/kernel-doc
+++ b/scripts/kernel-doc
@@ -406,6 +406,7 @@ my $doc_inline_sect =
'\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
 my $doc_inline_end = '^\s*\*/\s*$';
 my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
 my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
+my $pointer_function = qr{([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)};

 my %parameterdescs;
 my %parameterdesc_start_lines;
@@ -694,7 +695,7 @@ sub output_function_man(%) {
            $post = ");";
        }
        $type = $args{'parametertypes'}{$parameter};
-       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+       if ($type =~ m/$pointer_function/) {
            # pointer-to-function
            print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" .
$post . "\"\n";
        } else {
@@ -974,7 +975,7 @@ sub output_function_rst(%) {
        $count++;
        $type = $args{'parametertypes'}{$parameter};

-       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+       if ($type =~ m/$pointer_function/) {
            # pointer-to-function
            print $1 . $parameter . ") (" . $2 . ")";
        } else {
@@ -1210,8 +1211,14 @@ sub dump_struct($$) {
     my $decl_type;
     my $members;
     my $type = qr{struct|union};
+    my $packed = qr{__packed};
+    my $aligned = qr{__aligned};
+    my $cacheline_aligned_in_smp = qr{____cacheline_aligned_in_smp};
+    my $cacheline_aligned = qr{____cacheline_aligned};
+    my $attribute = qr{__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)}i;
     # For capturing struct/union definition body, i.e.
"{members*}qualifiers*"
-    my $definition_body =
qr{\{(.*)\}(?:\s*(?:__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned|__attribute__\s*\(\([a-z0-9,_\s\(\)]*\)\)))*};
+    my $definition_body =
qr{\{(.*)\}(?:\s*(?:$packed|$aligned|$cacheline_aligned_in_smp|$cacheline_aligned|$attribute))*};
+    my $struct_members =
qr{($type)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;};

     if ($x =~ /($type)\s+(\w+)\s*$definition_body/) {
        $decl_type = $1;
@@ -1235,27 +1242,27 @@ sub dump_struct($$) {
        # strip comments:
        $members =~ s/\/\*.*?\*\///gos;
        # strip attributes
-       $members =~ s/\s*__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)/ /gi;
-       $members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
-       $members =~ s/\s*__packed\s*/ /gos;
+       $members =~ s/\s*$attribute/ /gi;
+       $members =~ s/\s*$aligned\s*\([^;]*\)/ /gos;
+       $members =~ s/\s*$packed\s*/ /gos;
        $members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
-       $members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
-       $members =~ s/\s*____cacheline_aligned/ /gos;
+       $members =~ s/\s*$cacheline_aligned_in_smp/ /gos;
+       $members =~ s/\s*$cacheline_aligned/ /gos;

+       my $args = qr{([^,)]+)};
        # replace DECLARE_BITMAP
        $members =~
s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1,
__ETHTOOL_LINK_MODE_MASK_NBITS)/gos;
-       $members =~ s/DECLARE_BITMAP\s*\(([^,)]+),\s*([^,)]+)\)/unsigned
long $1\[BITS_TO_LONGS($2)\]/gos;
+       $members =~ s/DECLARE_BITMAP\s*\($args,\s*$args\)/unsigned long
$1\[BITS_TO_LONGS($2)\]/gos;
        # replace DECLARE_HASHTABLE
-       $members =~
s/DECLARE_HASHTABLE\s*\(([^,)]+),\s*([^,)]+)\)/unsigned long $1\[1 << (($2)
- 1)\]/gos;
+       $members =~ s/DECLARE_HASHTABLE\s*\($args,\s*$args\)/unsigned long
$1\[1 << (($2) - 1)\]/gos;
        # replace DECLARE_KFIFO
-       $members =~
s/DECLARE_KFIFO\s*\(([^,)]+),\s*([^,)]+),\s*([^,)]+)\)/$2 \*$1/gos;
+       $members =~ s/DECLARE_KFIFO\s*\($args,\s*$args,\s*$args\)/$2
\*$1/gos;
        # replace DECLARE_KFIFO_PTR
-       $members =~ s/DECLARE_KFIFO_PTR\s*\(([^,)]+),\s*([^,)]+)\)/$2
\*$1/gos;
-
+       $members =~ s/DECLARE_KFIFO_PTR\s*\($args,\s*$args\)/$2 \*$1/gos;
        my $declaration = $members;

        # Split nested struct/union elements as newer ones
-       while ($members =~
m/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/) {
+       while ($members =~ m/$struct_members/) {
                my $newmember;
                my $maintype = $1;
                my $ids = $4;
@@ -1315,7 +1322,7 @@ sub dump_struct($$) {
                                }
                        }
                }
-               $members =~
s/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/$newmember/;
+               $members =~ s/$struct_members/$newmember/;
        }

        # Ignore other nested elements, like enums
@@ -1555,8 +1562,9 @@ sub create_parameterlist($$$$) {
     my $param;

     # temporarily replace commas inside function pointer definition
-    while ($args =~ /(\([^\),]+),/) {
-       $args =~ s/(\([^\),]+),/$1#/g;
+    my $arg_expr = qr{\([^\),]+};
+    while ($args =~ /$arg_expr,/) {
+       $args =~ s/($arg_expr),/$1#/g;
     }

     foreach my $arg (split($splitter, $args)) {
@@ -1808,8 +1816,11 @@ sub dump_function($$) {
     # - parport_register_device (function pointer parameters)
     # - atomic_set (macro)
     # - pci_match_device, __copy_to_user (long return type)
+    my $name = qr{[a-zA-Z0-9_~:]+};
+    my $prototype_end1 = qr{\(([^\(]*)\)};
+    my $prototype_end2 = qr{\(([^\{]*)\)};
Why do you need end1 and end2 here?
Thanks for pointing out, Lukas. I am looking into the possibility of
combining these expressions, and testing against the files.
Please let me know if there are any more improvements possible :)

Thanks
Aditya
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help