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