1.1 --- a/common.c Mon Jun 06 00:18:14 2022 +0200
1.2 +++ b/common.c Sun Jun 19 23:37:05 2022 +0200
1.3 @@ -326,7 +326,9 @@
1.4 param != NULL;
1.5 param = param->tail)
1.6 {
1.7 - if (param->specifier & IN_PARAMETER)
1.8 + /* Special case: "out fpage". */
1.9 +
1.10 + if ((param->specifier & IN_PARAMETER) || (param->cls == FPAGE_ITEM))
1.11 {
1.12 if (param->cls & ITEM_CLASS) (*input_items)++;
1.13 else (*input_words)++;
1.14 @@ -395,8 +397,9 @@
1.15 {
1.16 if (param->cls == FPAGE_ITEM)
1.17 {
1.18 - if ((component == CLIENT_ROLE) && (param->specifier & IN_PARAMETER) &&
1.19 - writing)
1.20 + /* Permit the specification of receive window flexpage items. */
1.21 +
1.22 + if (specify_receive_fpage(param, component, writing))
1.23 return "receive_fpage";
1.24 else
1.25 return "fpage";
1.26 @@ -405,6 +408,18 @@
1.27 return "capability";
1.28 }
1.29
1.30 +/* Return whether the parameter involves a receive window flexpage. */
1.31 +
1.32 +int specify_receive_fpage(struct parameter *param,
1.33 + enum component_role component, int writing)
1.34 +{
1.35 + return (param->cls == FPAGE_ITEM) &&
1.36 + (component == CLIENT_ROLE) &&
1.37 + !(param->specifier & IN_PARAMETER) &&
1.38 + (param->specifier & OUT_PARAMETER) &&
1.39 + writing;
1.40 +}
1.41 +
1.42 /* When copying output items from the message (in the client) or copying into
1.43 the message (in the server, but only with a new message), the message address
1.44 must be obtained using the appropriate operator. */
2.1 --- a/common.h Mon Jun 06 00:18:14 2022 +0200
2.2 +++ b/common.h Sun Jun 19 23:37:05 2022 +0200
2.3 @@ -85,6 +85,7 @@
2.4
2.5 char *access_name(struct parameter *param, enum component_role component, int writing);
2.6 char *item_type_name(struct parameter *param, enum component_role component, int writing);
2.7 +int specify_receive_fpage(struct parameter *param, enum component_role component, int writing);
2.8 char *reference_message(enum component_role component, enum function_role function);
2.9 char *structure_prefix(enum specifier direction);
2.10 int writing_to_message(enum component_role component, enum specifier direction);
3.1 --- a/message.c Mon Jun 06 00:18:14 2022 +0200
3.2 +++ b/message.c Sun Jun 19 23:37:05 2022 +0200
3.3 @@ -79,7 +79,12 @@
3.4
3.5 for (index = 0; param != NULL; param = param->tail)
3.6 {
3.7 - if ((param->specifier & direction) && (param->cls & cls))
3.8 + /* Permit the specification of receive window flexpage input items for
3.9 + "out fpage" parameters. */
3.10 +
3.11 + if ((param->cls & cls) &&
3.12 + ((param->specifier & direction) ||
3.13 + specify_receive_fpage(param, component, writing)))
3.14 {
3.15 name = get_parameter_name(param->identifiers);
3.16 access = access_name(param, component, writing);