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

View File

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