xref: /aosp_15_r20/external/mbedtls/tests/scripts/check-doxy-blocks.pl (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi#!/usr/bin/env perl
2*62c56f98SSadaf Ebrahimi
3*62c56f98SSadaf Ebrahimi# Detect comment blocks that are likely meant to be doxygen blocks but aren't.
4*62c56f98SSadaf Ebrahimi#
5*62c56f98SSadaf Ebrahimi# More precisely, look for normal comment block containing '\'.
6*62c56f98SSadaf Ebrahimi# Of course one could use doxygen warnings, eg with:
7*62c56f98SSadaf Ebrahimi#   sed -e '/EXTRACT/s/YES/NO/' doxygen/mbedtls.doxyfile | doxygen -
8*62c56f98SSadaf Ebrahimi# but that would warn about any undocumented item, while our goal is to find
9*62c56f98SSadaf Ebrahimi# items that are documented, but not marked as such by mistake.
10*62c56f98SSadaf Ebrahimi#
11*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors
12*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimiuse warnings;
15*62c56f98SSadaf Ebrahimiuse strict;
16*62c56f98SSadaf Ebrahimiuse File::Basename;
17*62c56f98SSadaf Ebrahimi
18*62c56f98SSadaf Ebrahimi# C/header files in the following directories will be checked
19*62c56f98SSadaf Ebrahimimy @directories = qw(include/mbedtls library doxygen/input);
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf Ebrahimi# very naive pattern to find directives:
22*62c56f98SSadaf Ebrahimi# everything with a backslach except '\0' and backslash at EOL
23*62c56f98SSadaf Ebrahimimy $doxy_re = qr/\\(?!0|\n)/;
24*62c56f98SSadaf Ebrahimi
25*62c56f98SSadaf Ebrahimi# Return an error code to the environment if a potential error in the
26*62c56f98SSadaf Ebrahimi# source code is found.
27*62c56f98SSadaf Ebrahimimy $exit_code = 0;
28*62c56f98SSadaf Ebrahimi
29*62c56f98SSadaf Ebrahimisub check_file {
30*62c56f98SSadaf Ebrahimi    my ($fname) = @_;
31*62c56f98SSadaf Ebrahimi    open my $fh, '<', $fname or die "Failed to open '$fname': $!\n";
32*62c56f98SSadaf Ebrahimi
33*62c56f98SSadaf Ebrahimi    # first line of the last normal comment block,
34*62c56f98SSadaf Ebrahimi    # or 0 if not in a normal comment block
35*62c56f98SSadaf Ebrahimi    my $block_start = 0;
36*62c56f98SSadaf Ebrahimi    while (my $line = <$fh>) {
37*62c56f98SSadaf Ebrahimi        $block_start = $.   if $line =~ m/\/\*(?![*!])/;
38*62c56f98SSadaf Ebrahimi        $block_start = 0    if $line =~ m/\*\//;
39*62c56f98SSadaf Ebrahimi        if ($block_start and $line =~ m/$doxy_re/) {
40*62c56f98SSadaf Ebrahimi            print "$fname:$block_start: directive on line $.\n";
41*62c56f98SSadaf Ebrahimi            $block_start = 0; # report only one directive per block
42*62c56f98SSadaf Ebrahimi            $exit_code = 1;
43*62c56f98SSadaf Ebrahimi        }
44*62c56f98SSadaf Ebrahimi    }
45*62c56f98SSadaf Ebrahimi
46*62c56f98SSadaf Ebrahimi    close $fh;
47*62c56f98SSadaf Ebrahimi}
48*62c56f98SSadaf Ebrahimi
49*62c56f98SSadaf Ebrahimisub check_dir {
50*62c56f98SSadaf Ebrahimi    my ($dirname) = @_;
51*62c56f98SSadaf Ebrahimi    for my $file (<$dirname/*.[ch]>) {
52*62c56f98SSadaf Ebrahimi        check_file($file);
53*62c56f98SSadaf Ebrahimi    }
54*62c56f98SSadaf Ebrahimi}
55*62c56f98SSadaf Ebrahimi
56*62c56f98SSadaf Ebrahimi# Check that the script is being run from the project's root directory.
57*62c56f98SSadaf Ebrahimifor my $dir (@directories) {
58*62c56f98SSadaf Ebrahimi    if (! -d $dir) {
59*62c56f98SSadaf Ebrahimi        die "This script must be run from the Mbed TLS root directory";
60*62c56f98SSadaf Ebrahimi    } else {
61*62c56f98SSadaf Ebrahimi        check_dir($dir)
62*62c56f98SSadaf Ebrahimi    }
63*62c56f98SSadaf Ebrahimi}
64*62c56f98SSadaf Ebrahimi
65*62c56f98SSadaf Ebrahimiexit $exit_code;
66*62c56f98SSadaf Ebrahimi
67*62c56f98SSadaf Ebrahimi__END__
68