00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef WSCOUT_GUI_HEX_DUMP_DOCK_HXX_
00024 # define WSCOUT_GUI_HEX_DUMP_DOCK_HXX_
00025
00026 # include <sstream>
00027 # include <iomanip>
00028 # include <locale>
00029
00030 # include "wscout_gui_hex_dump_dock.hh"
00031
00032 namespace wscout
00033 {
00034
00035 namespace gui
00036 {
00037
00038 inline
00039 QString
00040 HexDumpDock::filterBlanksOut(const QString& str)
00041 {
00042 QString r;
00043
00044 for (int i = 0; i < str.size(); ++i)
00045 if (not str[i].isSpace())
00046 r.push_back(str[i]);
00047 return r;
00048 }
00049
00050 inline
00051 void
00052 HexDumpDock::setup(const void* data, size_t len)
00053 {
00054 const unsigned char* const b = static_cast<const unsigned char*> (data);
00055 const unsigned char* const e = b + len;
00056
00057 std::ostringstream addresses;
00058 std::ostringstream hex;
00059 std::ostringstream ascii;
00060
00061 addresses << std::hex << std::uppercase;
00062 hex << std::hex << std::uppercase;
00063 for (const unsigned char* c = b; c < e; c += lwidth)
00064 {
00065 if (c != b)
00066 {
00067 hex << '\n';
00068 ascii << '\n';
00069 addresses << '\n';
00070 }
00071 addresses << std::setfill ('0')
00072 << std::setw (addr_len * 2)
00073 << (c - b);
00074 for (unsigned i = 0; i < lwidth and c + i < e; i += bwidth)
00075 {
00076 if (i)
00077 hex << bigsep;
00078 for (unsigned j = 0; j < bwidth and c + i + j < e; ++j)
00079 {
00080 if (j)
00081 hex << smallsep;
00082 hex << std::setfill ('0') << std::setw (2)
00083 << unsigned (c[i + j]);
00084 ascii << (std::isprint(c[i + j]) ? char (c[i + j]) : '.');
00085 }
00086 }
00087 }
00088
00089 addresses_.setPlainText(addresses.str().c_str());
00090 hexData_.setPlainText(hex.str().c_str());
00091 asciiData_.setPlainText(ascii.str().c_str());
00092 }
00093
00094 }
00095
00096 }
00097
00098 #endif // ! WSCOUT_GUI_HEX_DUMP_DOCK_HXX_