From nobody Sun Oct 5 18:19:56 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79EF18F49; Fri, 1 Aug 2025 00:13:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754007225; cv=none; b=CDeU4BP8jesYJDfNVr7dxhipKc/VJ1Kzx5AKGohOdrCpjaNFiiy2FX0jMS0GdUuiCYy4qAA0kMLvMKBGhJ/NvYVdlUxyd9SenpheR3YmPfDZMMsAvFReY8cPAchN5w/ABnSRam074/W6/sHiYlLlsOYROarFdByz8qPW2QC8zWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754007225; c=relaxed/simple; bh=zMNGkKDVtrQYR1g6zgUl8wLnLKe4Yun+oWNyM5XI148=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W5v6/mhqjUI9V13g1VXffCa17dBKF7NtoTHkNk67+sCXotzNqXN/O/7vtafeckhu0oRcQ8sBdmNsczxmv76vHdqikjsHlsrHh/VxBQ7khsk1dFLmNdHiOYSs73UUmLn1czRr8qQQKjtjtwDFk7m5jzVmfULSTMx9LY5ik16U25A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=Ep9y+nvM; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="Ep9y+nvM" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 635CD40AEA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1754007217; bh=Mq7zonfROPmRJEB1Vu+YlKjYMNVLogYxufUGthhqAMI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ep9y+nvMg4DP2tYtX47Zdh//cOTkLUXRGZjNabtX+LXM4divpOWoucShqG0ssjYyB VVtMx6ydPIJG9ruvjPRjfLPZaT/0hvnSvlNyGNU3hd51QTklrVpbxhfECszz1/oQ1s GxYbwDxrqa0YRXg3HEg0BfP6EX6MqeJRh0h15H2X+xbg3JutfWwjKYAyD9VSWeWFJb FAWCs6tOOKv6fKWoK9cEqfiP8mY6tz/aGiBhZMhAgJiVLtScZ5loD4k77yXZPAljXk KCNMdyE7wiOdpTAvSdV6l9QPSRxxfv0d0ID2V5uPKMkOTakdYjpQUvwQo2OR7m+z6t vOFbeLgv/X2PQ== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 635CD40AEA; Fri, 1 Aug 2025 00:13:37 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Jonathan Corbet Subject: [PATCH 05/12] docs: kdoc: split top-level prototype parsing out of dump_struct() Date: Thu, 31 Jul 2025 18:13:19 -0600 Message-ID: <20250801001326.924276-6-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250801001326.924276-1-corbet@lwn.net> References: <20250801001326.924276-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the initial split of the prototype into its own function in the ongoing effort to cut dump_struct() down to size. Signed-off-by: Jonathan Corbet Reviewed-by: Mauro Carvalho Chehab --- scripts/lib/kdoc/kdoc_parser.py | 44 +++++++++++++++------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/scripts/lib/kdoc/kdoc_parser.py b/scripts/lib/kdoc/kdoc_parser= .py index 5e375318df9c..2bb0da22048f 100644 --- a/scripts/lib/kdoc/kdoc_parser.py +++ b/scripts/lib/kdoc/kdoc_parser.py @@ -624,13 +624,11 @@ class KernelDoc: self.emit_msg(ln, f"No description found for return value of '{dec= laration_name}'") =20 - def dump_struct(self, ln, proto): - """ - Store an entry for an struct or union - """ - + # + # Split apart a structure prototype; returns (struct|union, name, memb= ers) or None + # + def split_struct_proto(self, proto): type_pattern =3D r'(struct|union)' - qualifiers =3D [ "__attribute__", "__packed", @@ -638,36 +636,34 @@ class KernelDoc: "____cacheline_aligned_in_smp", "____cacheline_aligned", ] - definition_body =3D r'\{(.*)\}\s*' + "(?:" + '|'.join(qualifiers) = + ")?" =20 - # Extract struct/union definition - members =3D None - declaration_name =3D None - decl_type =3D None - r =3D KernRe(type_pattern + r'\s+(\w+)\s*' + definition_body) if r.search(proto): - decl_type =3D r.group(1) - declaration_name =3D r.group(2) - members =3D r.group(3) + return (r.group(1), r.group(2), r.group(3)) else: r =3D KernRe(r'typedef\s+' + type_pattern + r'\s*' + definitio= n_body + r'\s*(\w+)\s*;') - if r.search(proto): - decl_type =3D r.group(1) - declaration_name =3D r.group(3) - members =3D r.group(2) + return (r.group(1), r.group(3), r.group(2)) + return None =20 - if not members: + def dump_struct(self, ln, proto): + """ + Store an entry for an struct or union + """ + # + # Do the basic parse to get the pieces of the declaration. + # + struct_parts =3D self.split_struct_proto(proto) + if not struct_parts: self.emit_msg(ln, f"{proto} error: Cannot parse struct or unio= n!") return + decl_type, declaration_name, members =3D struct_parts =20 if self.entry.identifier !=3D declaration_name: - self.emit_msg(ln, - f"expecting prototype for {decl_type} {self.entr= y.identifier}. Prototype was for {decl_type} {declaration_name} instead\n") + self.emit_msg(ln, f"expecting prototype for {decl_type} {self.= entry.identifier}. " + f"Prototype was for {decl_type} {declaration_nam= e} instead\n") return - # # Go through the list of members applying all of our transformatio= ns. # @@ -696,7 +692,7 @@ class KernelDoc: # So, we need to have an extra loop on Python to override such # re limitation. =20 - struct_members =3D KernRe(type_pattern + r'([^{};]+)(\{)([^{}]*)(\= })([^{};]*)(;)') + struct_members =3D KernRe(r'(struct|union)([^{};]+)(\{)([^{}]*)(\}= )([^{};]*)(;)') while True: tuples =3D struct_members.findall(members) if not tuples: --=20 2.50.1