fis-gtm/sr_port/compile_pattern.c

92 lines
2.4 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"
#include "fullbool.h"
GBLREF spdesc stringpool;
GBLREF char *lexical_ptr;
GBLREF unsigned char *source_buffer;
GBLREF short int source_column;
int compile_pattern(oprtype *opr, boolean_t is_indirect)
{
int status;
ptstr retstr;
mval retmval;
mstr instr;
triple *oldchain, *ref, tmpchain, *triptr;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (is_indirect)
{
TREF(saw_side_effect) = TREF(shift_side_effects);
if (TREF(shift_side_effects) && (GTM_BOOL == TREF(gtm_fullbool)))
{
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;
}
}