117 lines
3.0 KiB
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 ;
|
|
}
|