fis-gtm/sr_port/find_line_addr.c

86 lines
2.3 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 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 "cmd_qlf.h"
#include "gtm_caseconv.h"
#include "min_max.h"
GBLREF command_qualifier cmd_qlf;
error_def(ERR_LABELONLY);
int4* find_line_addr(rhdtyp *routine, mstr *label, int4 offset, mident **lent_name)
{
lab_tabent *base, *top, *ptr;
rhdtyp *real_routine;
mident_fixed target_label;
mident lname;
lnr_tabent *line_table, *first_line;
int stat, n;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (!routine)
return NULL;
real_routine = CURRENT_RHEAD_ADR(routine);
first_line = LNRTAB_ADR(real_routine);
if (!label->len || !*label->addr)
{ /* No label specified. Return the first line */
base = LABTAB_ADR(real_routine);
/* Get the null label entry and note whether it has a formallist. */
(TREF(lab_proxy)).has_parms = base->has_parms;
assert(0 == base->lab_name.len);
if (lent_name)
*lent_name = &base->lab_name;
line_table = first_line;
} else
{
lname.len = (label->len <= MAX_MIDENT_LEN) ? label->len : MAX_MIDENT_LEN;
if (cmd_qlf.qlf & CQ_LOWER_LABELS)
lname.addr = label->addr;
else
{
lower_to_upper((uchar_ptr_t)&target_label.c[0], (uchar_ptr_t)label->addr, lname.len);
lname.addr = &target_label.c[0];
}
ptr = base = LABTAB_ADR(real_routine);
top = base + real_routine->labtab_len;
for ( ; ; )
{
n = (int)(top - base) / 2;
ptr = base + n;
MIDENT_CMP(&lname, &ptr->lab_name, stat);
if (0 == stat)
{ /* Note whether the label has a formallist. */
(TREF(lab_proxy)).has_parms = ptr->has_parms;
if (lent_name)
*lent_name = &ptr->lab_name;
line_table = LABENT_LNR_ENTRY(real_routine, ptr);
break;
} else if (0 < stat)
base = ptr;
else
top = ptr;
if (n < 1)
return NULL;
}
}
line_table += offset;
if ((first_line > line_table) || (first_line + real_routine->lnrtab_len <= line_table))
return NULL;
return line_table;
}