kernel-doc (a4345a7cecfb91ae78cd43d26b0c6a956420761a) kernel-doc (e86bdb24375a810ea7993d64ed406a803db71225)
1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3
4use warnings;
5use strict;
6
7## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
8## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ##

--- 392 unchanged lines hidden (view full) ---

401 '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:([^:].*)?$';
402my $doc_content = $doc_com_body . '(.*)';
403my $doc_block = $doc_com . 'DOC:\s*(.*)?';
404my $doc_inline_start = '^\s*/\*\*\s*$';
405my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
406my $doc_inline_end = '^\s*\*/\s*$';
407my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
408my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3
4use warnings;
5use strict;
6
7## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ##
8## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ##

--- 392 unchanged lines hidden (view full) ---

401 '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:([^:].*)?$';
402my $doc_content = $doc_com_body . '(.*)';
403my $doc_block = $doc_com . 'DOC:\s*(.*)?';
404my $doc_inline_start = '^\s*/\*\*\s*$';
405my $doc_inline_sect = '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)';
406my $doc_inline_end = '^\s*\*/\s*$';
407my $doc_inline_oneline = '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$';
408my $export_symbol = '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;';
409my $function_pointer = qr{([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)};
410my $attribute = qr{__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)}i;
409
410my %parameterdescs;
411my %parameterdesc_start_lines;
412my @parameterlist;
413my %sections;
414my @sectionlist;
415my %section_start_lines;
416my $sectcheck;

--- 272 unchanged lines hidden (view full) ---

689 $count = 0;
690 my $parenth = "(";
691 my $post = ",";
692 foreach my $parameter (@{$args{'parameterlist'}}) {
693 if ($count == $#{$args{'parameterlist'}}) {
694 $post = ");";
695 }
696 $type = $args{'parametertypes'}{$parameter};
411
412my %parameterdescs;
413my %parameterdesc_start_lines;
414my @parameterlist;
415my %sections;
416my @sectionlist;
417my %section_start_lines;
418my $sectcheck;

--- 272 unchanged lines hidden (view full) ---

691 $count = 0;
692 my $parenth = "(";
693 my $post = ",";
694 foreach my $parameter (@{$args{'parameterlist'}}) {
695 if ($count == $#{$args{'parameterlist'}}) {
696 $post = ");";
697 }
698 $type = $args{'parametertypes'}{$parameter};
697 if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
699 if ($type =~ m/$function_pointer/) {
698 # pointer-to-function
699 print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" . $post . "\"\n";
700 } else {
701 $type =~ s/([^\*])$/$1 /;
702 print ".BI \"" . $parenth . $type . "\" " . " \"" . $post . "\"\n";
703 }
704 $count++;
705 $parenth = "";

--- 263 unchanged lines hidden (view full) ---

969 my $count = 0;
970 foreach my $parameter (@{$args{'parameterlist'}}) {
971 if ($count ne 0) {
972 print ", ";
973 }
974 $count++;
975 $type = $args{'parametertypes'}{$parameter};
976
700 # pointer-to-function
701 print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" . $post . "\"\n";
702 } else {
703 $type =~ s/([^\*])$/$1 /;
704 print ".BI \"" . $parenth . $type . "\" " . " \"" . $post . "\"\n";
705 }
706 $count++;
707 $parenth = "";

--- 263 unchanged lines hidden (view full) ---

971 my $count = 0;
972 foreach my $parameter (@{$args{'parameterlist'}}) {
973 if ($count ne 0) {
974 print ", ";
975 }
976 $count++;
977 $type = $args{'parametertypes'}{$parameter};
978
977 if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
979 if ($type =~ m/$function_pointer/) {
978 # pointer-to-function
979 print $1 . $parameter . ") (" . $2 . ")";
980 } else {
981 print $type;
982 }
983 }
984 if ($is_macro) {
985 print ")``\n\n";

--- 220 unchanged lines hidden (view full) ---

1206
1207sub dump_struct($$) {
1208 my $x = shift;
1209 my $file = shift;
1210 my $decl_type;
1211 my $members;
1212 my $type = qr{struct|union};
1213 # For capturing struct/union definition body, i.e. "{members*}qualifiers*"
980 # pointer-to-function
981 print $1 . $parameter . ") (" . $2 . ")";
982 } else {
983 print $type;
984 }
985 }
986 if ($is_macro) {
987 print ")``\n\n";

--- 220 unchanged lines hidden (view full) ---

1208
1209sub dump_struct($$) {
1210 my $x = shift;
1211 my $file = shift;
1212 my $decl_type;
1213 my $members;
1214 my $type = qr{struct|union};
1215 # For capturing struct/union definition body, i.e. "{members*}qualifiers*"
1214 my $definition_body = qr{\{(.*)\}(?:\s*(?:__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned|__attribute__\s*\(\([a-z0-9,_\s\(\)]*\)\)))*};
1216 my $qualifiers = qr{$attribute|__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned};
1217 my $definition_body = qr{\{(.*)\}\s*$qualifiers*};
1218 my $struct_members = qr{($type)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;};
1215
1216 if ($x =~ /($type)\s+(\w+)\s*$definition_body/) {
1217 $decl_type = $1;
1218 $declaration_name = $2;
1219 $members = $3;
1220 } elsif ($x =~ /typedef\s+($type)\s*$definition_body\s*(\w+)\s*;/) {
1221 $decl_type = $1;
1222 $declaration_name = $3;

--- 7 unchanged lines hidden (view full) ---

1230 }
1231
1232 # ignore members marked private:
1233 $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi;
1234 $members =~ s/\/\*\s*private:.*//gosi;
1235 # strip comments:
1236 $members =~ s/\/\*.*?\*\///gos;
1237 # strip attributes
1219
1220 if ($x =~ /($type)\s+(\w+)\s*$definition_body/) {
1221 $decl_type = $1;
1222 $declaration_name = $2;
1223 $members = $3;
1224 } elsif ($x =~ /typedef\s+($type)\s*$definition_body\s*(\w+)\s*;/) {
1225 $decl_type = $1;
1226 $declaration_name = $3;

--- 7 unchanged lines hidden (view full) ---

1234 }
1235
1236 # ignore members marked private:
1237 $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi;
1238 $members =~ s/\/\*\s*private:.*//gosi;
1239 # strip comments:
1240 $members =~ s/\/\*.*?\*\///gos;
1241 # strip attributes
1238 $members =~ s/\s*__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)/ /gi;
1242 $members =~ s/\s*$attribute/ /gi;
1239 $members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
1240 $members =~ s/\s*__packed\s*/ /gos;
1241 $members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
1242 $members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
1243 $members =~ s/\s*____cacheline_aligned/ /gos;
1244
1243 $members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
1244 $members =~ s/\s*__packed\s*/ /gos;
1245 $members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
1246 $members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
1247 $members =~ s/\s*____cacheline_aligned/ /gos;
1248
1249 my $args = qr{([^,)]+)};
1245 # replace DECLARE_BITMAP
1246 $members =~ s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1, __ETHTOOL_LINK_MODE_MASK_NBITS)/gos;
1250 # replace DECLARE_BITMAP
1251 $members =~ s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DECLARE_BITMAP($1, __ETHTOOL_LINK_MODE_MASK_NBITS)/gos;
1247 $members =~ s/DECLARE_BITMAP\s*\(([^,)]+),\s*([^,)]+)\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos;
1252 $members =~ s/DECLARE_BITMAP\s*\($args,\s*$args\)/unsigned long $1\[BITS_TO_LONGS($2)\]/gos;
1248 # replace DECLARE_HASHTABLE
1253 # replace DECLARE_HASHTABLE
1249 $members =~ s/DECLARE_HASHTABLE\s*\(([^,)]+),\s*([^,)]+)\)/unsigned long $1\[1 << (($2) - 1)\]/gos;
1254 $members =~ s/DECLARE_HASHTABLE\s*\($args,\s*$args\)/unsigned long $1\[1 << (($2) - 1)\]/gos;
1250 # replace DECLARE_KFIFO
1255 # replace DECLARE_KFIFO
1251 $members =~ s/DECLARE_KFIFO\s*\(([^,)]+),\s*([^,)]+),\s*([^,)]+)\)/$2 \*$1/gos;
1256 $members =~ s/DECLARE_KFIFO\s*\($args,\s*$args,\s*$args\)/$2 \*$1/gos;
1252 # replace DECLARE_KFIFO_PTR
1257 # replace DECLARE_KFIFO_PTR
1253 $members =~ s/DECLARE_KFIFO_PTR\s*\(([^,)]+),\s*([^,)]+)\)/$2 \*$1/gos;
1254
1258 $members =~ s/DECLARE_KFIFO_PTR\s*\($args,\s*$args\)/$2 \*$1/gos;
1255 my $declaration = $members;
1256
1257 # Split nested struct/union elements as newer ones
1259 my $declaration = $members;
1260
1261 # Split nested struct/union elements as newer ones
1258 while ($members =~ m/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/) {
1262 while ($members =~ m/$struct_members/) {
1259 my $newmember;
1260 my $maintype = $1;
1261 my $ids = $4;
1262 my $content = $3;
1263 foreach my $id(split /,/, $ids) {
1264 $newmember .= "$maintype $id; ";
1265
1266 $id =~ s/[:\[].*//;

--- 43 unchanged lines hidden (view full) ---

1310 $newmember .= "$type $name; ";
1311 } else {
1312 $newmember .= "$type $id.$name; ";
1313 }
1314 }
1315 }
1316 }
1317 }
1263 my $newmember;
1264 my $maintype = $1;
1265 my $ids = $4;
1266 my $content = $3;
1267 foreach my $id(split /,/, $ids) {
1268 $newmember .= "$maintype $id; ";
1269
1270 $id =~ s/[:\[].*//;

--- 43 unchanged lines hidden (view full) ---

1314 $newmember .= "$type $name; ";
1315 } else {
1316 $newmember .= "$type $id.$name; ";
1317 }
1318 }
1319 }
1320 }
1321 }
1318 $members =~ s/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/$newmember/;
1322 $members =~ s/$struct_members/$newmember/;
1319 }
1320
1321 # Ignore other nested elements, like enums
1322 $members =~ s/(\{[^\{\}]*\})//g;
1323
1324 create_parameterlist($members, ';', $file, $declaration_name);
1325 check_sections($file, $declaration_name, $decl_type, $sectcheck, $struct_actual);
1326

--- 223 unchanged lines hidden (view full) ---

1550 my $args = shift;
1551 my $splitter = shift;
1552 my $file = shift;
1553 my $declaration_name = shift;
1554 my $type;
1555 my $param;
1556
1557 # temporarily replace commas inside function pointer definition
1323 }
1324
1325 # Ignore other nested elements, like enums
1326 $members =~ s/(\{[^\{\}]*\})//g;
1327
1328 create_parameterlist($members, ';', $file, $declaration_name);
1329 check_sections($file, $declaration_name, $decl_type, $sectcheck, $struct_actual);
1330

--- 223 unchanged lines hidden (view full) ---

1554 my $args = shift;
1555 my $splitter = shift;
1556 my $file = shift;
1557 my $declaration_name = shift;
1558 my $type;
1559 my $param;
1560
1561 # temporarily replace commas inside function pointer definition
1558 while ($args =~ /(\([^\),]+),/) {
1559 $args =~ s/(\([^\),]+),/$1#/g;
1562 my $arg_expr = qr{\([^\),]+};
1563 while ($args =~ /$arg_expr,/) {
1564 $args =~ s/($arg_expr),/$1#/g;
1560 }
1561
1562 foreach my $arg (split($splitter, $args)) {
1563 # strip comments
1564 $arg =~ s/\/\*.*\*\///;
1565 # strip leading/trailing spaces
1566 $arg =~ s/^\s*//;
1567 $arg =~ s/\s*$//;

--- 134 unchanged lines hidden (view full) ---

1702 my ($px, $sx);
1703 my $prm_clean; # strip trailing "[array size]" and/or beginning "*"
1704
1705 foreach $sx (0 .. $#sects) {
1706 $err = 1;
1707 foreach $px (0 .. $#prms) {
1708 $prm_clean = $prms[$px];
1709 $prm_clean =~ s/\[.*\]//;
1565 }
1566
1567 foreach my $arg (split($splitter, $args)) {
1568 # strip comments
1569 $arg =~ s/\/\*.*\*\///;
1570 # strip leading/trailing spaces
1571 $arg =~ s/^\s*//;
1572 $arg =~ s/\s*$//;

--- 134 unchanged lines hidden (view full) ---

1707 my ($px, $sx);
1708 my $prm_clean; # strip trailing "[array size]" and/or beginning "*"
1709
1710 foreach $sx (0 .. $#sects) {
1711 $err = 1;
1712 foreach $px (0 .. $#prms) {
1713 $prm_clean = $prms[$px];
1714 $prm_clean =~ s/\[.*\]//;
1710 $prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i;
1715 $prm_clean =~ s/$attribute//i;
1711 # ignore array size in a parameter string;
1712 # however, the original param string may contain
1713 # spaces, e.g.: addr[6 + 2]
1714 # and this appears in @prms as "addr[6" since the
1715 # parameter list is split at spaces;
1716 # hence just ignore "[..." for the sections check;
1717 $prm_clean =~ s/\[.*//;
1718

--- 85 unchanged lines hidden (view full) ---

1804 # regexps don't even start to express all the possibilities), and
1805 # so on.
1806 #
1807 # If you mess with these regexps, it's a good idea to check that
1808 # the following functions' documentation still comes out right:
1809 # - parport_register_device (function pointer parameters)
1810 # - atomic_set (macro)
1811 # - pci_match_device, __copy_to_user (long return type)
1716 # ignore array size in a parameter string;
1717 # however, the original param string may contain
1718 # spaces, e.g.: addr[6 + 2]
1719 # and this appears in @prms as "addr[6" since the
1720 # parameter list is split at spaces;
1721 # hence just ignore "[..." for the sections check;
1722 $prm_clean =~ s/\[.*//;
1723

--- 85 unchanged lines hidden (view full) ---

1809 # regexps don't even start to express all the possibilities), and
1810 # so on.
1811 #
1812 # If you mess with these regexps, it's a good idea to check that
1813 # the following functions' documentation still comes out right:
1814 # - parport_register_device (function pointer parameters)
1815 # - atomic_set (macro)
1816 # - pci_match_device, __copy_to_user (long return type)
1817 my $name = qr{[a-zA-Z0-9_~:]+};
1818 my $prototype_end1 = qr{[^\(]*};
1819 my $prototype_end2 = qr{[^\{]*};
1820 my $prototype_end = qr{\(($prototype_end1|$prototype_end2)\)};
1821 my $type1 = qr{[\w\s]+};
1822 my $type2 = qr{$type1\*+};
1812
1823
1813 if ($define && $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s+/) {
1824 if ($define && $prototype =~ m/^()($name)\s+/) {
1814 # This is an object-like macro, it has no return type and no parameter
1815 # list.
1816 # Function-like macros are not allowed to have spaces between
1817 # declaration_name and opening parenthesis (notice the \s+).
1818 $return_type = $1;
1819 $declaration_name = $2;
1820 $noret = 1;
1825 # This is an object-like macro, it has no return type and no parameter
1826 # list.
1827 # Function-like macros are not allowed to have spaces between
1828 # declaration_name and opening parenthesis (notice the \s+).
1829 $return_type = $1;
1830 $declaration_name = $2;
1831 $noret = 1;
1821 } elsif ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1822 $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1823 $prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1824 $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1825 $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1826 $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1827 $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
1828 $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1829 $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1830 $prototype =~ m/^(\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1831 $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1832 $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1833 $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1834 $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1835 $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1836 $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
1837 $prototype =~ m/^(\w+\s+\w+\s*\*+\s*\w+\s*\*+\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) {
1832 } elsif ($prototype =~ m/^()($name)\s*$prototype_end/ ||
1833 $prototype =~ m/^($type1)\s+($name)\s*$prototype_end/ ||
1834 $prototype =~ m/^($type2+)\s*($name)\s*$prototype_end/) {
1838 $return_type = $1;
1839 $declaration_name = $2;
1840 my $args = $3;
1841
1842 create_parameterlist($args, ',', $file, $declaration_name);
1843 } else {
1844 print STDERR "${file}:$.: warning: cannot understand function prototype: '$prototype'\n";
1845 return;

--- 260 unchanged lines hidden (view full) ---

2106 if ( $1 eq "" ) {
2107 $section = $section_intro;
2108 } else {
2109 $section = $1;
2110 }
2111 } elsif (/$doc_decl/o) {
2112 $identifier = $1;
2113 my $is_kernel_comment = 0;
1835 $return_type = $1;
1836 $declaration_name = $2;
1837 my $args = $3;
1838
1839 create_parameterlist($args, ',', $file, $declaration_name);
1840 } else {
1841 print STDERR "${file}:$.: warning: cannot understand function prototype: '$prototype'\n";
1842 return;

--- 260 unchanged lines hidden (view full) ---

2103 if ( $1 eq "" ) {
2104 $section = $section_intro;
2105 } else {
2106 $section = $1;
2107 }
2108 } elsif (/$doc_decl/o) {
2109 $identifier = $1;
2110 my $is_kernel_comment = 0;
2114 my $decl_start = qr{\s*\*};
2111 my $decl_start = qr{$doc_com};
2115 # test for pointer declaration type, foo * bar() - desc
2116 my $fn_type = qr{\w+\s*\*\s*};
2117 my $parenthesis = qr{\(\w*\)};
2118 my $decl_end = qr{[-:].*};
2112 # test for pointer declaration type, foo * bar() - desc
2113 my $fn_type = qr{\w+\s*\*\s*};
2114 my $parenthesis = qr{\(\w*\)};
2115 my $decl_end = qr{[-:].*};
2119 if (/^$decl_start\s*([\w\s]+?)$parenthesis?\s*$decl_end?$/) {
2116 if (/^$decl_start([\w\s]+?)$parenthesis?\s*$decl_end?$/) {
2120 $identifier = $1;
2121 }
2122 if ($identifier =~ m/^(struct|union|enum|typedef)\b\s*(\S*)/) {
2123 $decl_type = $1;
2124 $identifier = $2;
2125 $is_kernel_comment = 1;
2126 }
2127 # Look for foo() or static void foo() - description; or misspelt
2128 # identifier
2117 $identifier = $1;
2118 }
2119 if ($identifier =~ m/^(struct|union|enum|typedef)\b\s*(\S*)/) {
2120 $decl_type = $1;
2121 $identifier = $2;
2122 $is_kernel_comment = 1;
2123 }
2124 # Look for foo() or static void foo() - description; or misspelt
2125 # identifier
2129 elsif (/^$decl_start\s*$fn_type?(\w+)\s*$parenthesis?\s*$decl_end?$/ ||
2130 /^$decl_start\s*$fn_type?(\w+.*)$parenthesis?\s*$decl_end$/) {
2126 elsif (/^$decl_start$fn_type?(\w+)\s*$parenthesis?\s*$decl_end?$/ ||
2127 /^$decl_start$fn_type?(\w+.*)$parenthesis?\s*$decl_end$/) {
2131 $identifier = $1;
2132 $decl_type = 'function';
2133 $identifier =~ s/^define\s+//;
2134 $is_kernel_comment = 1;
2135 }
2136 $identifier =~ s/\s+$//;
2137
2138 $state = STATE_BODY;

--- 377 unchanged lines hidden ---
2128 $identifier = $1;
2129 $decl_type = 'function';
2130 $identifier =~ s/^define\s+//;
2131 $is_kernel_comment = 1;
2132 }
2133 $identifier =~ s/\s+$//;
2134
2135 $state = STATE_BODY;

--- 377 unchanged lines hidden ---