114 lines
2.8 KiB
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();
|
|
}
|