fis-gtm/sr_port/op_fnstack1.c

83 lines
2.4 KiB
C

/****************************************************************
* *
* Copyright 2001, 2007 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 "rtnhdr.h"
#include "stack_frame.h"
#include "mvalconv.h"
#include "op.h"
#include "mv_stent.h"
#include "error_trap.h"
#include "dollar_zlevel.h"
#include "get_command_line.h"
/*
* -----------------------------------------------
* op_fnstack1()
*
* MUMPS Stack function (with 1 parameter)
*
* Arguments:
* level - Integer containing level counter
* 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 */
void op_fnstack1(int level, mval *result)
{
int cur_zlevel;
result->mvtype = MV_STR;
cur_zlevel = dollar_zlevel();
if (-1 == level)
{
if (!dollar_ecode.index)
{
MV_FORCE_MVAL(result, cur_zlevel - 1);
} else if ((1 < dollar_ecode.index) || (error_frame != dollar_ecode.first_ecode_error_frame))
MV_FORCE_MVAL(result, (int)dollar_stack.index - 1);
else
{ /* we are in first ECODE error-handler */
if (cur_zlevel > dollar_stack.index)
{
MV_FORCE_MVAL(result, cur_zlevel - 1);
} else
{
MV_FORCE_MVAL(result, (int)dollar_stack.index - 1);
}
}
} else if (0 > level)
result->str.len = 0;
else if (0 == level)
get_command_line(result, FALSE); /* FALSE to indicate we want actual (not processed) command line */
else if (!dollar_stack.index)
{
if (level < cur_zlevel)
get_frame_creation_info(level, cur_zlevel, result);
else
result->str.len = 0;
} else if (level < dollar_stack.index)
get_dollar_stack_info(level, DOLLAR_STACK_MODE, result);
else if (!dollar_stack.incomplete && (1 == dollar_ecode.index)
&& (error_frame == dollar_ecode.first_ecode_error_frame) && (level < cur_zlevel))
get_frame_creation_info(level, cur_zlevel, result);
else
result->str.len = 0;
return;
}