fis-gtm/sr_port/op_fnzahandle.c

56 lines
1.9 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_string.h"
#include "lv_val.h"
#include "stringpool.h"
GBLREF spdesc stringpool;
LITREF mval literal_null;
#define ALIAS_HANDLE_LENGTH (SIZEOF(INTPTR_T) * 2) /* Two digits per hex address byte */
/* Gives a unique handle for either the var itself (if a base var aka unsubscripted) or
if is a container var, then the handle is for the base var it points to. Other subscripted
vars return NULL. The unique handle is the ASCII-ized version of the object's address.
*/
void op_fnzahandle(lv_val *srclv, mval *dst)
{
unsigned char *handle;
assert(srclv);
assert(dst);
if (srclv->v.mvtype & MV_ALIASCONT)
{ /* lv_val is an alias container, use its pointer addr as the handle */
assert(!LV_IS_BASE_VAR(srclv));
handle = (unsigned char *)srclv->v.str.addr;
} else if (LV_IS_BASE_VAR(srclv))
/* lv_val is a base variable, use its lv_val addr as the handle */
handle = (unsigned char *)srclv;
else
handle = NULL;
/* Now convert handle to return value -- return ascii-ized addr if present */
if (NULL != handle)
{
ENSURE_STP_FREE_SPACE(ALIAS_HANDLE_LENGTH);
dst->str.addr = (char *)stringpool.free;
/* 32 bit platforms require double conversion of "handle" to avoid spurious compilation warnings */
dst->str.len = i2hexl_nofill((qw_num)((UINTPTR_T)handle), (unsigned char *)dst->str.addr, ALIAS_HANDLE_LENGTH);
stringpool.free += dst->str.len;
dst->mvtype = MV_STR;
} else
memcpy(dst, &literal_null, SIZEOF(mval));
}