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