parse_function_arguments: extract per-argument function

Internal refactoring only, no behavior change.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
diff --git a/tests/scripts/generate_test_code.py b/tests/scripts/generate_test_code.py
index 5066a57..53efcea 100755
--- a/tests/scripts/generate_test_code.py
+++ b/tests/scripts/generate_test_code.py
@@ -444,6 +444,40 @@
     return dependencies
 
 
+def parse_function_argument(arg, arg_idx, args, local_vars, args_dispatch):
+    """
+    Parses one test function's argument declaration.
+
+    :param arg: argument declaration.
+    :param arg_idx: current wrapper argument index.
+    :param args: accumulator of arguments' internal types.
+    :param local_vars: accumulator of internal variable declarations.
+    :param args_dispatch: accumulator of argument usage expressions.
+    :return: the number of new wrapper arguments,
+             or None if the argument declaration is invalid.
+    """
+    arg = arg.strip()
+    if arg == '':
+        return 0
+    if re.search(INT_CHECK_REGEX, arg.strip()):
+        args.append('int')
+        args_dispatch.append('((mbedtls_test_argument_t*)params[%d])->s32' % arg_idx)
+        return 1
+    if re.search(CHAR_CHECK_REGEX, arg.strip()):
+        args.append('char*')
+        args_dispatch.append('(char *) params[%d]' % arg_idx)
+        return 1
+    if re.search(DATA_T_CHECK_REGEX, arg.strip()):
+        args.append('hex')
+        # create a structure
+        pointer_initializer = '(uint8_t *) params[%d]' % arg_idx
+        len_initializer = '((mbedtls_test_argument_t*)params[%d])->len' % (arg_idx+1)
+        local_vars.append('    data_t data%d = {%s, %s};\n' %
+                          (arg_idx, pointer_initializer, len_initializer))
+        args_dispatch.append('&data%d' % arg_idx)
+        return 2
+    return None
+
 def parse_function_arguments(line):
     """
     Parses test function signature for validation and generates
@@ -466,28 +500,12 @@
     # i.e. the test functions will not have a function pointer
     # argument.
     for arg in line[:line.find(')')].split(','):
-        arg = arg.strip()
-        if arg == '':
-            continue
-        if re.search(INT_CHECK_REGEX, arg.strip()):
-            args.append('int')
-            args_dispatch.append('((mbedtls_test_argument_t*)params[%d])->s32' % arg_idx)
-        elif re.search(CHAR_CHECK_REGEX, arg.strip()):
-            args.append('char*')
-            args_dispatch.append('(char *) params[%d]' % arg_idx)
-        elif re.search(DATA_T_CHECK_REGEX, arg.strip()):
-            args.append('hex')
-            # create a structure
-            pointer_initializer = '(uint8_t *) params[%d]' % arg_idx
-            len_initializer = '((mbedtls_test_argument_t*)params[%d])->len' % (arg_idx+1)
-            local_vars.append('    data_t data%d = {%s, %s};\n' %
-                              (arg_idx, pointer_initializer, len_initializer))
-            args_dispatch.append('&data%d' % arg_idx)
-            arg_idx += 1
-        else:
+        indexes = parse_function_argument(arg, arg_idx,
+                                          args, local_vars, args_dispatch)
+        if indexes is None:
             raise ValueError("Test function arguments can only be 'int', "
                              "'char *' or 'data_t'\n%s" % line)
-        arg_idx += 1
+        arg_idx += indexes
 
     return args, ''.join(local_vars), args_dispatch