From 25e10686849e6be5e729f6264b5d0b6e09bb6115 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 21 Feb 2016 19:38:03 +0000 Subject: [PATCH] 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 --- applications/biffexplorer/bemain.lfm | 21 +++--- applications/biffexplorer/bemain.pas | 102 ++++++++++++++++++--------- 2 files changed, 81 insertions(+), 42 deletions(-) diff --git a/applications/biffexplorer/bemain.lfm b/applications/biffexplorer/bemain.lfm index a20dffbd0..1d8055a1c 100644 --- a/applications/biffexplorer/bemain.lfm +++ b/applications/biffexplorer/bemain.lfm @@ -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' diff --git a/applications/biffexplorer/bemain.pas b/applications/biffexplorer/bemain.pas index 4e61e95c8..4242b09bf 100644 --- a/applications/biffexplorer/bemain.pas +++ b/applications/biffexplorer/bemain.pas @@ -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;