Files
microser/mmslib/slog/sloghex.c

363 lines
11 KiB
C
Raw Normal View History

2026-06-15 15:48:16 +08:00
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1993-2007, All Rights Reserved */
/* */
/* MODULE NAME : sloghex.c */
/* PRODUCT(S) : SLOG */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 01/15/07 EJV 15 Chg S_LOCK_RESOURCES to S_LOCK_UTIL_RESOURCES*/
/* 08/18/06 JRB 14 Chk _slog_remote_fun along with other ptrs. */
/* 05/23/05 EJV 13 doSlog corr: replaced LOG_IPC_EN with */
/* LOG_IPC_LISTEN_EN || LOG_IPC_CALL_EN */
/* 11/05/04 EJV 12 Added check for LOG_IPC_EN. */
/* 05/18/04 MDE 11 Removed LOG_IPC_SUPPORT #ifdef's */
/* 03/11/04 GLB 10 Remove "thisFileName" */
/* 02/17/03 JRB 09 Del system includes (using sysincs.h). */
/* 03/27/01 MDE 08 Added _slogStr */
/* 09/13/99 MDE 07 Added SD_CONST modifiers */
/* 11/11/98 DSF 06 Minor changes to _slog_dyn_log_fun */
/* 10/09/98 MDE 05 Put back center space per JB request */
/* 10/08/98 MDE 04 Migrated to updated SLOG interface */
/* 04/07/98 MDE 03 Minor warning cleanup */
/* 10/06/97 DSF 02 Added thisFileName */
/* 05/28/97 DSF 01 Added IPC logging capability */
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
/* history. */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "glbsem.h"
#include "slog.h"
#define cvt_nibble(a) ((ST_UCHAR) ((a) > 9 ? (a) + 'A' - 10 : (a) + '0'))
#define DEBUG_BUF_LEN 100
#define CHAR_PER_LINE 75
/************************************************************************/
/* slogHex */
/* Main HEX logging function, typically called via macro */
/* Create the HEX strings && pass to memory & file logging */
/* functions if enabled */
/************************************************************************/
ST_VOID slogHex (LOG_CTRL *lc,
SD_CONST ST_INT logType,
SD_CONST ST_CHAR *SD_CONST fileName,
SD_CONST ST_INT lineNum,
SD_CONST ST_INT numBytes,
SD_CONST ST_VOID *hexData)
{
_slogHex (lc, numBytes, hexData);
}
ST_VOID _slogHex (LOG_CTRL *lc,
ST_INT numBytes,
SD_CONST ST_VOID *hexData)
{
ST_INT i;
ST_INT ascii_index;
ST_INT hex_index;
ST_CHAR debug_buf[DEBUG_BUF_LEN+1]; /* output buffer */
ST_INT curlen;
ST_UCHAR ch;
ST_UCHAR hex;
ST_LONG addr;
ST_UINT filCtrlSave;
ST_UINT memCtrlSave;
ST_UCHAR *buf;
S_GS_INIT ();
S_LOCK_UTIL_RESOURCES ();
addr = 0;
/* Make the compiler happy */
buf = (ST_UCHAR *) hexData;
/* Make sure the LOG_CTRL pointer is not NULL */
if (!lc)
{
S_UNLOCK_UTIL_RESOURCES ();
return;
}
/* Check to see if any logging is enabled AND dynamic user logging */
/* function pointer not set */
if (!(lc->logCtrl & (LOG_FILE_EN | LOG_MEM_EN | LOG_IPC_EN)) &&
!slog_dyn_log_fun && !_slog_dyn_log_fun &&
!slog_remote_fun && !_slog_remote_fun)
{
S_UNLOCK_UTIL_RESOURCES ();
return;
}
/* Remember the state of the wipe/wrap/header enable flags */
/* so that we can restore them later */
filCtrlSave = lc->fc.ctrl & (FIL_CTRL_WIPE_EN |
FIL_CTRL_WRAP_EN |
FIL_CTRL_MSG_HDR_EN);
memCtrlSave = lc->mc.ctrl & MEM_CTRL_MSG_HDR_EN;
/* No hdr or wipe during a hex dump (allow wrap for first line if req'd)*/
lc->fc.ctrl &= ~(FIL_CTRL_WIPE_EN | FIL_CTRL_MSG_HDR_EN);
lc->mc.ctrl &= ~MEM_CTRL_MSG_HDR_EN;
/* Also turn on HEX flag bit for memory logging */
lc->mc.ctrl |= MEM_CTRL_HEX_LOG;
/* OK, now start the dump, line by line */
while (numBytes)
{
curlen = min(numBytes,16); /* # char's in current line */
for (i = 0; i < DEBUG_BUF_LEN; ++i)
debug_buf[i] = ' ';
sprintf (debug_buf,"%05lX ",addr);/* data offset */
hex_index = 7; /* where to put hex data */
ascii_index = 57; /* where to put ascii conversion */
debug_buf[ascii_index++] = '*';
for (i = 0; i < curlen; i++) /* for each byte in this line */
{
ch = *buf++; /* get next character */
hex = (ch >> 4) & (ST_UCHAR) 0x0f;/* write HEX chars for the byte */
hex = cvt_nibble(hex);
debug_buf[hex_index++] = hex;
hex = ch & (ST_UCHAR) 0x0f;
hex = cvt_nibble(hex);
debug_buf[hex_index++] = hex;
++hex_index; /* space between bytes */
if (i == 7)
++hex_index;
if (isprint(ch)) /* print ASCII portion */
debug_buf[ascii_index] = ch;
else
debug_buf[ascii_index] = '.'; /* just put a '.' there */
ascii_index++;
}
debug_buf[ascii_index++] = '*';
debug_buf[ascii_index++] = 0;
addr += 16; /* prepare for next line */
numBytes -= curlen;
/* debug_buf now contains the hex/ascii line to be logged */
/* for the last line to be logged, turn wipe back on */
if (!numBytes)
{
lc->fc.ctrl |= (filCtrlSave & FIL_CTRL_WIPE_EN);
}
if (lc->logCtrl & LOG_FILE_EN) /* File Logging enabled */
{
slogFile (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
if (lc->logCtrl & LOG_MEM_EN) /* Memory Logging enabled */
{
slogMem (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
if ((lc->logCtrl & LOG_IPC_LISTEN_EN) || (lc->logCtrl & LOG_IPC_CALL_EN))
/* IPC Logging enabled (listen, calling, or both modes) */
{
slogIpc (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
/* If the user has set up a dynamic log display function, call it */
if (slog_dyn_log_fun)
{
(*slog_dyn_log_fun)(lc, SLOG_CONT, NULL, 0,
strlen(debug_buf), debug_buf);
}
if (_slog_dyn_log_fun)
{
(*_slog_dyn_log_fun)(lc, slogTimeText, SLOG_CONT, NULL, NULL, 0,
strlen(debug_buf), debug_buf);
}
/* If the user has set up a remote logging function, call it */
if (slog_remote_fun)
{
(*slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT,
NULL, 0,
strlen(debug_buf), debug_buf);
}
if (_slog_remote_fun)
{
(*_slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT, NULL,
NULL, 0,
strlen(debug_buf), debug_buf);
}
/* Don't want to wrap the file in the middle of a hex dump */
lc->fc.ctrl &= ~FIL_CTRL_WRAP_EN;
}
/* All done, restore the flag state bits */
lc->fc.ctrl |= filCtrlSave;
lc->mc.ctrl |= memCtrlSave;
lc->mc.ctrl &= ~MEM_CTRL_HEX_LOG;
S_UNLOCK_UTIL_RESOURCES ();
}
/************************************************************************/
/* slogStr */
/************************************************************************/
ST_VOID _slogStr (LOG_CTRL *lc, ST_CHAR *strData)
{
ST_INT i;
ST_INT ascii_index;
ST_CHAR debug_buf[DEBUG_BUF_LEN+1]; /* output buffer */
ST_INT curlen;
ST_UCHAR ch;
ST_UINT filCtrlSave;
ST_UINT memCtrlSave;
ST_INT numBytes;
S_GS_INIT ();
S_LOCK_UTIL_RESOURCES ();
/* Make sure the LOG_CTRL pointer is not NULL */
if (!lc)
{
S_UNLOCK_UTIL_RESOURCES ();
return;
}
/* Check to see if any logging is enabled AND dynamic user logging */
/* function pointer not set */
if (!(lc->logCtrl & (LOG_FILE_EN | LOG_MEM_EN | LOG_IPC_EN)) &&
!slog_dyn_log_fun && !_slog_dyn_log_fun &&
!slog_remote_fun && !_slog_remote_fun)
{
S_UNLOCK_UTIL_RESOURCES ();
return;
}
/* Remember the state of the wipe/wrap/header enable flags */
/* so that we can restore them later */
filCtrlSave = lc->fc.ctrl & (FIL_CTRL_WIPE_EN |
FIL_CTRL_WRAP_EN |
FIL_CTRL_MSG_HDR_EN);
memCtrlSave = lc->mc.ctrl & MEM_CTRL_MSG_HDR_EN;
/* No hdr or wipe during a hex dump (allow wrap for first line if req'd)*/
lc->fc.ctrl &= ~(FIL_CTRL_WIPE_EN | FIL_CTRL_MSG_HDR_EN);
lc->mc.ctrl &= ~MEM_CTRL_MSG_HDR_EN;
/* OK, now start the dump, line by line */
numBytes = strlen (strData);
while (numBytes)
{
curlen = min (numBytes,CHAR_PER_LINE); /* # char's in current line */
ascii_index = 0; /* where to put ascii conversion */
for (i = 0; i < curlen; i++) /* for each byte in this line */
{
ch = *strData++; /* get next character */
if (isprint(ch)) /* print ASCII portion */
debug_buf[ascii_index] = ch;
else if (ch == '\n')
{
debug_buf[ascii_index] = ch;
++i;
break;
} /* end of this line */
else if (ch == '\t')
debug_buf[ascii_index] = ch;
else
debug_buf[ascii_index] = '.'; /* just put a '.' there */
ascii_index++;
}
debug_buf[ascii_index++] = 0;
numBytes -= i;
/* debug_buf now contains the ascii line to be logged */
/* for the last line to be logged, turn wipe back on */
if (!numBytes)
{
lc->fc.ctrl |= (filCtrlSave & FIL_CTRL_WIPE_EN);
}
if (lc->logCtrl & LOG_FILE_EN) /* File Logging enabled */
{
slogFile (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
if (lc->logCtrl & LOG_MEM_EN) /* Memory Logging enabled */
{
slogMem (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
if ((lc->logCtrl & LOG_IPC_LISTEN_EN) || (lc->logCtrl & LOG_IPC_CALL_EN))
/* IPC Logging enabled (listen, calling, or both modes) */
{
slogIpc (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
}
/* If the user has set up a dynamic log display function, call it */
if (slog_dyn_log_fun)
{
(*slog_dyn_log_fun)(lc, SLOG_CONT, NULL, 0,
strlen(debug_buf), debug_buf);
}
if (_slog_dyn_log_fun)
{
(*_slog_dyn_log_fun)(lc, slogTimeText, SLOG_CONT, NULL, NULL, 0,
strlen(debug_buf), debug_buf);
}
/* If the user has set up a remote logging function, call it */
if (slog_remote_fun)
{
(*slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT,
NULL, 0,
strlen(debug_buf), debug_buf);
}
if (_slog_remote_fun)
{
(*_slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT, NULL,
NULL, 0,
strlen(debug_buf), debug_buf);
}
/* Don't want to wrap the file in the middle of a hex dump */
lc->fc.ctrl &= ~FIL_CTRL_WRAP_EN;
}
/* All done, restore the flag state bits */
lc->fc.ctrl |= filCtrlSave;
lc->mc.ctrl |= memCtrlSave;
lc->mc.ctrl &= ~MEM_CTRL_HEX_LOG;
S_UNLOCK_UTIL_RESOURCES ();
}