fis-gtm/sr_port/op_fnstack2.c

102 lines
3.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 "rtnhdr.h"
#include "stack_frame.h"
#include "mvalconv.h"
#include "op.h"
#include "dollar_zlevel.h"
#include "mv_stent.h"
#include "error_trap.h"
#include "gtm_caseconv.h"
/* -----------------------------------------------------------------------------------
* op_fnstack2()
*
* MUMPS Stack function (with 2 parameters)
*
* Parameters:
* level - Integer containing level counter
* info - Pointer to mval containing one of "PLACE", "MCODE" or "ECODE"
* result - Pointer to mval containing the requested information
* -----------------------------------------------------------------------------------
*/
GBLREF stack_frame *error_frame;
GBLREF dollar_ecode_type dollar_ecode; /* structure containing $ECODE related information */
GBLREF dollar_stack_type dollar_stack; /* structure containing $STACK related information */
#define GET_FRAME_INFO(level, mode, cur_zlevel, result) \
{ \
assert(level < cur_zlevel); \
switch(mode) \
{ \
case DOLLAR_STACK_ECODE: \
assert(0 == result->str.len); \
break; \
case DOLLAR_STACK_PLACE: \
case DOLLAR_STACK_MCODE: \
get_frame_place_mcode(level, mode, cur_zlevel, result); \
break; \
default: \
GTMASSERT; \
} \
}
void op_fnstack2(int level, mval *info, mval *result)
{
int cur_zlevel;
stack_mode_t mode;
unsigned char info_upper[SIZEOF("MCODE")];
error_def(ERR_INVSTACODE);
mode = DOLLAR_STACK_INVALID;
/* make sure that info is one of the three valid strings */
MV_FORCE_STR(info); /* force input string to null string in case it is undefined */
if (info->str.len == 5)
{
lower_to_upper(info_upper, (unsigned char *)info->str.addr, 5);
if (!memcmp("MCODE", info_upper, SIZEOF("MCODE")-1))
mode = DOLLAR_STACK_MCODE;
else if (!memcmp("ECODE", info_upper, SIZEOF("ECODE")-1))
mode = DOLLAR_STACK_ECODE;
else if (!memcmp("PLACE", info_upper, SIZEOF("PLACE")-1))
mode = DOLLAR_STACK_PLACE;
}
if (DOLLAR_STACK_INVALID == mode)
rts_error(VARLSTCNT(4) ERR_INVSTACODE, 2, info->str.len, info->str.addr);
result->mvtype = MV_STR;
result->str.len = 0; /* set result to null string before any processing */
cur_zlevel = dollar_zlevel();
if (0 <= level)
{
if (!dollar_stack.index)
{
if (level < cur_zlevel)
{
GET_FRAME_INFO(level, mode, cur_zlevel, result);
}
} else if (level < dollar_stack.index)
get_dollar_stack_info(level, mode, result);
else if (!dollar_stack.incomplete && (1 == dollar_ecode.index)
&& (error_frame == dollar_ecode.first_ecode_error_frame) && (level < cur_zlevel))
{
GET_FRAME_INFO(level, mode, cur_zlevel, result);
}
}
return;
}