90 lines
2.3 KiB
C
90 lines
2.3 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001, 2011 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 "compiler.h"
|
||
|
#include "stringpool.h"
|
||
|
#include "opcode.h"
|
||
|
#include "mdq.h"
|
||
|
#include "advancewindow.h"
|
||
|
#include "compile_pattern.h"
|
||
|
#include "patcode.h"
|
||
|
|
||
|
GBLREF spdesc stringpool;
|
||
|
GBLREF char *lexical_ptr;
|
||
|
GBLREF unsigned char *source_buffer;
|
||
|
GBLREF short int source_column;
|
||
|
|
||
|
int compile_pattern(oprtype *opr, bool is_indirect)
|
||
|
{
|
||
|
ptstr retstr;
|
||
|
mval retmval;
|
||
|
mstr instr;
|
||
|
int status;
|
||
|
triple *oldchain, tmpchain, *ref, *triptr;
|
||
|
DCL_THREADGBL_ACCESS;
|
||
|
|
||
|
SETUP_THREADGBL_ACCESS;
|
||
|
if (is_indirect)
|
||
|
{
|
||
|
if (TREF(shift_side_effects))
|
||
|
{
|
||
|
dqinit(&tmpchain, exorder);
|
||
|
oldchain = setcurtchain(&tmpchain);
|
||
|
if (!indirection(opr))
|
||
|
{
|
||
|
setcurtchain(oldchain);
|
||
|
return FALSE;
|
||
|
}
|
||
|
ref = newtriple(OC_INDPAT);
|
||
|
newtriple(OC_GVSAVTARG);
|
||
|
setcurtchain(oldchain);
|
||
|
dqadd(TREF(expr_start), &tmpchain, exorder);
|
||
|
TREF(expr_start) = tmpchain.exorder.bl;
|
||
|
triptr = newtriple(OC_GVRECTARG);
|
||
|
triptr->operand[0] = put_tref(TREF(expr_start));
|
||
|
} else
|
||
|
{
|
||
|
if (!indirection(opr))
|
||
|
return FALSE;
|
||
|
ref = newtriple(OC_INDPAT);
|
||
|
}
|
||
|
ref->operand[0] = *opr;
|
||
|
*opr = put_tref(ref);
|
||
|
return TRUE;
|
||
|
} else
|
||
|
{
|
||
|
instr.addr = (char *)&source_buffer[source_column - 1];
|
||
|
instr.len = STRLEN(instr.addr);
|
||
|
status = patstr(&instr, &retstr, NULL);
|
||
|
TREF(last_source_column) = (short int)(instr.addr - (char *)source_buffer);
|
||
|
assert(TREF(last_source_column));
|
||
|
if (status)
|
||
|
{ /* status == syntax error when non-zero */
|
||
|
stx_error(status);
|
||
|
return FALSE;
|
||
|
}
|
||
|
retmval.mvtype = MV_STR;
|
||
|
retmval.str.len = retstr.len * SIZEOF(uint4);
|
||
|
retmval.str.addr = (char *)stringpool.free;
|
||
|
ENSURE_STP_FREE_SPACE(retmval.str.len);
|
||
|
memcpy(stringpool.free, &retstr.buff[0], retmval.str.len);
|
||
|
stringpool.free += retmval.str.len;
|
||
|
*opr = put_lit(&retmval);
|
||
|
lexical_ptr = instr.addr;
|
||
|
advancewindow();
|
||
|
advancewindow();
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|