biffexplorer: Fix hexeditor highlighting characters belonging to an ansi/widestring

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4520 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-02-21 19:38:03 +00:00
parent 3d772b90c6
commit 25e1068684
2 changed files with 81 additions and 42 deletions

View File

@ -347,19 +347,20 @@ object MainForm: TMainForm
Width = 1114
end>
GrabStyle = gsGripper
VerticalSpacing = 1
object ToolBar: TToolBar
AnchorSideLeft.Control = CoolBar
AnchorSideTop.Control = CoolBar
Left = 24
Height = 40
Top = 5
Width = 1085
Height = 44
Top = 3
Width = 150
Align = alNone
AutoSize = True
BorderSpacing.Left = 22
BorderSpacing.Top = 3
ButtonHeight = 40
ButtonWidth = 40
BorderSpacing.Top = 1
ButtonHeight = 44
ButtonWidth = 44
Caption = 'ToolBar'
EdgeBorders = []
Images = ImageList
@ -374,18 +375,18 @@ object MainForm: TMainForm
Style = tbsDropDown
end
object ToolButton2: TToolButton
Left = 98
Left = 106
Top = 0
Action = AcFileQuit
end
object ToolButton3: TToolButton
Left = 53
Left = 57
Top = 0
Action = AcFind
end
object ToolButton4: TToolButton
Left = 93
Height = 40
Left = 101
Height = 44
Top = 0
Width = 5
Caption = 'ToolButton4'

View File

@ -790,20 +790,45 @@ end;
function TMainForm.GetValueGridDataSize: Integer;
function ExtractLength(s: String): Integer;
var
i: Integer;
n1, n2: Integer;
isFirst: Boolean;
begin
isFirst := true;
n1 := 0;
n2 := 0;
for i:=1 to Length(s) do
case s[i] of
'0'..'9':
if isFirst then
n1 := n1*10 + ord(s[i]) - ord('0') else
n2 := n2*10 + ord(s[i]) - ord('0');
' ': if isFirst then isFirst := false;
end;
Result := n2 - n1 + 1;
end;
begin
Result := -1;
case ValueGrid.Row of
VALUE_ROW_BITS : Result := SizeOf(Byte);
VALUE_ROW_BYTE : Result := SizeOf(Byte);
VALUE_ROW_SHORTINT : Result := SizeOf(ShortInt);
VALUE_ROW_WORD : Result := SizeOf(Word);
VALUE_ROW_SMALLINT : Result := SizeOf(SmallInt);
VALUE_ROW_DWORD : Result := SizeOf(DWord);
VALUE_ROW_LONGINT : Result := SizeOf(LongInt);
VALUE_ROW_QWORD : Result := SizeOf(QWord);
VALUE_ROW_INT64 : Result := SizeOf(Int64);
VALUE_ROW_SINGLE : Result := SizeOf(Single);
VALUE_ROW_DOUBLE : Result := SizeOf(Double);
VALUE_ROW_BITS : Result := SizeOf(Byte);
VALUE_ROW_BYTE : Result := SizeOf(Byte);
VALUE_ROW_SHORTINT : Result := SizeOf(ShortInt);
VALUE_ROW_WORD : Result := SizeOf(Word);
VALUE_ROW_SMALLINT : Result := SizeOf(SmallInt);
VALUE_ROW_DWORD : Result := SizeOf(DWord);
VALUE_ROW_LONGINT : Result := SizeOf(LongInt);
VALUE_ROW_QWORD : Result := SizeOf(QWord);
VALUE_ROW_INT64 : Result := SizeOf(Int64);
VALUE_ROW_SINGLE : Result := SizeOf(Single);
VALUE_ROW_DOUBLE : Result := SizeOf(Double);
VALUE_ROW_ANSISTRING,
VALUE_ROW_WIDESTRING,
VALUE_ROW_PANSICHAR,
VALUE_ROW_PWIDECHAR : Result := ExtractLength(ValueGrid.Cells[2, ValueGrid.Row]);
end;
end;
@ -1025,10 +1050,9 @@ var
i, j: Integer;
s: String;
sw: WideString;
ls: Integer;
len: SizeInt;
ls: SizeInt;
pw: PWideChar;
p: PChar;
pa: PAnsiChar;
begin
idx := FCurrOffset;
// idx := HexEditor.SelStart.Index;
@ -1038,6 +1062,7 @@ begin
ValueGrid.Cells[1, VALUE_ROW_INDEX] := IntToStr(idx);
// Byte, ShortInt
if idx <= Length(FBuffer)-SizeOf(byte) then begin
ValueGrid.Cells[1, VALUE_ROW_BITS] := IntToBin(FBuffer[idx], 8);
ValueGrid.Cells[2, VALUE_ROW_BITS] := Format('%d ... %d', [idx, idx]);
@ -1053,6 +1078,7 @@ begin
ValueGrid.Cells[2, VALUE_ROW_SHORTINT] := '';
end;
// Word, SmallInt
if idx <= Length(FBuffer)-SizeOf(word) then begin
buf[0] := FBuffer[idx];
buf[1] := FBuffer[idx+1];
@ -1067,6 +1093,7 @@ begin
ValueGrid.Cells[2, VALUE_ROW_SMALLINT] := '';
end;
// DWord, LongInt
if idx <= Length(FBuffer) - SizeOf(DWord) then begin
for i:=0 to SizeOf(DWord)-1 do buf[i] := FBuffer[idx+i];
ValueGrid.Cells[1, VALUE_ROW_DWORD] := IntToStr(DWordLEToN(dw));
@ -1080,6 +1107,7 @@ begin
ValueGrid.Cells[2, VALUE_ROW_LONGINT] := '';
end;
// QWord, Int64
if idx <= Length(FBuffer) - SizeOf(QWord) then begin
for i:=0 to SizeOf(QWord)-1 do buf[i] := FBuffer[idx+i];
ValueGrid.Cells[1, VALUE_ROW_QWORD] := Format('%d', [qw]);
@ -1093,6 +1121,7 @@ begin
ValueGrid.Cells[2, VALUE_ROW_INT64] := '';
end;
// Singke
if idx <= Length(FBuffer) - SizeOf(single) then begin
for i:=0 to SizeOf(single)-1 do buf[i] := FBuffer[idx+i];
ValueGrid.Cells[1, VALUE_ROW_SINGLE] := Format('%f', [sng]);
@ -1102,6 +1131,7 @@ begin
ValueGrid.Cells[2, VALUE_ROW_SINGLE] := '';
end;
// Double
if idx <= Length(FBuffer) - SizeOf(double) then begin
for i:=0 to SizeOf(double)-1 do buf[i] := FBuffer[idx+i];
ValueGrid.Cells[1, VALUE_ROW_DOUBLE] := Format('%f', [dbl]);
@ -1111,8 +1141,9 @@ begin
ValueGrid.Cells[2, VALUE_ROW_DOUBLE] := '';
end;
// AnsiString
if idx < Length(FBuffer) then begin
ls := FBuffer[idx];
ls := Min(FBuffer[idx], Length(FBuffer) - idx - 1);
SetLength(s, ls);
i := idx + 1;
j := 0;
@ -1129,21 +1160,27 @@ begin
ValueGrid.Cells[2, VALUE_ROW_ANSISTRING] := '';
end;
// PAnsiChar
// Avoid buffer overrun
p := PChar(@FBuffer[idx]);
len := 0;
while (p^ <> #0) and (p - @FBuffer[0] < Length(FBuffer)) do
begin
inc(p);
inc(len);
end;
SetLength(s, len);
Move(FBuffer[idx], s[1], len);
ValueGrid.Cells[1, VALUE_ROW_PANSICHAR] := s;
ValueGrid.Cells[2, VALUE_ROW_PANSICHAR] := Format('%d ... %d', [idx, idx + Length(s)]);
ls := Length(FBuffer);
pa := PAnsiChar(@FBuffer[idx]);
ls := 0;
while (pa^ <> #0) and (pa - @FBuffer[0] < Length(FBuffer)) do
begin
inc(pa);
inc(ls);
end;
SetLength(s, ls);
Move(FBuffer[idx], s[1], ls);
ValueGrid.Cells[1, VALUE_ROW_PANSICHAR] := s;
ValueGrid.Cells[2, VALUE_ROW_PANSICHAR] := Format('%d ... %d', [idx, idx + ls]);
// WideString
if idx < Length(FBuffer) then begin
ls := FBuffer[idx];
ls := Min(FBuffer[idx], (Length(FBuffer) - idx - 1) div Sizeof(wideChar));
SetLength(sw, ls);
j := 0;
i := idx + 2;
@ -1156,23 +1193,24 @@ begin
end;
SetLength(sw, j);
ValueGrid.Cells[1, VALUE_ROW_WIDESTRING] := UTF8Encode(sw);
ValueGrid.Cells[2, VALUE_ROW_WIDESTRING] := Format('%d ... %d', [idx, idx + ls*SizeOf(wideChar)+1]);
ValueGrid.Cells[2, VALUE_ROW_WIDESTRING] := Format('%d ... %d', [idx, idx + (ls+1)*SizeOf(wideChar)]);
end else begin
ValueGrid.Cells[1, VALUE_ROW_WIDESTRING] := '';
ValueGrid.Cells[2, VALUE_ROW_WIDESTRING] := '';
end;
// PWideChar
// Avoid buffer overrun
pw := PWideChar(@FBuffer[idx]);
len := 0;
ls := 0;
while (pw^ <> #0) and (pw - @FBuffer[0] < Length(FBuffer)-1) do
begin
inc(pw);
inc(len);
inc(ls);
end;
s := {%H-}WideCharLenToString(PWideChar(@FBuffer[idx]), len);
s := {%H-}WideCharLenToString(PWideChar(@FBuffer[idx]), ls);
ValueGrid.Cells[1, VALUE_ROW_PWIDECHAR] := s;
ValueGrid.Cells[2, VALUE_ROW_PWIDECHAR] := Format('%d ... %d', [idx, idx + Length(s)]);
ValueGrid.Cells[2, VALUE_ROW_PWIDECHAR] := Format('%d ... %d', [idx, idx + ls * SizeOf(widechar)]);
end;