fis-gtm/sr_port/format_key_lv_val.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;
}