fis-gtm/sr_port/format_key_mvals.c

86 lines
2.0 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 the lvname_info *, which contains all the mvals of all
* subscripts and the name itself, of a local variable node,
* this will format the entire local variable key
* Input:
* lvnp: Pointer to the structure of a local variable
* 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 the length calculation in caller)
*--------------------------------------------------------------------------
*/
#include "mdef.h"
#include "gtm_string.h"
#include "lv_val.h" /* needed by "lv_nameinfo.h" */
unsigned char *format_key_mvals(unsigned char *buff, int size, lvname_info *lvnp)
{
int cnt;
mval *keys;
int n, subcnt;
unsigned char *endbuff;
cnt = (int)lvnp->total_lv_subs - 1;
endbuff = format_lvname(lvnp->start_lvp, buff, size);
size -= (int)(endbuff - buff);
buff = endbuff;
if (cnt > 0 && size > 0)
{
*buff++ = '(';
size--;
subcnt = 0;
for (n = 0; ; )
{
keys = lvnp->lv_subs[subcnt++];
MV_FORCE_STR(keys);
if (size > (keys)->str.len)
{
memcpy(buff, (keys)->str.addr, (keys)->str.len);
buff += (keys)->str.len;
size -= (keys)->str.len;
}
else
{
/* copy as much space as we have */
memcpy(buff, (keys)->str.addr, size);
buff += size;
break;
}
if (++n < cnt && size > 0)
{
*buff++ = ',';
size--;
}
else
{
if (size > 0)
{
*buff++ = ')';
size--;
}
break;
}
}
}
return buff;
}