80 lines
2.5 KiB
C
80 lines
2.5 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_descript.h"
|
|
#include "min_max.h"
|
|
#include "collseq.h"
|
|
#include "do_xform.h"
|
|
|
|
void do_xform(collseq *csp, int fc_type, mstr *input, mstr *output, int *length)
|
|
{
|
|
gtm32_descriptor outbuff1, insub1;
|
|
gtm_descriptor outbuff, insub;
|
|
int4 status;
|
|
|
|
error_def(ERR_COLLARGLONG);
|
|
|
|
DO_XFORM_RETURN_IF_NULL_STRING(input, output, length);
|
|
assert (0 == csp->argtype || 1 == csp->argtype);
|
|
assert(XFORM == fc_type || XBACK == fc_type);
|
|
if (0 == csp->argtype)
|
|
{
|
|
if (MAX_STRLEN_32K < input->len)
|
|
rts_error(VARLSTCNT(3) ERR_COLLARGLONG, 1, csp->act);
|
|
insub.type = DSC_K_DTYPE_T;
|
|
insub.len = input->len;
|
|
insub.val = input->addr;
|
|
|
|
outbuff.type = DSC_K_DTYPE_T;
|
|
outbuff.len = MIN(output->len, MAX_STRLEN_32K);
|
|
outbuff.val = output->addr;
|
|
|
|
if (XFORM == fc_type)
|
|
status = (csp->xform)(&insub, 1, &outbuff, length);
|
|
else
|
|
status = (csp->xback)(&insub, 1, &outbuff, length);
|
|
/* If collation routine has changed outbuff.val (which it will if it cannot store the transformed
|
|
* result in the buffer that is passed in), the transformed value is stored in the buffer allocated
|
|
* externally by the collation routine. In this case, update output->addr before returning. */
|
|
if (outbuff.val != output->addr)
|
|
{
|
|
assert(outbuff.len > MIN(output->len, MAX_STRLEN_32K));
|
|
output->addr = outbuff.val;
|
|
}
|
|
} else
|
|
{
|
|
insub1.type = DSC_K_DTYPE_T;
|
|
insub1.len = input->len;
|
|
insub1.val = input->addr;
|
|
|
|
outbuff1.type = DSC_K_DTYPE_T;
|
|
outbuff1.len = output->len;
|
|
outbuff1.val = output->addr;
|
|
|
|
if (XFORM == fc_type)
|
|
status = (csp->xform)(&insub1, 1, &outbuff1, length);
|
|
else
|
|
status = (csp->xback)(&insub1, 1, &outbuff1, length);
|
|
/* If collation routine has changed outbuff1.val (which it will if it cannot store the transformed
|
|
* result in the buffer that is passed in), the transformed value is stored in the buffer allocated
|
|
* externally by the collation routine. In this case, update output->addr before returning. */
|
|
if (outbuff1.val != output->addr)
|
|
{
|
|
assert(outbuff1.len > output->len);
|
|
output->addr = outbuff1.val;
|
|
}
|
|
}
|
|
if (status)
|
|
rts_error(VARLSTCNT(1) status);
|
|
}
|