fis-gtm/sr_port/pat_compress.c

61 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 "copy.h"
#include "patcode.h"
#include "min_max.h"
/* If a pattern contains consecutive atoms that could be combined, this procedure will attempt to do so.
* For instance both .E.N and .N.E could be simplified to .E
*/
int pat_compress(uint4 pattern_mask,
pat_strlit *strlit_buff,
boolean_t infinite,
boolean_t last_infinite,
uint4 *lastpatptr)
{
uint4 y_max;
uint4 lastpat_mask;
assert(pattern_mask);
if ((infinite == last_infinite) && !(pattern_mask & PATM_ALT))
{
lastpat_mask = *lastpatptr & (PATM_STRLIT | PATM_LONGFLAGS);
if (lastpat_mask == pattern_mask)
{
if (pattern_mask & PATM_STRLIT)
{ /* PATM_STRLIT pattern consists of PAT_STRLIT_PADDING int4s that contain padding information */
if (!memcmp(lastpatptr + 1, strlit_buff, strlit_buff->bytelen + PAT_STRLIT_PADDING * SIZEOF(int4)))
return TRUE;
} else
return TRUE;
} else if (infinite && lastpat_mask && !(lastpat_mask & PATM_STRLIT) && !(pattern_mask & PATM_STRLIT))
{ /* lastpat_mask can be 0 if the previous pattern mask was PATM_ALT which is outside of PATM_LONGFLAGS range.
* Do not compress in that case. Hence the && lastpat_mask in the else if above.
*/
y_max = MAX(lastpat_mask, pattern_mask);
/* Check if one pattern subsumes the other. The check is a simple bit-wise OR condition.
* This is because lastpat_mask and pattern_mask are non-zero here.
*/
if ((lastpat_mask | pattern_mask) == y_max)
{
*lastpatptr = y_max;
return TRUE;
}
}
}
return FALSE;
}