81 lines
2.1 KiB
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);
|
|
}
|