Zebediah Figura : regedit: Also display the byte offset in the hex edit dialog.
Alexandre Julliard
julliard at winehq.org
Mon Mar 12 17:40:25 CDT 2018
Module: wine
Branch: master
Commit: ce94f686d5134ff122d7559864326b9a1708349b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ce94f686d5134ff122d7559864326b9a1708349b
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sun Mar 11 12:28:32 2018 -0500
regedit: Also display the byte offset in the hex edit dialog.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/regedit/hexedit.c | 42 ++++++++++++++++++++++--------------------
1 file changed, 22 insertions(+), 20 deletions(-)
diff --git a/programs/regedit/hexedit.c b/programs/regedit/hexedit.c
index 46d9b82..e9729eb 100644
--- a/programs/regedit/hexedit.c
+++ b/programs/regedit/hexedit.c
@@ -73,32 +73,35 @@ static inline BYTE hexchar_to_byte(WCHAR ch)
return -1;
}
-static LPWSTR HexEdit_GetLineText(BYTE *pData, LONG cbData, LONG pad)
+static LPWSTR HexEdit_GetLineText(int offset, BYTE *pData, LONG cbData, LONG pad)
{
+ static const WCHAR percent_04xW[] = {'%','0','4','X',' ',' ',0};
static const WCHAR percent_02xW[] = {'%','0','2','X',' ',0};
- WCHAR *lpszLine = heap_xalloc((cbData * 3 + pad * 3 + DIV_SPACES + cbData + 1) * sizeof(WCHAR));
+ WCHAR *lpszLine = heap_xalloc((6 + cbData * 3 + pad * 3 + DIV_SPACES + cbData + 1) * sizeof(WCHAR));
LONG i;
+ wsprintfW(lpszLine, percent_04xW, offset);
+
for (i = 0; i < cbData; i++)
- wsprintfW(lpszLine + i*3, percent_02xW, pData[i]);
+ wsprintfW(lpszLine + 6 + i*3, percent_02xW, pData[offset + i]);
for (i = 0; i < pad * 3; i++)
- lpszLine[cbData * 3 + i] = ' ';
+ lpszLine[6 + cbData * 3 + i] = ' ';
for (i = 0; i < DIV_SPACES; i++)
- lpszLine[cbData * 3 + pad * 3 + i] = ' ';
+ lpszLine[6 + cbData * 3 + pad * 3 + i] = ' ';
/* attempt an ASCII representation if the characters are printable,
* otherwise display a '.' */
for (i = 0; i < cbData; i++)
{
/* (C1_ALPHA|C1_BLANK|C1_PUNCT|C1_DIGIT|C1_LOWER|C1_UPPER) */
- if (isprint(pData[i]))
- lpszLine[cbData * 3 + pad * 3 + DIV_SPACES + i] = pData[i];
+ if (isprint(pData[offset + i]))
+ lpszLine[6 + cbData * 3 + pad * 3 + DIV_SPACES + i] = pData[offset + i];
else
- lpszLine[cbData * 3 + pad * 3 + DIV_SPACES + i] = '.';
+ lpszLine[6 + cbData * 3 + pad * 3 + DIV_SPACES + i] = '.';
}
- lpszLine[cbData * 3 + pad * 3 + DIV_SPACES + cbData] = 0;
+ lpszLine[6 + cbData * 3 + pad * 3 + DIV_SPACES + cbData] = 0;
return lpszLine;
}
@@ -110,9 +113,9 @@ HexEdit_Paint(HEXEDIT_INFO *infoPtr)
INT nXStart, nYStart;
COLORREF clrOldText;
HFONT hOldFont;
- BYTE *pData;
INT iMode;
LONG lByteOffset = infoPtr->nScrollPos * infoPtr->nBytesPerLine;
+ int i;
/* Make a gap from the frame */
nXStart = GetSystemMetrics(SM_CXBORDER);
@@ -125,17 +128,16 @@ HexEdit_Paint(HEXEDIT_INFO *infoPtr)
iMode = SetBkMode(hdc, TRANSPARENT);
hOldFont = SelectObject(hdc, infoPtr->hFont);
-
- for (pData = infoPtr->pData + lByteOffset; pData < infoPtr->pData + infoPtr->cbData; pData += infoPtr->nBytesPerLine)
+
+ for (i = lByteOffset; i < infoPtr->cbData; i += infoPtr->nBytesPerLine)
{
LPWSTR lpszLine;
- LONG nLineLen = min((LONG)((infoPtr->pData + infoPtr->cbData) - pData),
- infoPtr->nBytesPerLine);
+ LONG nLineLen = min(infoPtr->cbData - i, infoPtr->nBytesPerLine);
- lpszLine = HexEdit_GetLineText(pData, nLineLen, infoPtr->nBytesPerLine - nLineLen);
+ lpszLine = HexEdit_GetLineText(i, infoPtr->pData, nLineLen, infoPtr->nBytesPerLine - nLineLen);
/* FIXME: draw hex <-> ASCII mapping highlighted? */
- TextOutW(hdc, nXStart, nYStart, lpszLine, infoPtr->nBytesPerLine * 3 + DIV_SPACES + nLineLen);
+ TextOutW(hdc, nXStart, nYStart, lpszLine, lstrlenW(lpszLine));
nYStart += infoPtr->nHeight;
heap_free(lpszLine);
@@ -158,14 +160,14 @@ HexEdit_UpdateCaret(HEXEDIT_INFO *infoPtr)
INT nByteLinePos = nCaretBytePos % infoPtr->nBytesPerLine;
INT nLine = nCaretBytePos / infoPtr->nBytesPerLine;
LONG nLineLen = min(infoPtr->cbData - nLine * infoPtr->nBytesPerLine, infoPtr->nBytesPerLine);
- LPWSTR lpszLine = HexEdit_GetLineText(infoPtr->pData + nLine * infoPtr->nBytesPerLine, nLineLen, infoPtr->nBytesPerLine - nLineLen);
+ LPWSTR lpszLine = HexEdit_GetLineText(nLine * infoPtr->nBytesPerLine, infoPtr->pData, nLineLen, infoPtr->nBytesPerLine - nLineLen);
INT nCharOffset;
/* calculate offset of character caret is on in the line */
if (infoPtr->bFocusHex)
- nCharOffset = nByteLinePos*3 + infoPtr->nCaretPos % 2;
+ nCharOffset = 6 + nByteLinePos*3 + infoPtr->nCaretPos % 2;
else
- nCharOffset = infoPtr->nBytesPerLine*3 + DIV_SPACES + nByteLinePos;
+ nCharOffset = 6 + infoPtr->nBytesPerLine*3 + DIV_SPACES + nByteLinePos;
hdc = GetDC(infoPtr->hwndSelf);
hOldFont = SelectObject(hdc, infoPtr->hFont);
@@ -517,7 +519,7 @@ HexEdit_SetFont (HEXEDIT_INFO *infoPtr, HFONT hFont, BOOL redraw)
SIZE size;
memset(pData, 0, i);
- lpszLine = HexEdit_GetLineText(pData, i, 0);
+ lpszLine = HexEdit_GetLineText(0, pData, i, 0);
GetTextExtentPoint32W(hdc, lpszLine, lstrlenW(lpszLine), &size);
heap_free(lpszLine);
heap_free(pData);
More information about the wine-cvs
mailing list