Added missing hex <-> data conversions. Find now works fine.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6816 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
bac2b3f15c
commit
afed986dc0
@ -39,6 +39,7 @@ class FindTextView : public BTextView {
|
||||
virtual void TargetedByScrollView(BScrollView *view);
|
||||
|
||||
status_t SetMode(find_mode mode);
|
||||
void SetData(BMessage &message);
|
||||
void GetData(BMessage &message);
|
||||
|
||||
virtual void KeyDown(const char *bytes, int32 numBytes);
|
||||
@ -49,6 +50,8 @@ class FindTextView : public BTextView {
|
||||
|
||||
private:
|
||||
void HexReformat(int32 oldCursor, int32 &newCursor);
|
||||
status_t GetHexFromData(const uint8 *in, size_t inSize, char **_hex, size_t *_hexSize);
|
||||
status_t GetDataFromHex(const char *text, size_t textLength, uint8 **_data, size_t *_dataSize);
|
||||
|
||||
BScrollView *fScrollView;
|
||||
find_mode fMode;
|
||||
@ -229,6 +232,64 @@ FindTextView::KeyDown(const char *bytes, int32 numBytes)
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
FindTextView::GetHexFromData(const uint8 *in, size_t inSize, char **_hex, size_t *_hexSize)
|
||||
{
|
||||
char *hex = (char *)malloc(inSize * 3 + 1);
|
||||
if (hex == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
const char *text = Text();
|
||||
char *out = hex;
|
||||
for (uint32 i = 0; i < inSize; i++) {
|
||||
out += sprintf(out, "%02x", *(unsigned char *)(text + i));
|
||||
}
|
||||
out[0] = '\0';
|
||||
|
||||
*_hex = hex;
|
||||
*_hexSize = out + 1 - hex;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
FindTextView::GetDataFromHex(const char *text, size_t textLength, uint8 **_data, size_t *_dataSize)
|
||||
{
|
||||
uint8 *data = (uint8 *)malloc(textLength);
|
||||
if (data == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
size_t dataSize = 0;
|
||||
uint8 hiByte = 0;
|
||||
bool odd = false;
|
||||
for (uint32 i = 0; i < textLength; i++) {
|
||||
char c = text[i];
|
||||
int32 number;
|
||||
if (c >= 'A' && c <= 'F')
|
||||
number = c + 10 - 'A';
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
number = c + 10 - 'a';
|
||||
else if (c >= '0' && c <= '9')
|
||||
number = c - '0';
|
||||
else
|
||||
continue;
|
||||
|
||||
if (!odd)
|
||||
hiByte = (number << 4) & 0xf0;
|
||||
else
|
||||
data[dataSize++] = hiByte | (number & 0x0f);
|
||||
|
||||
odd = !odd;
|
||||
}
|
||||
if (odd)
|
||||
data[dataSize++] = hiByte;
|
||||
|
||||
*_data = data;
|
||||
*_dataSize = dataSize;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
FindTextView::SetMode(find_mode mode)
|
||||
{
|
||||
@ -238,35 +299,66 @@ FindTextView::SetMode(find_mode mode)
|
||||
if (mode == kHexMode) {
|
||||
// convert text to hex mode
|
||||
|
||||
int32 length = TextLength();
|
||||
char *hex = (char *)malloc(length * 3 + 1);
|
||||
if (hex == NULL)
|
||||
char *hex;
|
||||
size_t hexSize;
|
||||
if (GetHexFromData((const uint8 *)Text(), TextLength(), &hex, &hexSize) < B_OK)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
fMode = mode;
|
||||
|
||||
const char *text = Text();
|
||||
char *out = hex;
|
||||
for (int32 i = 0; i < length; i++) {
|
||||
out += sprintf(out, "%02x", *(unsigned char *)(text + i));
|
||||
}
|
||||
out[0] = '\0';
|
||||
SetText(hex);
|
||||
SetText(hex, hexSize);
|
||||
free(hex);
|
||||
} else {
|
||||
// ToDo: convert to ascii
|
||||
return B_ERROR;
|
||||
// convert hex to ascii
|
||||
|
||||
uint8 *data;
|
||||
size_t dataSize;
|
||||
if (GetDataFromHex(Text(), TextLength(), &data, &dataSize) < B_OK)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
fMode = mode;
|
||||
|
||||
SetText((const char *)data, dataSize);
|
||||
free(data);
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
FindTextView::SetData(BMessage &message)
|
||||
{
|
||||
uint8 *data;
|
||||
ssize_t dataSize;
|
||||
if (message.FindData("data", B_RAW_TYPE, (const void **)&data, &dataSize) != B_OK)
|
||||
return;
|
||||
|
||||
if (fMode == kHexMode) {
|
||||
char *hex;
|
||||
size_t hexSize;
|
||||
if (GetHexFromData((const uint8 *)Text(), TextLength(), &hex, &hexSize) < B_OK)
|
||||
return;
|
||||
|
||||
SetText(hex, hexSize);
|
||||
free(hex);
|
||||
} else
|
||||
SetText((char *)data, dataSize);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
FindTextView::GetData(BMessage &message)
|
||||
{
|
||||
if (fMode == kHexMode) {
|
||||
// ToDo: ...
|
||||
// convert hex-text to real data
|
||||
uint8 *data;
|
||||
size_t dataSize;
|
||||
if (GetDataFromHex(Text(), TextLength(), &data, &dataSize) != B_OK)
|
||||
return;
|
||||
|
||||
message.AddData("data", B_RAW_TYPE, data, dataSize);
|
||||
free(data);
|
||||
} else
|
||||
message.AddData("data", B_RAW_TYPE, Text(), TextLength());
|
||||
}
|
||||
@ -288,7 +380,7 @@ FindWindow::FindWindow(BRect rect, BMessenger &target)
|
||||
fMenu = new BPopUpMenu("mode");
|
||||
BMessage *message;
|
||||
BMenuItem *item;
|
||||
fMenu->AddItem(item = new BMenuItem("String", message = new BMessage(kMsgFindMode)));
|
||||
fMenu->AddItem(item = new BMenuItem("Text", message = new BMessage(kMsgFindMode)));
|
||||
item->SetMarked(true);
|
||||
message->AddInt8("mode", kAsciiMode);
|
||||
fMenu->AddItem(item = new BMenuItem("Hexadecimal", message = new BMessage(kMsgFindMode)));
|
||||
|
Loading…
x
Reference in New Issue
Block a user