Function 10

In the User Function window:

Return Type:

Multiple

Input Parameters:

long a;

struct b {

long aa;

char bb[20];

short cc;

};

Output Parameters:

long y;

char z[20];

In the state table:

NUMBER func10_long, STRING func10_string, STRING send1_char,
NUMBER send3_long, STRING send3_short, NUMBER send9_long;
AssignData(send3_long, "ASSIGN", "10")
AssignData(send9_long, "ASSIGN", "1") ;
AssignData(send1_char, "ASSIGN", "f10") ;
AssignData(send3_short, "ASSIGN", "2") ;
SendData("CUSTOM_SERVER", "TEST_PARMS", 30, "TEST_PARMS_func10",
        send3_long, send9_long, send1_char, send3_short) ;
ReceiveData("CUSTOM_SERVER", "TEST_PARMS", 30, "TEST_PARMS_func10",
           func10_long, func10_string) ;

So, using the data in SendData (above), the values for successive ReceiveData actions are:

func10_long

func10_string

1

f10

2

f10

3

f10

4

f10

A fifth ReceiveData has the edge EDGE_RECEIVE_DATA_NO_MORE_DATA.

Example code

char *TEST_PARMS_func10 (a, b)
  long a;
  TEST_PARMS_func10_1_ST *b; 
 /* System Generated */
{
  long count; /* will return this number of groups */
  long i;
  char *buf_ptr;
  if (a > 4) {
    count = 4;
  } else if (a < 1) {
    count = 1;
  } else {
    count = a;
  } /* endif */
  buf_ptr = TP_buffer;
  /*
   * Multiple return the first element MUST be the number 
of multiples
   */
  *(long *)buf_ptr = count;
  buf_ptr += sizeof(count);
  /*
   * Put each iteration in to the return buffer
   */
  for (i = 1; i <= count; i++) {
    *(long *)buf_ptr = i;
    buf_ptr += sizeof (i);
    strcpy (buf_ptr, b->TEST_PARMS_func10_bb);
    buf_ptr += strlen (b->TEST_PARMS_func10_bb) + 1;
  } /* endfor */
  return(TP_buffer);
}