101 lines
2.6 KiB
C
101 lines
2.6 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001, 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. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
/*
|
||
|
*--------------------------------------------------------------------------
|
||
|
* Descriptipn:
|
||
|
* Given a non-null lv_val *, this will format the subscripted local variable key
|
||
|
* starting from the base variable lv_val *.
|
||
|
* Input:
|
||
|
* lvpin: Pointer to the last subscript's lv_val
|
||
|
* buff : Buffer where key will be formatted
|
||
|
* size : Size of buff
|
||
|
* Return Value:
|
||
|
* End address upto which buffer was used to format the key
|
||
|
* (Needed for length calculation in caller)
|
||
|
*--------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
|
||
|
#include "lv_val.h"
|
||
|
#include "gtm_string.h"
|
||
|
#include "mvalconv.h"
|
||
|
#include "promodemo.h" /* for "demote" prototype used in LV_NODE_GET_KEY */
|
||
|
|
||
|
unsigned char *format_key_lv_val(lv_val *lvpin, unsigned char *buff, int size)
|
||
|
{
|
||
|
boolean_t is_base_var;
|
||
|
int cnt, cntfmt;
|
||
|
lv_val *lv, *base_lv;
|
||
|
mval tempmv;
|
||
|
lvTree *lvt;
|
||
|
lvTreeNode *node, *nodep[MAX_LVSUBSCRIPTS];
|
||
|
unsigned char *endbuff;
|
||
|
|
||
|
if (NULL == lvpin)
|
||
|
return buff;
|
||
|
lv = lvpin;
|
||
|
is_base_var = LV_IS_BASE_VAR(lv);
|
||
|
base_lv = !is_base_var ? LV_GET_BASE_VAR(lv) : lv;
|
||
|
cntfmt = 0;
|
||
|
while (lv != base_lv)
|
||
|
{
|
||
|
assert(!LV_IS_BASE_VAR(lv));
|
||
|
nodep[cntfmt++] = (lvTreeNode *)lv;
|
||
|
lvt = LV_GET_PARENT_TREE(lv);
|
||
|
assert(NULL != lvt);
|
||
|
assert(lvt->base_lv == base_lv);
|
||
|
lv = (lv_val *)LVT_PARENT(lvt);
|
||
|
assert(NULL != lv);
|
||
|
}
|
||
|
endbuff = format_lvname(base_lv, buff, size);
|
||
|
size -= (int)(endbuff - buff);
|
||
|
buff = endbuff;
|
||
|
if (cntfmt)
|
||
|
{
|
||
|
if (size < 1)
|
||
|
return buff;
|
||
|
*buff++ = '(';
|
||
|
size--;
|
||
|
}
|
||
|
for (cnt = cntfmt - 1; cnt >= 0; cnt--)
|
||
|
{
|
||
|
node = nodep[cnt];
|
||
|
LV_NODE_GET_KEY(node, &tempmv); /* Get node key into "tempmv" depending on the structure type of "node" */
|
||
|
MV_FORCE_STRD(&tempmv);
|
||
|
if (size < tempmv.str.len)
|
||
|
{ /* copy as much space as we have */
|
||
|
memcpy(buff, tempmv.str.addr, size);
|
||
|
buff += size;
|
||
|
return buff;
|
||
|
}
|
||
|
memcpy(buff, tempmv.str.addr, tempmv.str.len);
|
||
|
size -= tempmv.str.len;
|
||
|
buff += tempmv.str.len;
|
||
|
if (cnt)
|
||
|
{
|
||
|
if (size < 1)
|
||
|
return buff;
|
||
|
*buff++ = ',';
|
||
|
size--;
|
||
|
}
|
||
|
}
|
||
|
if (cntfmt)
|
||
|
{
|
||
|
if (size < 1)
|
||
|
return buff;
|
||
|
*buff++ = ')';
|
||
|
size--;
|
||
|
}
|
||
|
return buff;
|
||
|
}
|