81 lines
2.7 KiB
C
81 lines
2.7 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 "gtm_string.h"
|
|
|
|
#include "error.h"
|
|
#include "error_trap.h"
|
|
#include "merrors_ansi.h"
|
|
|
|
/* ECODE_MAX_LEN is the maximum length of the string representation of "errnum"'s ECODE.
|
|
* This is arrived at as follows : ",M<number>,Z<number>,". Each number can be at most MAX_NUM_SIZE.
|
|
* The three ","s and the letters "M" and "Z" add up to 5 characters.
|
|
* In addition we give a buffer for overflow in the production version (just in case).
|
|
*/
|
|
#define BUFFER_FOR_OVERFLOW 15 /* give some buffer in case overflow happens in PRO */
|
|
#define ECODE_MAX_LEN ((2 * MAX_DIGITS_IN_INT) + STR_LIT_LEN(",M,Z,"))
|
|
#define ECODE_MAX_LEN_WITH_BUFFER ((ECODE_MAX_LEN) + (BUFFER_FOR_OVERFLOW))
|
|
|
|
void ecode_set(int errnum)
|
|
{
|
|
mval tmpmval;
|
|
const err_ctl *ectl;
|
|
mstr ecode_mstr;
|
|
char ecode_buff[ECODE_MAX_LEN_WITH_BUFFER];
|
|
char *ecode_ptr;
|
|
int ansi_error;
|
|
int severity;
|
|
|
|
error_def(ERR_SETECODE);
|
|
|
|
/* If this routine was called with error code SETECODE,
|
|
* an end-user just put a correct value into $ECODE,
|
|
* and it shouldn't be replaced by this routine.
|
|
*/
|
|
if (ERR_SETECODE == errnum)
|
|
return;
|
|
/* When the value of $ECODE is non-empty, error trapping
|
|
* will be invoked. When the severity level does not warrant
|
|
* error trapping, no value should be copied into $ECODE
|
|
*/
|
|
severity = errnum & SEV_MSK;
|
|
if ((INFO == severity) || (SUCCESS == severity))
|
|
return;
|
|
/* Get ECODE string from error-number. If the error has an ANSI standard code, return ,Mnnn, (nnn is ANSI code).
|
|
* Always return ,Zxxx, (xxx is GT.M code). Note that the value of $ECODE must start and end with a comma
|
|
*/
|
|
ecode_ptr = &ecode_buff[0];
|
|
*ecode_ptr++ = ',';
|
|
if (ectl = err_check(errnum))
|
|
{
|
|
ansi_error = ((errnum & FACMASK(ectl->facnum)) && (MSGMASK(errnum, ectl->facnum) <= ectl->msg_cnt))
|
|
? error_ansi[MSGMASK(errnum, ectl->facnum) - 1]
|
|
: 0;
|
|
if (ansi_error > 0)
|
|
{
|
|
*ecode_ptr++ = 'M';
|
|
ecode_ptr = (char *)i2asc((unsigned char *)ecode_ptr, ansi_error);
|
|
*ecode_ptr++ = ',';
|
|
}
|
|
}
|
|
*ecode_ptr++ = 'Z';
|
|
ecode_ptr = (char *)i2asc((unsigned char *)ecode_ptr, errnum);
|
|
*ecode_ptr++ = ',';
|
|
ecode_mstr.addr = &ecode_buff[0];
|
|
ecode_mstr.len = INTCAST(ecode_ptr - ecode_mstr.addr);
|
|
assert(ecode_mstr.len <= ECODE_MAX_LEN);
|
|
if (ecode_mstr.len > ECODE_MAX_LEN_WITH_BUFFER)
|
|
GTMASSERT;
|
|
ecode_add(&ecode_mstr);
|
|
}
|