92 lines
2.4 KiB
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;
|
|
}
|