fis-gtm/sr_unix/genpat.c

81 lines
2.1 KiB
C

/****************************************************************
* *
* Copyright 2001, 2010 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 "patcode.h"
#include "compiler.h"
/* This routine translates system specific wildcarded strings into MUMPS patterns,
and generates the internal pattern matching literal string into a local buffer
by calling the PATSTR() hook into the compiler. The result can be passed
directly to DO_PATTERN() to match input.
This routine uses the UNIX pattern matching characters of * and ? for multiple
and single character wildcarding.
*/
void genpat(mstr *input, mval *patbuf)
{
uint4 ecount, status;
bool patopen;
char source_buffer[MAX_SRCLINE];
char *top, *fpat, *pat_str;
ptstr pat_ptstr;
mstr instr;
pat_str = source_buffer;
fpat = input->addr;
top = fpat + input->len;
patopen = FALSE;
while (fpat < top)
{ if (*fpat == '?')
{ for (ecount = 0; fpat < top && *fpat == '?'; ecount++)
fpat++;
if (patopen)
{ *pat_str++ = '"';
patopen = FALSE;
}
pat_str = (char *)i2asc((uchar_ptr_t)pat_str, ecount);
*pat_str++ = 'E';
}
else if (*fpat == '*')
{ while(fpat < top && *fpat == '*')
fpat++;
if (patopen)
{ *pat_str++ = '"';
patopen = FALSE;
}
*pat_str++ = '.';
*pat_str++ = 'E';
}
else
{ patopen = TRUE;
*pat_str++ = '1';
*pat_str++ = '"';
while(fpat < top && *fpat != '*' && *fpat != '?')
*pat_str++ = *fpat++;
}
}
if (patopen)
*pat_str++ = '"';
instr.addr = source_buffer;
instr.len = INTCAST(pat_str - source_buffer);
if (status = patstr(&instr, &pat_ptstr, NULL))
rts_error(VARLSTCNT(1) status);
assert(pat_ptstr.len <= MAX_PATOBJ_LENGTH);
patbuf->str.len = pat_ptstr.len * SIZEOF(uint4);
memcpy(patbuf->str.addr, &pat_ptstr.buff[0], patbuf->str.len);
}