Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions ACE/ace/ACE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2296,31 +2296,35 @@ ACE::format_hexdump (const char *buffer,
{
ACE_TRACE ("ACE::format_hexdump");

const size_t bytes_per_line = 16;
const size_t bytes_per_group = bytes_per_line / 2;
const size_t output_chars_per_line = 68;

u_char c;
ACE_TCHAR textver[16 + 1];
ACE_TCHAR textver[bytes_per_line + 1];

// We can fit 16 bytes output in text mode per line, 4 chars per byte.
size_t maxlen = (obuf_sz / 68) * 16;
// Format up to bytes_per_line input bytes per output line.
size_t max_input_bytes = (obuf_sz / output_chars_per_line) * bytes_per_line;
const ACE_TCHAR *const obuf_start = obuf;

if (size > maxlen)
size = maxlen;
if (size > max_input_bytes)
size = max_input_bytes;

size_t i;

size_t const lines = size / 16;
size_t const lines = size / bytes_per_line;
for (i = 0; i < lines; i++)
{
size_t j;

for (j = 0 ; j < 16; j++)
for (j = 0 ; j < bytes_per_line; j++)
{
c = (u_char) buffer[(i << 4) + j]; // or, buffer[i*16+j]
c = (u_char) buffer[(i * bytes_per_line) + j];
ACE_OS::snprintf (obuf, obuf_sz - (obuf - obuf_start),
ACE_TEXT ("%02x "),
c);
obuf += 3;
if (j == 7)
if (j == bytes_per_group - 1)
{
*obuf++ = ACE_TEXT (' ');
}
Expand All @@ -2337,28 +2341,28 @@ ACE::format_hexdump (const char *buffer,
++obuf;
}

if (size % 16)
if (size % bytes_per_line)
{
for (i = 0 ; i < size % 16; i++)
for (i = 0 ; i < size % bytes_per_line; i++)
{
c = (u_char) buffer[size - size % 16 + i];
c = (u_char) buffer[size - size % bytes_per_line + i];
ACE_OS::snprintf (obuf, obuf_sz - (obuf - obuf_start),
ACE_TEXT ("%02x "),
c);
obuf += 3;
if (i == 7)
if (i == bytes_per_group - 1)
{
*obuf++ = ACE_TEXT (' ');
}
textver[i] = ACE_OS::ace_isprint (c) ? c : u_char ('.');
}

for (i = size % 16; i < 16; i++)
for (i = size % bytes_per_line; i < bytes_per_line; i++)
{
ACE_OS::snprintf (obuf, obuf_sz - (obuf - obuf_start),
ACE_TEXT (" "));
obuf += 3;
if (i == 7)
if (i == bytes_per_group - 1)
{
*obuf++ = ACE_TEXT (' ');
}
Expand Down
Loading