fis-gtm/sr_port/gv_xform_key.c

92 lines
2.4 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gvsub2str.h"
#include "mvalconv.h"
#include "gv_xform_key.h"
GBLREF int4 gv_keysize;
GBLREF gv_namehead *gv_target;
/* transform gv_currkey or gv_altkey based on collation sequence
* if XBACK is true then convert from internal to external format.
* if XBACK is false, convert from external to internal format
*/
void gv_xform_key(gv_key *keyp, boolean_t xback)
{
unsigned char *c0, *c1, *ctop;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (TREF(gv_sparekey_size) < gv_keysize)
{
if (TREF(gv_sparekey))
free(TREF(gv_sparekey));
else
{
(TREF(gv_sparekey_mval)).str.addr = (char *)malloc(MAX_ZWR_KEY_SZ);
(TREF(gv_sparekey_mval)).mvtype = MV_STR;
}
TREF(gv_sparekey) = (gv_key *)malloc(SIZEOF(gv_key) - 1 + gv_keysize);
TREF(gv_sparekey_size) = gv_keysize;
}
assert(keyp->top == gv_keysize);
assert(keyp->end < keyp->top);
memcpy(TREF(gv_sparekey), keyp, SIZEOF(gv_key) + keyp->end);
c1 = keyp->base;
while (*c1++)
;
c0 = (TREF(gv_sparekey))->base + (c1 - keyp->base);
ctop = &((TREF(gv_sparekey))->base[(TREF(gv_sparekey))->end]);
if (!*c0) /* no subscipts */
{
assert(c0 == ctop);
return;
}
assert(c0 < ctop);
keyp->prev = 0;
keyp->end = c1 - keyp->base;
for (; c0 < ctop; )
{
if (STR_SUB_PREFIX != *c0)
{
assert(!gv_target->nct);
while (*c1++ = *c0++)
;
keyp->prev = keyp->end;
keyp->end = c1 - keyp->base;
} else
{
TREF(transform) = xback;
(TREF(gv_sparekey_mval)).str.len
= gvsub2str(c0, (unsigned char *)((TREF(gv_sparekey_mval)).str.addr), FALSE)
- (unsigned char *)(TREF(gv_sparekey_mval)).str.addr;
TREF(transform) = !xback;
mval2subsc(TADR(gv_sparekey_mval), keyp);
c1 = &keyp->base[keyp->end];
while (*c0++)
;
}
assert(keyp->end < keyp->top);
}
return;
}