fis-gtm/sr_port/op_break.c

114 lines
2.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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 "io.h"
#include <rtnhdr.h>
#include "stack_frame.h"
#include "break.h"
#include "op.h"
#include "dm_setup.h"
#include "min_max.h"
GBLREF io_pair io_curr_device;
GBLREF io_pair io_std_device;
GBLREF stack_frame *frame_pointer;
GBLREF mval dollar_zstatus;
GBLREF int4 break_message_mask;
GBLREF bool dec_nofac;
void op_break(void)
{
bool do_msg;
char *c, *c_top, *line_start;
char line[MAX_ENTRYREF_LEN];
int line_length;
int em;
error_def(ERR_RTSLOC);
error_def(ERR_BREAK);
error_def(ERR_BREAKDEA);
error_def(ERR_BREAKZBA);
error_def(ERR_BREAKZST);
error_def(ERR_NOTPRINCIO);
error_def(ERR_TEXT);
flush_pio();
line_length = 0;
if (frame_pointer->type & SFT_ZTRAP)
{
c = dollar_zstatus.str.addr;
c_top = c + dollar_zstatus.str.len;
/* Skip the error message # in $ZSTATUS */
while (c < c_top) if (*c++ == ',') break;
/* Note down the source-line information in $ZSTATUS */
line_start = c;
while (c < c_top) if (*c++ == ',') break;
if (c < c_top)
{
line_length = (int)(c - 1 - line_start); /* Go back one ',' */
assert(SIZEOF(line) >= line_length);
memcpy(line, line_start, MIN(line_length, SIZEOF(line)));
}
/* The last part of $ZSTATUS is the expanded error message text. Print that followed by the M-source line# */
do_msg = (c < c_top);
if (c < c_top)
{
dec_nofac = TRUE;
dec_err(VARLSTCNT(4) ERR_TEXT, 2, c_top - c, c);
dec_nofac = FALSE;
}
} else
{
do_msg = FALSE;
em = 0;
if (frame_pointer->type & SFT_DEV_ACT)
{ if (break_message_mask & DEVBREAK_MASK)
em = (int) ERR_BREAKDEA;
}
else if ( frame_pointer->type & SFT_ZBRK_ACT)
{ if (break_message_mask & ZBREAK_MASK)
em = (int) ERR_BREAKZBA;
}
else if ( frame_pointer->type & SFT_ZSTEP_ACT)
{ if (break_message_mask & ZSTBREAK_MASK)
em = (int) ERR_BREAKZST;
}
else if (break_message_mask & BREAK_MASK)
{
em = (int) ERR_BREAK;
}
if (em)
{ dec_err(VARLSTCNT(1) em);
do_msg = TRUE;
}
if (do_msg)
line_length = (int)(get_symb_line((uchar_ptr_t)line, 0, 0) - (uchar_ptr_t)line);
}
if (do_msg && (0 != line_length))
{
dec_nofac = TRUE;
dec_err(VARLSTCNT(4) ERR_RTSLOC, 2, line_length, line);
dec_nofac = FALSE;
}
if (io_curr_device.out != io_std_device.out)
{
dec_err(VARLSTCNT(4) ERR_NOTPRINCIO, 2,
io_curr_device.out->trans_name->len,
io_curr_device.out->trans_name->dollar_io);
}
dm_setup();
}