added
This commit is contained in:
parent
dd6715915c
commit
8ba31472df
150
src/utils/listmem.cpp
Normal file
150
src/utils/listmem.cpp
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
#include "listmem.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions to list a memory buffer:
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Turn byte into Hexadecimal ascii representation */
|
||||||
|
static char *hexa(unsigned int i)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
static char asc[3];
|
||||||
|
|
||||||
|
asc[0] = (i >> 4) & 0x0f;
|
||||||
|
asc[1] = i & 0x0f;
|
||||||
|
asc[2] = 0;
|
||||||
|
for (j = 0; j < 2; j++)
|
||||||
|
if (asc[j] > 9) {
|
||||||
|
asc[j] += 55;
|
||||||
|
} else {
|
||||||
|
asc[j] += 48;
|
||||||
|
}
|
||||||
|
return (asc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void swap16(unsigned char *d, const unsigned char *s, int n)
|
||||||
|
{
|
||||||
|
if (n & 1) {
|
||||||
|
n >>= 1;
|
||||||
|
n++;
|
||||||
|
} else {
|
||||||
|
n >>= 1;
|
||||||
|
}
|
||||||
|
while (n--) {
|
||||||
|
int i;
|
||||||
|
i = 2 * n;
|
||||||
|
d[i] = s[i + 1];
|
||||||
|
d[i + 1] = s[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void swap32(unsigned char *d, const unsigned char *s, int n)
|
||||||
|
{
|
||||||
|
if (n & 3) {
|
||||||
|
n >>= 2;
|
||||||
|
n++;
|
||||||
|
} else {
|
||||||
|
n >>= 2;
|
||||||
|
}
|
||||||
|
while (n--) {
|
||||||
|
int i;
|
||||||
|
i = 4 * n;
|
||||||
|
d[i] = s[i + 3];
|
||||||
|
d[i + 1] = s[i + 2];
|
||||||
|
d[i + 2] = s[i + 1];
|
||||||
|
d[i + 3] = s[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Turn byte buffer into hexadecimal representation */
|
||||||
|
void charbuftohex(int len, unsigned char *dt, int maxlen, char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *bf;
|
||||||
|
|
||||||
|
for (i = 0, bf = str; i < len; i++) {
|
||||||
|
char *cp;
|
||||||
|
if (bf - str >= maxlen - 4) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cp = hexa((unsigned int)dt[i]);
|
||||||
|
*bf++ = *cp++;
|
||||||
|
*bf++ = *cp++;
|
||||||
|
*bf++ = ' ';
|
||||||
|
}
|
||||||
|
*bf++ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void listmem(ostream& os, const void *_ptr, int siz, int adr, int opts)
|
||||||
|
{
|
||||||
|
const unsigned char *ptr = (const unsigned char *)_ptr;
|
||||||
|
int i, j, c;
|
||||||
|
char lastlisted[16];
|
||||||
|
int alreadysame = 0;
|
||||||
|
int oneout = 0;
|
||||||
|
unsigned char *mpt;
|
||||||
|
|
||||||
|
if (opts & (LISTMEM_SWAP16 | LISTMEM_SWAP32)) {
|
||||||
|
if ((mpt = (unsigned char *)malloc(siz + 4)) == NULL) {
|
||||||
|
os << "OUT OF MEMORY\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (opts & LISTMEM_SWAP16) {
|
||||||
|
swap16(mpt, ptr, siz);
|
||||||
|
} else if (opts & LISTMEM_SWAP32) {
|
||||||
|
swap32(mpt, ptr, siz);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mpt = (unsigned char *)ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < siz; i += 16) {
|
||||||
|
/* Check for same data (only print first line in this case) */
|
||||||
|
if (oneout != 0 &&
|
||||||
|
siz - i >= 16 && memcmp(lastlisted, mpt + i, 16) == 0) {
|
||||||
|
if (alreadysame == 0) {
|
||||||
|
os << "*\n";
|
||||||
|
alreadysame = 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
alreadysame = 0;
|
||||||
|
/* Line header */
|
||||||
|
os << std::setw(4) << i + adr << " ";
|
||||||
|
|
||||||
|
/* Hexadecimal representation */
|
||||||
|
for (j = 0; j < 16; j++) {
|
||||||
|
if ((i + j) < siz) {
|
||||||
|
os << hexa(mpt[i + j]) << ((j & 1) ? " " : "");
|
||||||
|
} else {
|
||||||
|
os << " " << ((j & 1) ? " " : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
os << " ";
|
||||||
|
|
||||||
|
/* Also print ascii for values that fit */
|
||||||
|
for (j = 0; j < 16; j++) {
|
||||||
|
if ((i + j) < siz) {
|
||||||
|
c = mpt[i + j];
|
||||||
|
if (c >= 0x20 && c <= 0x7f) {
|
||||||
|
os << char(c);
|
||||||
|
} else {
|
||||||
|
os << ".";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
os << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
os << "\n";
|
||||||
|
memcpy(lastlisted, mpt + i, 16);
|
||||||
|
oneout = 1;
|
||||||
|
}
|
||||||
|
if (mpt != ptr) {
|
||||||
|
free(mpt);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/utils/listmem.h
Normal file
11
src/utils/listmem.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef _LISTMEM_H_INCLUDED_
|
||||||
|
#define _LISTMEM_H_INCLUDED_
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
enum ListmemOpts {LISTMEM_SWAP16 = 1, LISTMEM_SWAP32 = 2};
|
||||||
|
|
||||||
|
/// @param startadr starting value for offset listings on the right
|
||||||
|
extern void listmem(std::ostream&, const void *ptr, int sz,
|
||||||
|
int startadr = 0, int opts = 0);
|
||||||
|
|
||||||
|
#endif /* _LISTMEM_H_INCLUDED_ */
|
||||||
Loading…
x
Reference in New Issue
Block a user