fis-gtm/sr_port/op_fnfind.c

117 lines
3.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 "matchc.h"
#include "mvalconv.h"
#include "op.h"
/*
* -----------------------------------------------
* op_fnfind()
*
* MUMPS Find function
*
* Arguments:
* src - Pointer to Source string mval
* del - Pointer to delimiter mval
* first - starting index
* dst - destination buffer to save the piece in
*
* Return:
* first character position after the delimiter match
* -----------------------------------------------
*/
#ifdef UNICODE_SUPPORTED
#include "gtm_utf8.h"
GBLREF boolean_t badchar_inhibit;
int4 op_fnfind(mval *src, mval *del, mint first, mval *dst)
{
mint result;
char *match, *srcptr, *srctop;
int match_res, bytelen, skip, srclen, numpcs;
MV_FORCE_STR(src);
MV_FORCE_STR(del);
if (first > 0)
first--;
else
first = 0 ;
if (del->str.len == 0)
result = first + 1 ;
else if (src->str.len <= first)
result = 0 ;
else
{
if (MV_IS_SINGLEBYTE(src) && badchar_inhibit)
{ /* If BADCHARs are to be checked, matchb() shouldn't be used even if the source is entirely single byte */
numpcs = 1;
match = (char *)matchb(del->str.len, (uchar_ptr_t)del->str.addr,
src->str.len - first, (uchar_ptr_t)src->str.addr + first, &match_res, &numpcs);
result = match_res ? first + match_res : 0;
} else
{ /* either the string contains multi-byte characters or BADCHAR check is required */
result = 0;
srcptr = src->str.addr;
srctop = srcptr + src->str.len;
for (skip = first; (skip > 0 && (srcptr < srctop)); skip--)
{ /* advance the string to the character position 'first' */
if (!UTF8_VALID(srcptr, srctop, bytelen) && !badchar_inhibit)
utf8_badchar(0, (unsigned char *)srcptr, (unsigned char *)srctop, 0, NULL);
srcptr += bytelen;
}
if (skip <= 0)
{
srclen = (int)(srctop - srcptr);
numpcs = 1;
match = (char *)matchc(del->str.len, (uchar_ptr_t)del->str.addr,
srclen, (uchar_ptr_t)srcptr, &match_res, &numpcs);
result = match_res ? first + match_res : 0;
}
}
}
MV_FORCE_MVAL(dst, result);
return result ;
}
#endif /* UNICODE_SUPPORTED */
int4 op_fnzfind(mval *src, mval *del, mint first, mval *dst)
{
mint result;
char *match;
int match_res, numpcs;
MV_FORCE_STR(src);
MV_FORCE_STR(del);
if (first > 0)
first--;
else
first = 0 ;
if (del->str.len == 0)
result = first + 1 ;
else if (src->str.len > first)
{
numpcs = 1;
match = (char *)matchb(del->str.len, (uchar_ptr_t)del->str.addr,
src->str.len - first, (uchar_ptr_t)src->str.addr + first, &match_res, &numpcs);
result = match_res ? first + match_res : 0;
} else
result = 0 ;
MV_FORCE_MVAL(dst, result);
return result ;
}