Re: [PATCH v3 01/56] scripts: kernel-doc: fix typedef parsing

From: Jonathan Corbet
Date: Fri Oct 23 2020 - 13:22:30 EST


On Fri, 23 Oct 2020 18:32:48 +0200
Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> wrote:

> The include/linux/genalloc.h file defined this typedef:
>
> typedef unsigned long (*genpool_algo_t)(unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data, struct gen_pool *pool, unsigned long start_addr);
>
> Because it has a type composite of two words (unsigned long),
> the parser gets the typedef name wrong:
>
> .. c:macro:: long
>
> **Typedef**: Allocation callback function type definition
>
> Fix the regex in order to accept composite types when
> defining a typedef for a function pointer.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
> ---
> scripts/kernel-doc | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/scripts/kernel-doc b/scripts/kernel-doc
> index 99cd8418ff8a..311d213ee74d 100755
> --- a/scripts/kernel-doc
> +++ b/scripts/kernel-doc
> @@ -1438,7 +1438,7 @@ sub dump_typedef($$) {
> $x =~ s@/\*.*?\*/@@gos; # strip comments.
>
> # Parse function prototypes
> - if ($x =~ /typedef\s+(\w+)\s*\(\*\s*(\w\S+)\s*\)\s*\((.*)\);/ ||
> + if ($x =~ /typedef\s+(\w+\s*){1,}\(\*\s*(\w\S+)\s*\)\s*\((.*)\);/ ||

I sure wish we could find a way to make all these regexes more
understandable and maintainable. Reviewing a change like this is ... fun.

Anyway, it seems to work, but it does now include trailing whitespace in
the type portion. So, for example, from include/linux/xarray.h:

typedef void (*xa_update_node_t)(struct xa_node *node);

The type is parsed as "void " where it was "void" before. The only ill
effect I can see is that some non-breaking spaces get inserted into the
HTML output, but perhaps it's worth stripping off that trailing space
anyway?

Thanks,

jon