#include <ast.h>
#include <bedeck.h>
#include <be_pvt.h>
#include <clihandl.h>
#include <cspell.h>
#include <dutils.h>
#include <nametbl.h>
#include <icharsup.h>
void BE_cs_analyze_and_spell_vars
(
FILE *fid,
AST_operation_n_t *p_operation,
BE_side_t side,
BE_cs_info_t *p_cs_info
)
{
AST_parameter_n_t *p_parameter;
p_cs_info->cs_machinery = false;
p_cs_info->stag = NAMETABLE_NIL_ID;
p_cs_info->drtag = NAMETABLE_NIL_ID;
p_cs_info->rtag = NAMETABLE_NIL_ID;
for (p_parameter = p_operation->parameters;
p_parameter != NULL;
p_parameter = p_parameter->next)
{
if (AST_CS_STAG_SET(p_parameter))
{
p_cs_info->cs_machinery = true;
p_cs_info->stag_by_ref = (p_parameter->type->kind == AST_pointer_k);
p_cs_info->stag = p_parameter->name;
}
if (AST_CS_DRTAG_SET(p_parameter))
{
p_cs_info->cs_machinery = true;
p_cs_info->drtag_by_ref=(p_parameter->type->kind == AST_pointer_k);
p_cs_info->drtag = p_parameter->name;
}
if (AST_CS_RTAG_SET(p_parameter))
{
p_cs_info->cs_machinery = true;
p_cs_info->rtag_by_ref = (p_parameter->type->kind == AST_pointer_k);
p_cs_info->rtag = p_parameter->name;
}
}
if ( ! p_cs_info->cs_machinery )
return;
fprintf(fid, "IDL_cs_tags_t IDL_cs_tags;\n");
if (p_operation->cs_tag_rtn_name != NAMETABLE_NIL_ID)
{
if (p_cs_info->stag == NAMETABLE_NIL_ID)
{
p_cs_info->stag_by_ref = false;
if (side == BE_server_side)
fprintf(fid, "idl_ulong_int IDL_dummy_stag;\n");
p_cs_info->stag = NAMETABLE_add_id("IDL_dummy_stag");
}
if (p_cs_info->drtag == NAMETABLE_NIL_ID)
{
p_cs_info->drtag_by_ref = false;
if (side == BE_server_side)
fprintf(fid, "idl_ulong_int IDL_dummy_drtag=0;\n");
p_cs_info->drtag = NAMETABLE_add_id("IDL_dummy_drtag");
}
if (p_cs_info->rtag == NAMETABLE_NIL_ID)
{
p_cs_info->rtag_by_ref = false;
if (side == BE_server_side)
fprintf(fid, "idl_ulong_int IDL_dummy_rtag;\n");
p_cs_info->rtag = NAMETABLE_add_id("IDL_dummy_rtag");
}
if (side == BE_server_side)
return;
if (p_cs_info->stag_by_ref)
{
fprintf(fid, "idl_ulong_int IDL_stag_value;\n");
fprintf(fid, "idl_ulong_int *");
spell_name(fid, p_cs_info->stag);
fprintf(fid, "= &IDL_stag_value;\n");
}
else
{
fprintf(fid, "idl_ulong_int ");
spell_name(fid, p_cs_info->stag);
fprintf(fid, ";\n");
}
if (p_cs_info->drtag != p_cs_info->stag)
{
if (p_cs_info->drtag_by_ref)
{
fprintf(fid, "idl_ulong_int IDL_drtag_value;\n");
fprintf(fid, "idl_ulong_int *");
spell_name(fid, p_cs_info->drtag);
fprintf(fid, "= &IDL_drtag_value;\n");
}
else
{
fprintf(fid, "idl_ulong_int ");
spell_name(fid, p_cs_info->drtag);
fprintf(fid, ";\n");
}
}
if ((p_cs_info->rtag != p_cs_info->stag)
&& (p_cs_info->rtag != p_cs_info->drtag))
{
if (p_cs_info->rtag_by_ref)
{
fprintf(fid, "idl_ulong_int IDL_rtag_value;\n");
fprintf(fid, "idl_ulong_int *");
spell_name(fid, p_cs_info->rtag);
fprintf(fid, "= &IDL_rtag_value;\n");
}
else
{
fprintf(fid, "idl_ulong_int ");
spell_name(fid, p_cs_info->rtag);
fprintf(fid, ";\n");
}
}
}
}
void BE_spell_cs_state
(
FILE *fid,
char *state_access,
BE_side_t side,
BE_cs_info_t *p_cs_info
)
{
if ( ! p_cs_info->cs_machinery )
return;
if (side == BE_client_side)
{
if (p_cs_info->stag != NAMETABLE_NIL_ID)
{
fprintf(fid, "IDL_cs_tags.p_marsh_tag = %c%s;\n",
p_cs_info->stag_by_ref ? ' ' : '&',
BE_get_name(p_cs_info->stag));
}
}
else
{
if (p_cs_info->rtag != NAMETABLE_NIL_ID)
{
fprintf(fid, "IDL_cs_tags.p_marsh_tag = &%s;\n",
BE_get_name(p_cs_info->rtag));
}
}
if (side == BE_client_side)
{
if (p_cs_info->rtag != NAMETABLE_NIL_ID)
{
fprintf(fid, "IDL_cs_tags.p_unmar_tag = %c%s;\n",
p_cs_info->rtag_by_ref ? ' ' : '&',
BE_get_name(p_cs_info->rtag));
}
}
else
{
if (p_cs_info->stag != NAMETABLE_NIL_ID)
{
fprintf(fid, "IDL_cs_tags.p_unmar_tag = &%s;\n",
BE_get_name(p_cs_info->stag));
}
}
fprintf(fid, "%sIDL_cs_tags_p = &IDL_cs_tags;\n", state_access);
}
void BE_spell_cs_tag_rtn_call
(
FILE *fid,
char *state_access,
AST_operation_n_t *p_operation,
BE_side_t side,
BE_handle_info_t *p_handle_info,
BE_cs_info_t *p_cs_info,
boolean pickling
)
{
if ((p_operation->cs_tag_rtn_name == NAMETABLE_NIL_ID)
|| ( ! p_cs_info->cs_machinery ) )
{
return;
}
spell_name(fid, p_operation->cs_tag_rtn_name);
if (pickling)
fprintf(fid, "(NULL,");
else
fprintf(fid, "(%c%s,",
p_handle_info->deref_assoc, p_handle_info->assoc_name);
if (side == BE_client_side)
{
fprintf(fid, "idl_false,%c%s,%c%s,%c%s",
p_cs_info->stag_by_ref ? ' ' : '&',
BE_get_name(p_cs_info->stag),
p_cs_info->drtag_by_ref ? ' ' : '&',
BE_get_name(p_cs_info->drtag),
p_cs_info->rtag_by_ref ? ' ' : '&',
BE_get_name(p_cs_info->rtag));
}
else
{
fprintf(fid, "idl_true,&%s,&%s,&%s",
BE_get_name(p_cs_info->stag),
BE_get_name(p_cs_info->drtag),
BE_get_name(p_cs_info->rtag));
}
fprintf(fid, ",(error_status_t *)&%sIDL_status);\n", state_access);
fprintf(fid, "if (%sIDL_status!=error_status_ok)\n{\n", state_access);
fprintf(fid, "RAISE(rpc_x_ss_pipe_comm_error);\n}\n");
}