fis-gtm/sr_port/op_fnzbitor.c

81 lines
2.0 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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 "stringpool.h"
#include "op.h"
GBLREF spdesc stringpool;
void op_fnzbitor(mval *dst, mval *bitstr1, mval *bitstr2)
{
bool short1;
int str_len1, str_len2;
unsigned char *byte_1, *byte_n;
unsigned char *byte1_1, *byte1_n, byte1_len;
unsigned char *byte2_1, *byte2_n, byte2_len;
int n, n0;
error_def(ERR_INVBITSTR);
MV_FORCE_STR(bitstr1);
MV_FORCE_STR(bitstr2);
if (!bitstr1->str.len || !bitstr2->str.len)
rts_error(VARLSTCNT(1) ERR_INVBITSTR);
byte1_len = *(unsigned char *)bitstr1->str.addr;
if (byte1_len > 7)
{
rts_error(VARLSTCNT(1) ERR_INVBITSTR);
}
byte2_len = *(unsigned char *)bitstr2->str.addr;
if (byte2_len > 7)
{
rts_error(VARLSTCNT(1) ERR_INVBITSTR);
}
str_len1 = bitstr1->str.len - 1;
str_len2 = bitstr2->str.len - 1;
if ((str_len1 * 8 - byte1_len) < (str_len2 * 8 - byte2_len))
{
short1 = TRUE;
n = str_len2;
n0 = str_len1;
} else
{
short1 = FALSE;
n = str_len1;
n0 = str_len2;
}
ENSURE_STP_FREE_SPACE(n + 1);
byte_1 = (unsigned char *)stringpool.free;
*byte_1 = short1 ? byte2_len : byte1_len;
byte1_1 = (unsigned char *)bitstr1->str.addr;
byte2_1 = (unsigned char *)bitstr2->str.addr;
for(byte_n = byte_1 + 1, byte1_n = byte1_1 + 1, byte2_n = byte2_1 + 1;
byte_n <= (byte_1 + n0);
byte_n++, byte1_n++, byte2_n++)
{
*byte_n = *byte1_n | *byte2_n;
}
if (n != n0)
memcpy(byte_n, short1 ? byte2_n : byte1_n, n - n0);
dst->mvtype = MV_STR;
dst->str.addr = (char *)stringpool.free;
dst->str.len = n + 1;
stringpool.free += n + 1;
}