#include <nidl.h>
#include <checker.h>
#include <chkichar.h>
#include <acf_y.h>
#include <ast.h>
#include <astp.h>
#include <command.h>
#include <errors.h>
#include <message.h>
void CHK_param_cs
(
AST_parameter_n_t *param_p,
AST_type_n_t *type_p
)
{
AST_parameter_n_t *pp;
AST_field_attr_n_t *fattr_p;
fattr_p = param_p->field_attrs;
if (AST_IN_SET(param_p)
&& (type_p->cs_char_type != NULL
|| FE_TEST(type_p->fe_info->flags, FE_CT_CS_CHAR)))
{
for (pp = param_p->uplink->parameters; pp != NULL; pp = pp->next)
{
if (AST_CS_STAG_SET(pp))
break;
}
if (pp == NULL)
CHECKER_acf_error(param_p, NIDL_OPINCSCHAR);
}
if (AST_OUT_SET(param_p)
&& (type_p->cs_char_type != NULL
|| FE_TEST(type_p->fe_info->flags, FE_CT_CS_CHAR)))
{
for (pp = param_p->uplink->parameters; pp != NULL; pp = pp->next)
{
if (AST_CS_RTAG_SET(pp))
break;
}
if (pp == NULL)
CHECKER_acf_error(param_p, NIDL_OPOUTCSCHAR);
}
if (AST_CS_STAG_SET(param_p) && !AST_IN_SET(param_p))
{
ASTP_attr_flag_t attr2 = ASTP_IN;
CHECKER_error(param_p, NIDL_PRMDEPATTR, "cs_stag",
KEYWORDS_lookup_text(AST_attribute_to_token(&attr2)));
}
if (AST_CS_DRTAG_SET(param_p) && !AST_IN_SET(param_p))
{
ASTP_attr_flag_t attr2 = ASTP_IN;
CHECKER_error(param_p, NIDL_PRMDEPATTR, "cs_drtag",
KEYWORDS_lookup_text(AST_attribute_to_token(&attr2)));
}
if (AST_CS_RTAG_SET(param_p) && !AST_OUT_SET(param_p))
{
ASTP_attr_flag_t attr2 = ASTP_OUT;
CHECKER_error(param_p, NIDL_PRMDEPATTR, "cs_rtag",
KEYWORDS_lookup_text(AST_attribute_to_token(&attr2)));
}
if (FE_TEST(param_p->fe_info->flags, FE_USED_AS_CS_FLD_ATTR)
&& FE_TEST(param_p->fe_info->flags, FE_USED_AS_REG_FLD_ATTR))
CHECKER_error(param_p, NIDL_ARRATTRSHR);
if (type_p->kind == AST_pointer_k
&& type_p->type_structure.pointer->pointee_type->cs_char_type != NULL
&& fattr_p != NULL
&& (fattr_p->max_is_vec != NULL || fattr_p->size_is_vec != NULL))
CHECKER_error(param_p, NIDL_CSARRSYN);
if (type_p->kind == AST_array_k
&& type_p->type_structure.array->element_type->cs_char_type != NULL
&& (AST_PTR_SET(param_p) || AST_UNIQUE_SET(param_p)))
CHECKER_error(param_p, NIDL_ARRPTRUNIQ, "cs_char");
if (AST_CS_STAG_SET(param_p))
{
for (pp = param_p->uplink->parameters; pp != param_p; pp = pp->next)
{
if (AST_IN_SET(pp)
&& (pp->type->cs_char_type != NULL
|| FE_TEST(pp->type->fe_info->flags, FE_CT_CS_CHAR)))
break;
}
if (pp != param_p)
CHECKER_error(param_p, NIDL_TAGBEFDATA);
}
if (AST_CS_RTAG_SET(param_p))
{
for (pp = param_p->uplink->parameters; pp != param_p; pp = pp->next)
{
if (AST_OUT_SET(pp)
&& (pp->type->cs_char_type != NULL
|| FE_TEST(pp->type->fe_info->flags, FE_CT_CS_CHAR)))
break;
}
if (pp != param_p)
CHECKER_error(param_p, NIDL_TAGAFTDATA);
}
if (AST_HANDLE_SET(type_p)
&& param_p == param_p->uplink->parameters
&& (type_p->cs_char_type != NULL
|| FE_TEST(type_p->fe_info->flags, FE_CT_CS_CHAR)))
CHECKER_error(param_p, NIDL_HANCTYPE, "cs_char");
if (type_p->kind == AST_array_k
&& type_p->type_structure.array->element_type->cs_char_type != NULL
&& (AST_STRING_SET(type_p) || AST_STRING_SET(param_p)
|| (fattr_p != NULL
&& (fattr_p->min_is_vec != NULL
|| fattr_p->max_is_vec != NULL
|| fattr_p->first_is_vec != NULL
|| fattr_p->last_is_vec != NULL))))
CHECKER_error(param_p, NIDL_ARRTYPATTR, "cs_char");
if ( (AST_CS_STAG_SET(param_p)
|| AST_CS_DRTAG_SET(param_p)
|| AST_CS_RTAG_SET(param_p))
&& type_p->kind != AST_long_unsigned_k )
CHECKER_error(param_p, NIDL_TAGPRMTYPE);
if (AST_CS_STAG_SET(param_p)
&& (*(int *)CMD_vals[opt_standard] < opt_standard_dce_1_1))
CHECKER_acf_warning(param_p, NIDL_NOPORTATTR, "cs_stag",
OPT_STD_EXTENDED);
if (AST_CS_DRTAG_SET(param_p)
&& (*(int *)CMD_vals[opt_standard] < opt_standard_dce_1_1))
CHECKER_acf_warning(param_p, NIDL_NOPORTATTR, "cs_drtag",
OPT_STD_EXTENDED);
if (AST_CS_RTAG_SET(param_p)
&& (*(int *)CMD_vals[opt_standard] < opt_standard_dce_1_1))
CHECKER_acf_warning(param_p, NIDL_NOPORTATTR, "cs_rtag",
OPT_STD_EXTENDED);
}
void CHK_op_cs
(
AST_operation_n_t *op_p
)
{
AST_parameter_n_t *param_p;
int s=0, d=0, r=0;
if (op_p->cs_tag_rtn_name != NAMETABLE_NIL_ID)
{
for (param_p = op_p->parameters; param_p; param_p = param_p->next)
{
if (AST_CS_STAG_SET(param_p) || AST_CS_DRTAG_SET(param_p)
|| AST_CS_RTAG_SET(param_p))
break;
}
if (param_p == NULL)
CHECKER_acf_warning(op_p, NIDL_OPNOTAGS);
}
for (param_p = op_p->parameters; param_p; param_p = param_p->next)
{
if (AST_CS_STAG_SET(param_p)) s++;
if (AST_CS_DRTAG_SET(param_p)) d++;
if (AST_CS_RTAG_SET(param_p)) r++;
}
if (s > 1)
CHECKER_acf_error(op_p, NIDL_DUPPRMATTR, "cs_stag");
if (d > 1)
CHECKER_acf_error(op_p, NIDL_DUPPRMATTR, "cs_drtag");
if (r > 1)
CHECKER_acf_error(op_p, NIDL_DUPPRMATTR, "cs_rtag");
if (op_p->cs_tag_rtn_name != NAMETABLE_NIL_ID
&& (*(int *)CMD_vals[opt_standard] < opt_standard_dce_1_1))
CHECKER_acf_warning(op_p, NIDL_NOPORTATTR, "cs_tag_rtn",
OPT_STD_EXTENDED);
}
void CHK_field_cs
(
AST_field_n_t *field_p
)
{
AST_type_n_t *type_p;
AST_field_attr_n_t *fattr_p;
type_p = field_p->type;
fattr_p = field_p->field_attrs;
if (FE_TEST(field_p->fe_info->flags, FE_USED_AS_CS_FLD_ATTR)
&& FE_TEST(field_p->fe_info->flags, FE_USED_AS_REG_FLD_ATTR))
CHECKER_error(field_p, NIDL_ARRATTRSHR);
if (type_p->kind == AST_pointer_k
&& type_p->type_structure.pointer->pointee_type->cs_char_type != NULL
&& fattr_p != NULL
&& (fattr_p->max_is_vec != NULL || fattr_p->size_is_vec != NULL))
CHECKER_error(field_p, NIDL_CSARRSYN);
if (type_p->kind == AST_array_k
&& type_p->type_structure.array->element_type->cs_char_type != NULL
&& (AST_STRING_SET(type_p) || AST_STRING_SET(field_p)
|| (fattr_p != NULL
&& (fattr_p->min_is_vec != NULL
|| fattr_p->max_is_vec != NULL
|| fattr_p->first_is_vec != NULL
|| fattr_p->last_is_vec != NULL))))
CHECKER_error(field_p, NIDL_ARRTYPATTR, "cs_char");
}
void CHK_pipe_base_type_cs
(
AST_pipe_n_t *pipe_p,
AST_interface_n_t *int_p ATTRIBUTE_UNUSED
)
{
AST_type_n_t *type_p;
type_p = pipe_p->base_type;
if (type_p->cs_char_type != NULL
|| FE_TEST(type_p->fe_info->flags, FE_CT_CS_CHAR))
CHECKER_error(type_p, NIDL_PIPECTYPE, "cs_char");
}
void CHK_type_cs
(
AST_type_n_t *top_type_p,
AST_type_n_t *type_p,
AST_interface_n_t *int_p
)
{
char const *type_name;
int type_len;
int max_len;
if (type_p->cs_char_type != NULL
&& FE_TEST(type_p->fe_info->flags, FE_CT_CS_CHAR))
CHECKER_acf_error(type_p, NIDL_TYPENEST, "cs_char");
if (type_p->cs_char_type != NULL
&& FE_TEST(type_p->fe_info->flags, FE_USED_IN_TRANSMITTED))
CHECKER_error(type_p, NIDL_XMITCTYPE, "cs_char");
if (type_p->kind == AST_array_k
&& type_p->type_structure.array->element_type->cs_char_type != NULL
&& type_p->type_structure.array->index_count > 1)
CHECKER_error(type_p, NIDL_ARRMULTID, "cs_char");
if (top_type_p->cs_char_type != NULL
&& (top_type_p->xmit_as_type != NULL
|| FE_TEST(top_type_p->fe_info->flags, FE_HAS_XMIT_AS)) )
{
ASTP_attr_flag_t attr2 = ASTP_TRANSMIT_AS;
CHECKER_error(top_type_p, NIDL_TYPECTYPE, "cs_char",
KEYWORDS_lookup_text(AST_attribute_to_token(&attr2)));
}
if (type_p->cs_char_type != NULL
&& (type_p->rep_as_type != NULL
|| FE_TEST(type_p->fe_info->flags, FE_HAS_REP_AS)) )
CHECKER_error(type_p, NIDL_TYPECTYPE, "cs_char", "represent_as");
if (type_p->cs_char_type != NULL
&& type_p->kind != AST_byte_k
&& !(type_p->kind == AST_structure_k
&& CHK_struct_is_all_byte_fields(type_p->type_structure.structure)))
CHECKER_error(type_p, NIDL_TYPEOFBYTES, "cs_char");
if (int_p->includes == NULL
&& type_p->cs_char_type != NULL
&& ASTP_lookup_binding(null_parser_location,
type_p->cs_char_type->type_name, fe_type_n_k, FALSE) == NULL)
{
char const *id_name;
NAMETABLE_id_to_string(type_p->cs_char_type->type_name, &id_name);
CHECKER_acf_warning(type_p, NIDL_INCLTYPE, id_name);
}
if (type_p->cs_char_type != NULL
&& type_p->name != NAMETABLE_NIL_ID)
{
NAMETABLE_id_to_string(type_p->name, &type_name);
type_len = strlen(type_name);
max_len = MAX_ID - strlen("_from_netcs");
if (type_len > max_len)
CHECKER_error(type_p, NIDL_MAXIDTYPE, "cs_char", max_len);
}
if (type_p->cs_char_type != NULL
&& (*(int *)CMD_vals[opt_standard] < opt_standard_dce_1_1))
CHECKER_acf_warning(type_p, NIDL_NOPORTATTR, "cs_char",
OPT_STD_EXTENDED);
}