From ce94f686d5134ff122d7559864326b9a1708349b Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Sun, 11 Mar 2018 12:28:32 -0500 Subject: [PATCH] regedit: Also display the byte offset in the hex edit dialog. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- 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 46d9b82ffdc..e9729eb8f74 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);