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