fis-gtm/sr_port/op_setalsct2alsct.c

71 lines
2.4 KiB
C

/****************************************************************
* *
* Copyright 2009, 2011 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_stdio.h"
#include "op.h"
#include "lv_val.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "alias.h"
#include "min_max.h"
GBLREF symval *curr_symval;
GBLREF uint4 dollar_tlevel;
/* Operation - Copy alias container to another alias container
* Note that this cannot happen as the result of a normal copy via regular SET command (we do not allow it).
*/
void op_setalsct2alsct(lv_val *srclv, lv_val *dstlv)
{
lv_val *src_lvref, *src_lvbase, *dst_lvbase;
symval *sym_src_lvref, *sym_srclv, *sym_dstlv;
error_def(ERR_ALIASEXPECTED);
assert(srclv);
assert(!LV_IS_BASE_VAR(srclv)); /* Verify subscripted var */
assert(dstlv);
assert(!LV_IS_BASE_VAR(dstlv)); /* Verify subscripted var */
if (!(srclv->v.mvtype & MV_ALIASCONT))
rts_error(VARLSTCNT(1) ERR_ALIASEXPECTED);
src_lvref = (lv_val *)srclv->v.str.addr;
assert(src_lvref);
assert(LV_IS_BASE_VAR(src_lvref)); /* Verify base var */
if (srclv != dstlv)
{
dst_lvbase = LV_GET_BASE_VAR(dstlv);
if (dollar_tlevel && (NULL != dst_lvbase->tp_var) && !dst_lvbase->tp_var->var_cloned)
TP_VAR_CLONE(dst_lvbase); /* clone the tree. */
dstlv->v = srclv->v;
assert(0 < src_lvref->stats.trefcnt);
assert(0 <= src_lvref->stats.crefcnt);
INCR_TREFCNT(src_lvref);
INCR_CREFCNT(src_lvref);
/* Potentially 3 symvals need to be marked active. Pick the oldest
* of them to feed to the macro to get them all marked.
*/
src_lvbase = LV_GET_BASE_VAR(srclv);
sym_srclv = LV_GET_SYMVAL(src_lvbase);
sym_dstlv = LV_GET_SYMVAL(dst_lvbase);
sym_src_lvref = LV_GET_SYMVAL(src_lvref);
MARK_ALIAS_ACTIVE(MIN(MIN(sym_srclv->symvlvl, sym_dstlv->symvlvl), sym_src_lvref->symvlvl));
/* Last operation is to mark the base var for our container array that it now has a container in it. */
MARK_CONTAINER_ONBOARD(dst_lvbase);
}
assert(src_lvref->stats.trefcnt >= src_lvref->stats.crefcnt);
}