From 7e1d99dfd03271ff3d652f4247268b417c93b853 Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Fri, 3 Feb 2017 14:06:29 +0100
Subject: [PATCH] Removed 'any from' macros and unichar pattern warning during
 build

Change-Id: Iddeb4de1b79206a843070593a67ac29082c6dc45
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
---
 common/UnicharPattern.cc |  34 +-
 core/Array.hh            | 748 ++++++++++++++++++++++++++++++++-------
 2 files changed, 649 insertions(+), 133 deletions(-)

diff --git a/common/UnicharPattern.cc b/common/UnicharPattern.cc
index 42fe288b6..674620795 100644
--- a/common/UnicharPattern.cc
+++ b/common/UnicharPattern.cc
@@ -82,23 +82,35 @@ UnicharPattern::UnicharPattern() : mappings_head(NULL)
 {
   // if anything goes wrong while parsing the case mappings file, just delete the
   // partial results, display a warning, and treat all patterns as case-sensitive
+  FILE* fp = NULL;
   const char* ttcn3_dir = getenv("TTCN3_DIR");
-  if (ttcn3_dir == NULL) {
-    TTCN_pattern_warning("Environment variable TTCN3_DIR not present. "
-      "Case-insensitive universal charstring patterns are disabled.\n");
-    return;
+  char* mappings_file = NULL;
+  if (ttcn3_dir != NULL) {
+    size_t ttcn3_dir_len = strlen(ttcn3_dir);
+    bool ends_with_slash = ttcn3_dir_len > 0 && ttcn3_dir[ttcn3_dir_len - 1] == '/';
+    mappings_file = mprintf("%s%setc/CaseFolding.txt", ttcn3_dir,
+      ends_with_slash ? "" : "/");
+    fp = fopen(mappings_file, "r");
+    if (fp == NULL) {
+      // during the TITAN build the case mappings file has not been moved to the
+      // installation directory yet; try its original location
+      fp = fopen("../etc/CaseFolding.txt", "r");
+    }
   }
-  size_t ttcn3_dir_len = strlen(ttcn3_dir);
-  bool ends_with_slash = ttcn3_dir_len > 0 && ttcn3_dir[ttcn3_dir_len - 1] == '/';
-  char* mappings_file = mprintf("%s%setc/CaseFolding.txt", ttcn3_dir,
-    ends_with_slash ? "" : "/");
-  FILE* fp = fopen(mappings_file, "r");
   if (fp == NULL) {
-    TTCN_pattern_warning("Cannot open file '%s' for reading. "
-      "Case-insensitive universal charstring patterns are disabled.\n", mappings_file);
+    if (ttcn3_dir == NULL) {
+      TTCN_pattern_warning("Environment variable TTCN3_DIR not present. "
+        "Case-insensitive universal charstring patterns are disabled.\n");
+    }
+    else {
+      TTCN_pattern_warning("Cannot open file '%s' for reading. "
+        "Case-insensitive universal charstring patterns are disabled.\n",
+        mappings_file);
+    }
     Free(mappings_file);
     return;
   }
+  
   Free(mappings_file);
   
   // this always points to the last element of the list
diff --git a/core/Array.hh b/core/Array.hh
index 0369ffdfe..c12f6b8f9 100644
--- a/core/Array.hh
+++ b/core/Array.hh
@@ -35,90 +35,6 @@
 
 class INTEGER;
 
-/** common code for all port, timer and component operations with at least one
-  * argument, performed on arrays with the help of the 'any from' clause
-  *
-  * returns an alt status, depending on the return values of elements
-  * alt-status priority: ALT_YES (return immediately) > ALT_REPEAT > ALT_MAYBE > ALT_NO
-  */
-#define ANY_FROM_OPERATION(opname, ...) \
-  if (index_redirect != NULL) { \
-    index_redirect->incr_pos(); \
-  } \
-  alt_status result = ALT_NO; \
-  for (unsigned int i = 0; i < array_size; ++i) { \
-    alt_status ret_val = array_elements[i].opname(__VA_ARGS__, index_redirect); \
-    if (ret_val == ALT_YES) { \
-      if (index_redirect != NULL) { \
-        index_redirect->add_index((int)i + index_offset); \
-      } \
-      result = ret_val; \
-      break; \
-    } \
-    else if (ret_val == ALT_REPEAT || \
-             (ret_val == ALT_MAYBE && result == ALT_NO)) { \
-      result = ret_val; \
-    } \
-  } \
-  if (index_redirect != NULL) { \
-    index_redirect->decr_pos(); \
-  } \
-  return result;
-
-/** common code for all timer and component operations with no arguments,
-  * performed on arrays with the help of the 'any from' clause
-  *
-  * returns an alt status, depending on the return values of elements
-  * alt-status priority: ALT_YES (return immediately) > ALT_REPEAT > ALT_MAYBE > ALT_NO
-  */
-#define ANY_FROM_OPERATION_NO_ARGS(opname) \
-  if (index_redirect != NULL) { \
-    index_redirect->incr_pos(); \
-  } \
-  alt_status result = ALT_NO; \
-  for (unsigned int i = 0; i < array_size; ++i) { \
-    alt_status ret_val = array_elements[i].opname(index_redirect); \
-    if (ret_val == ALT_YES) { \
-      if (index_redirect != NULL) { \
-        index_redirect->add_index((int)i + index_offset); \
-      } \
-      result = ret_val; \
-      break; \
-    } \
-    else if (ret_val == ALT_REPEAT || \
-             (ret_val == ALT_MAYBE && result == ALT_NO)) { \
-      result = ret_val; \
-    } \
-  } \
-  if (index_redirect != NULL) { \
-    index_redirect->decr_pos(); \
-  } \
-  return result;
-
-/** common code for all port, timer and component operations with no arguments,
-  * performed on arrays with the help of the 'any from' clause
-  *
-  * returns a boolean: TRUE if at least one of the elements returns TRUE
-  */
-#define ANY_FROM_OPERATION_NO_ARGS_BOOL(opname) \
-  if (index_redirect != NULL) { \
-    index_redirect->incr_pos(); \
-  } \
-  boolean ret_val = FALSE; \
-  for (unsigned int i = 0; i < array_size; ++i) { \
-    ret_val = array_elements[i].opname(index_redirect); \
-    if (ret_val) { \
-      if (index_redirect != NULL) { \
-        index_redirect->add_index((int)i + index_offset); \
-      } \
-      break; \
-    } \
-  } \
-  if (index_redirect != NULL) { \
-    index_redirect->decr_pos(); \
-  } \
-  return ret_val;
-
 extern unsigned int get_timer_array_index(int index_value,
   unsigned int array_size, int index_offset);
 extern unsigned int get_timer_array_index(const INTEGER& index_value,
@@ -187,14 +103,52 @@ public:
     TTCN_Logger::log_event_str(" }");
   }
   
+  // alt-status priority: ALT_YES (return immediately) > ALT_REPEAT > ALT_MAYBE > ALT_NO
   alt_status timeout(Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION_NO_ARGS(timeout)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].timeout(index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   boolean running(Index_Redirect* index_redirect) const
   {
-    ANY_FROM_OPERATION_NO_ARGS_BOOL(running)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    boolean ret_val = FALSE;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      ret_val = array_elements[i].running(index_redirect);
+      if (ret_val) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        break;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return ret_val;
   }
 };
 
@@ -261,10 +215,33 @@ public:
     TTCN_Logger::log_event_str(" }");
   }
   
+  // alt-status priority: ALT_YES (return immediately) > ALT_REPEAT > ALT_MAYBE > ALT_NO
   alt_status receive(const COMPONENT_template& sender_template,
                      COMPONENT *sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(receive, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].receive(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template>
@@ -278,8 +255,29 @@ public:
                      const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(receive, value_template, NULL,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].receive(value_template, NULL,
+        sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_value_redirect, typename T_template>
@@ -289,14 +287,57 @@ public:
                      const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(receive, value_template, value_redirect,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].receive(value_template,
+        value_redirect, sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status check_receive(const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_receive, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_receive(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template>
@@ -308,8 +349,29 @@ public:
                            const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_receive, value_template, NULL,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_receive(value_template, NULL,
+        sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_value_redirect, typename T_template>
@@ -319,14 +381,57 @@ public:
                            const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_receive, value_template, value_redirect,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_receive(value_template,
+        value_redirect, sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status trigger(const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(trigger, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].trigger(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template>
@@ -338,8 +443,29 @@ public:
                      const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(trigger, value_template, NULL,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].trigger(value_template, NULL,
+        sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_value_redirect, typename T_template>
@@ -349,14 +475,57 @@ public:
                      const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(trigger, value_template, value_redirect,
-      sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].trigger(value_template,
+        value_redirect, sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status getcall(const COMPONENT_template& sender_template,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(getcall, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].getcall(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template, typename T_parameter_redirect>
@@ -365,14 +534,57 @@ public:
                      const T_parameter_redirect& param_ref,
                      COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(getcall, getcall_template, sender_template,
-      param_ref, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].getcall(getcall_template,
+        sender_template, param_ref, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status check_getcall(const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_getcall, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_getcall(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template, typename T_parameter_redirect>
@@ -381,14 +593,57 @@ public:
                            const T_parameter_redirect& param_ref,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_getcall, getcall_template, sender_template,
-      param_ref, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_getcall(getcall_template,
+        sender_template, param_ref, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status getreply(const COMPONENT_template& sender_template,
                       COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(getreply, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].getreply(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template, typename T_parameter_redirect>
@@ -397,14 +652,57 @@ public:
                       const T_parameter_redirect& param_ref,
                       COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(getreply, getreply_template, sender_template,
-      param_ref, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].getreply(getreply_template,
+        sender_template, param_ref, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status check_getreply(const COMPONENT_template& sender_template,
                             COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_getreply, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_getreply(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template, typename T_parameter_redirect>
@@ -413,14 +711,57 @@ public:
                             const T_parameter_redirect& param_ref,
                             COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_getreply, getreply_template, sender_template,
-      param_ref, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_getreply(getreply_template,
+        sender_template, param_ref, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status get_exception(const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(get_exception, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].get_exception(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template>
@@ -428,13 +769,57 @@ public:
                            const COMPONENT_template& sender_template,
                            COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(get_exception, catch_template, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].get_exception(catch_template,
+        sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status check_catch(const COMPONENT_template& sender_template,
                          COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_catch, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_catch(sender_template,
+        sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   template <typename T_template>
@@ -442,13 +827,57 @@ public:
                          const COMPONENT_template& sender_template,
                          COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check_catch, catch_template, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check_catch(catch_template,
+        sender_template, sender_ptr, index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status check(const COMPONENT_template& sender_template,
                    COMPONENT* sender_ptr, Index_Redirect* index_redirect)
   {
-    ANY_FROM_OPERATION(check, sender_template, sender_ptr)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].check(sender_template, sender_ptr,
+        index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
 };
 
@@ -540,24 +969,99 @@ public:
     * Returns the length of the decoded data. */
   int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean);
   
+  // alt-status priority: ALT_YES (return immediately) > ALT_REPEAT > ALT_MAYBE > ALT_NO
   alt_status done(Index_Redirect* index_redirect) const
   {
-    ANY_FROM_OPERATION_NO_ARGS(done)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].done(index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   alt_status killed(Index_Redirect* index_redirect) const
   {
-    ANY_FROM_OPERATION_NO_ARGS(killed)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    alt_status result = ALT_NO;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      alt_status ret_val = array_elements[i].killed(index_redirect);
+      if (ret_val == ALT_YES) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        result = ret_val;
+        break;
+      }
+      else if (ret_val == ALT_REPEAT ||
+               (ret_val == ALT_MAYBE && result == ALT_NO)) {
+        result = ret_val;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return result;
   }
   
   boolean running(Index_Redirect* index_redirect) const
   {
-    ANY_FROM_OPERATION_NO_ARGS_BOOL(running)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    boolean ret_val = FALSE;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      ret_val = array_elements[i].running(index_redirect);
+      if (ret_val) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        break;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return ret_val;
   }
   
   boolean alive(Index_Redirect* index_redirect) const
   {
-    ANY_FROM_OPERATION_NO_ARGS_BOOL(alive)
+    if (index_redirect != NULL) {
+      index_redirect->incr_pos();
+    }
+    boolean ret_val = FALSE;
+    for (unsigned int i = 0; i < array_size; ++i) {
+      ret_val = array_elements[i].alive(index_redirect);
+      if (ret_val) {
+        if (index_redirect != NULL) {
+          index_redirect->add_index((int)i + index_offset);
+        }
+        break;
+      }
+    }
+    if (index_redirect != NULL) {
+      index_redirect->decr_pos();
+    }
+    return ret_val;
   }
 };
 
-- 
GitLab