buildtools: detect discrepancies for experimental symbols
[dpdk.git] / buildtools / map-list-symbol.sh
diff --git a/buildtools/map-list-symbol.sh b/buildtools/map-list-symbol.sh
new file mode 100755 (executable)
index 0000000..5509b4a
--- /dev/null
@@ -0,0 +1,70 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2018 David Marchand <david.marchand@redhat.com>
+
+section=all
+symbol=all
+quiet=
+
+while getopts 'S:s:q' name; do
+       case $name in
+       S)
+               [ $section = 'all' ] || {
+                       echo 'Cannot list in multiple sections'
+                       exit 1
+               }
+               section=$OPTARG
+       ;;
+       s)
+               [ $symbol = 'all' ] || {
+                       echo 'Cannot list multiple symbols'
+                       exit 1
+               }
+               symbol=$OPTARG
+       ;;
+       q)
+               quiet='y'
+       ;;
+       ?)
+               echo 'usage: $0 [-S section] [-s symbol] [-q]'
+               exit 1
+       ;;
+       esac
+done
+
+shift $(($OPTIND - 1))
+
+for file in $@; do
+       cat "$file" |awk '
+       BEGIN {
+               current_section = "";
+               if ("'$section'" == "all" && "'$symbol'" == "all") {
+                       ret = 0;
+               } else {
+                       ret = 1;
+               }
+       }
+       /^.*{/ {
+               if ("'$section'" == "all" || $1 == "'$section'") {
+                       current_section = $1;
+               }
+       }
+       /.*}/ { current_section = ""; }
+       /^[^}].*[^:*];/ {
+               if (current_section != "") {
+                       gsub(";","");
+                       if ("'$symbol'" == "all" || $1 == "'$symbol'") {
+                               ret = 0;
+                               if ("'$quiet'" == "") {
+                                       print "'$file' "current_section" "$1;
+                               }
+                               if ("'$symbol'" != "all") {
+                                       exit 0;
+                               }
+                       }
+               }
+       }
+       END {
+               exit ret;
+       }'
+done