83 lines
2.4 KiB
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;
|
|
}
|