56 lines
1.9 KiB
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));
|
||
|
}
|