MacroCollector: default to not including intermediate macros

By default, exclude macros whose numerical value is not a valid member
of the semantic type (e.g. PSA_ALG_xxx_BASE is not itself an
algorithm, only an intermediate value used to construct others). But
do include them with include_intermediate=True, which
generate_psa_constants.py does.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
diff --git a/scripts/generate_psa_constants.py b/scripts/generate_psa_constants.py
index 4f8b87b..01c5a32 100755
--- a/scripts/generate_psa_constants.py
+++ b/scripts/generate_psa_constants.py
@@ -213,6 +213,9 @@
     2. Call `write_file` to write ``psa_constant_names_generated.c``.
     """
 
+    def __init__(self):
+        super().__init__(include_intermediate=True)
+
     @staticmethod
     def _make_return_case(name):
         return 'case %(name)s: return "%(name)s";' % {'name': name}
diff --git a/scripts/mbedtls_dev/macro_collector.py b/scripts/mbedtls_dev/macro_collector.py
index 0f7be60..ca27779 100644
--- a/scripts/mbedtls_dev/macro_collector.py
+++ b/scripts/mbedtls_dev/macro_collector.py
@@ -22,7 +22,15 @@
     """Collect PSA crypto macro definitions from C header files.
     """
 
-    def __init__(self):
+    def __init__(self, include_intermediate=False):
+        """Set up an object to collect PSA macro definitions.
+
+        Call the read_file method of the constructed object on each header file.
+
+        * include_intermediate: if true, include intermediate macros such as
+          PSA_XXX_BASE that do not designate semantic values.
+        """
+        self.include_intermediate = include_intermediate
         self.statuses = set()
         self.key_types = set()
         self.key_types_from_curve = {}
@@ -37,6 +45,11 @@
 
     def is_internal_name(self, name):
         """Whether this is an internal macro. Internal macros will be skipped."""
+        if not self.include_intermediate:
+            if name.endswith('_BASE') or name.endswith('_NONE'):
+                return True
+            if '_CATEGORY_' in name:
+                return True
         return name.endswith('_FLAG') or name.endswith('MASK')
 
     # "#define" followed by a macro name with either no parameters