1#!/bin/sh
2#
3# Copyright The Mbed TLS Contributors
4# SPDX-License-Identifier: Apache-2.0
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17
18set -eu
19
20if [ $# -ne 0 ] && [ "$1" = "--help" ]; then
21    cat <<EOF
22$0 [-v]
23This script confirms that the naming of all symbols and identifiers in mbed
24TLS are consistent with the house style and are also self-consistent.
25
26  -v    If the script fails unexpectedly, print a command trace.
27EOF
28    exit
29fi
30
31if grep --version|head -n1|grep GNU >/dev/null; then :; else
32    echo "This script requires GNU grep.">&2
33    exit 1
34fi
35
36trace=
37if [ $# -ne 0 ] && [ "$1" = "-v" ]; then
38  shift
39  trace='-x'
40  exec 2>check-names.err
41  trap 'echo "FAILED UNEXPECTEDLY, status=$?";
42        cat check-names.err' EXIT
43  set -x
44fi
45
46printf "Analysing source code...\n"
47
48sh $trace tests/scripts/list-macros.sh
49tests/scripts/list-enum-consts.pl
50sh $trace tests/scripts/list-identifiers.sh
51sh $trace tests/scripts/list-symbols.sh
52
53FAIL=0
54
55printf "\nExported symbols declared in header: "
56UNDECLARED=$( diff exported-symbols identifiers | sed -n -e 's/^< //p' )
57if [ "x$UNDECLARED" = "x" ]; then
58    echo "PASS"
59else
60    echo "FAIL"
61    echo "$UNDECLARED"
62    FAIL=1
63fi
64
65diff macros identifiers | sed -n -e 's/< //p' > actual-macros
66
67for THING in actual-macros enum-consts; do
68    printf 'Names of %s: ' "$THING"
69    test -r $THING
70    BAD=$( grep -E -v '^(MBEDTLS|PSA)_[0-9A-Z_]*[0-9A-Z]$' $THING || true )
71    UNDERSCORES=$( grep -E '.*__.*' $THING || true )
72
73    if [ "x$BAD" = "x" ] && [ "x$UNDERSCORES" = "x" ]; then
74        echo "PASS"
75    else
76        echo "FAIL"
77        echo "$BAD"
78        echo "$UNDERSCORES"
79        FAIL=1
80    fi
81done
82
83for THING in identifiers; do
84    printf 'Names of %s: ' "$THING"
85    test -r $THING
86    BAD=$( grep -E -v '^(mbedtls|psa)_[0-9a-z_]*[0-9a-z]$' $THING || true )
87    if [ "x$BAD" = "x" ]; then
88        echo "PASS"
89    else
90        echo "FAIL"
91        echo "$BAD"
92        FAIL=1
93    fi
94done
95
96printf "Likely typos: "
97sort -u actual-macros enum-consts > _caps
98HEADERS=$( ls include/mbedtls/*.h include/psa/*.h | egrep -v 'compat-1\.3\.h' )
99HEADERS="$HEADERS library/*.h"
100HEADERS="$HEADERS 3rdparty/everest/include/everest/everest.h 3rdparty/everest/include/everest/x25519.h"
101LIBRARY="$( ls library/*.c )"
102LIBRARY="$LIBRARY 3rdparty/everest/library/everest.c 3rdparty/everest/library/x25519.c"
103NL='
104'
105sed -n 's/MBED..._[A-Z0-9_]*/\'"$NL"'&\'"$NL"/gp \
106    $HEADERS $LIBRARY \
107    | grep MBEDTLS | sort -u > _MBEDTLS_XXX
108TYPOS=$( diff _caps _MBEDTLS_XXX | sed -n 's/^> //p' \
109            | egrep -v 'XXX|__|_$|^MBEDTLS_.*CONFIG_FILE$' || true )
110rm _MBEDTLS_XXX _caps
111if [ "x$TYPOS" = "x" ]; then
112    echo "PASS"
113else
114    echo "FAIL"
115    echo "$TYPOS"
116    FAIL=1
117fi
118
119if [ -n "$trace" ]; then
120  set +x
121  trap - EXIT
122  rm check-names.err
123fi
124
125printf "\nOverall: "
126if [ "$FAIL" -eq 0 ]; then
127    rm macros actual-macros enum-consts identifiers exported-symbols
128    echo "PASSED"
129    exit 0
130else
131    echo "FAILED"
132    exit 1
133fi
134