⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fshedview.cpp

📁 HEX编辑器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// fshedView.cpp : implementation of the CFshedView class
//

#include "stdafx.h"
#include "atlbase.h"
#include "fshed.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>

//#include "fshedDoc.h"
#include "fshedView.h"
#include "AddBookmarkDlg.h"
#include "RemoveBookmarkDlg.h"
#include "HexDumpDlg.h"
#include "AppendDialog.h"
#include "ManipulateBitsDlg.h"
#include "SelectBlockDlg.h"
#include "PasteSpecialDlg.h"
#include "FindDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define SUB_RELEASE_NO "156"
#define NO_FILE (Doc->filename[0] == '\0')
#define LASTBYTE (Doc->DataArray.GetUpperBound ())

//--------------------------------------------------------------------------------------------
// FIND_BYTES
// Arguments:
// ps   = Start position.
// ls   = Length of src array.
// pb   = Start of searchstring.
// lb   = Length searchstring.
// mode = -1 : backwards search.
//         1 : forward search.
// cmp  = pointer to function that is applied to data before comparing.
//
// Return:
// Position of found string or -1 if not there.

int find_bytes (char* ps, int ls, char* pb, int lb, int mode, char (*cmp) (char))
{
	int start, inc, end, i;
	if (mode == 1)
	{
		start = 0;
		inc = 1;
		end = ls - lb + 1;
	}
	else
	{
		start = ls - lb;
		inc = -1;
		end = 1;
	}

	for (; mode * start < end; start += inc)
	{
		for (i = start; i < start + lb; i++)
		{
			if (cmp (ps[i]) != cmp (pb[i - start]))
				break;
		}
		if (i == start + lb)
			return start;
	}

	return -1;
}

extern AFX_DATA const BOOL _afxDBCS;
typedef int (WINAPI* AFX_COMPARE_PROC)(LPCTSTR str1, LPCTSTR str2);

int find_bytes (char* ps, int ls, long lStartSel, long lEndSel,
                char* lpszFind, int lb, BOOL bNext, BOOL bCase, BOOL bWholeWord)
{
	UINT nLen = ls;
	int nStartChar = lStartSel, nEndChar = lEndSel;
   if (bWholeWord)
      ++nStartChar;
	UINT nStart = nStartChar;
	int iDir = bNext ? +1 : -1;

	// can't find a match before the first character
	if (nStart == 0 && iDir < 0)
		return FALSE;

	CWaitCursor wait;
	LPCTSTR lpszText = ps;

	if (iDir < 0)
	{
		// always go back one for search backwards
		nStart -= (lpszText+nStart) -
			_tcsdec(lpszText, lpszText+nStart);
	}
	else if (nStartChar != nEndChar) // && SameAsSelected(lpszFind, bCase))
	{
		// easy to go backward/forward with SBCS
		if (_istlead(lpszText[nStart]))
			nStart++;
		nStart += iDir;
	}

	// handle search with nStart past end of buffer
	size_t nLenFind = lstrlen(lpszFind);
	if (nStart+nLenFind-1 >= nLen)
	{
		if (iDir < 0 && nLen >= nLenFind)
		{
			if (_afxDBCS)
			{
				// walk back to previous character n times
				nStart = nLen;
				int n = nLenFind;
				while (n--)
				{
					nStart -= (lpszText+nStart) -
						_tcsdec(lpszText, lpszText+nStart);
				}
			}
			else
			{
				// single-byte character set is easy and fast
				nStart = nLen - nLenFind;
			}
			ASSERT(nStart+nLenFind-1 <= nLen);
		}
		else
		{
			return -1;
		}
	}

	// start the search at nStart
	LPCTSTR lpsz = lpszText + nStart;
	AFX_COMPARE_PROC pfnCompare = bCase ? lstrcmp : lstrcmpi;

	if (_afxDBCS)
	{
		// double-byte string search
		LPCTSTR lpszStop;
		if (iDir > 0)
		{
			// start at current and find _first_ occurrance
			lpszStop = lpszText + nLen - nLenFind + 1;
		}
		else
		{
			// start at top and find _last_ occurrance
			lpszStop = lpsz;
			lpsz = lpszText;
		}

		LPCTSTR lpszFound = NULL;
		while (lpsz <= lpszStop)
		{
			if (!bCase || (*lpsz == *lpszFind &&
				(!_istlead(*lpsz) || lpsz[1] == lpszFind[1])))
			{
				LPTSTR lpch = (LPTSTR)(lpsz + nLenFind);
				TCHAR chSave = *lpch;
				*lpch = '\0';
				int nResult = (*pfnCompare)(lpsz, lpszFind);
				*lpch = chSave;
				if (nResult == 0)
				{
					lpszFound = lpsz;
					if (iDir > 0)
						break;
				}
			}
			lpsz = _tcsinc(lpsz);
		}

		if (lpszFound != NULL)
		{
			int n = (int)(lpszFound - lpszText);
			return n;
		}
	}
	else
	{
		// single-byte string search
		UINT nCompare;
		if (iDir < 0)
			nCompare = (UINT)(lpsz - lpszText) + 1;
		else
			nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1;

		while (nCompare > 0)
		{
			ASSERT(lpsz >= lpszText);
			ASSERT(lpsz+nLenFind-1 <= lpszText+nLen-1);

			LPSTR lpch = (LPSTR)(lpsz + nLenFind);
			char chSave = *lpch;
			*lpch = '\0';
			int nResult = (*pfnCompare)(lpsz, lpszFind);
			*lpch = chSave;
			if (nResult == 0)
			{
				int n = (int)(lpsz - lpszText);
				return n;
			}

			// restore character at end of search
			*lpch = chSave;

			// move on to next substring
			nCompare--;
			lpsz += iDir;
		}
	}

	return -1;
}

inline char equal (char c)
{
	return c;
}

inline char lower_case (char c)
{
	if (c >= 'A' && c <= 'Z')
		return 'a' + c - 'A';
	else
		return c;
}

//Pabs changed - line insert
//used to swap tmpstart and tmpend if start>end
template<class T>void swap(T& x, T& y){
	T temp = x;
	x = y;
	y = temp;
}

/////////////////////////////////////////////////////////////////////////////
// CFshedView
static const UINT _myMsgForFindReplace = ::RegisterWindowMessage(FINDMSGSTRING);

IMPLEMENT_DYNCREATE(CFshedView, CView)

BEGIN_MESSAGE_MAP(CFshedView, CView)
	//{{AFX_MSG_MAP(CFshedView)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_SIZE()
	ON_WM_KEYDOWN()
	ON_WM_CHAR()
	ON_WM_TIMER()
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_WM_KILLFOCUS()
	ON_WM_SETFOCUS()
	ON_COMMAND(ID_EDIT_FIND, OnEditFind)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_COMMAND(ID_EDIT_REPEAT, OnEditRepeat)
	ON_COMMAND(ID_EDIT_REPLACE, OnEditReplace)
	ON_COMMAND_RANGE(IDM_BOOKMARK1, IDM_BOOKMARK9, OnBookmark)
	ON_COMMAND(IDM_REMOVE_BKM, OnRemoveBkm)
	ON_COMMAND(IDM_CLEARALL_BMK, OnClearallBmk)
	ON_COMMAND(IDM_ADDBOOKMARK, OnAddbookmark)
	ON_COMMAND(IDM_COPY_HEXDUMP, OnCopyHexdump)
	ON_COMMAND(IDM_INSERTFILE, OnInsertfile)
	ON_COMMAND(IDM_SAVESELAS, OnSaveselas)
	ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
	ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
	ON_COMMAND(IDA_INSERTMODETOGGLE, OnInsertmodetoggle)
	ON_COMMAND(IDM_CHANGE_MODE, OnChangeMode)
	ON_COMMAND(IDM_EDIT_READONLYMODE, OnEditReadonlymode)
	ON_COMMAND(IDM_EDIT_APPEND, OnEditAppend)
	ON_COMMAND(IDM_EDIT_MANIPULATEBITS, OnEditManipulatebits)
	ON_COMMAND(IDM_SELECT_BLOCK, OnSelectBlock)
	ON_COMMAND(IDM_READFLOAT, OnReadfloat)
	ON_COMMAND(IDM_PROPERTIES, OnProperties)
	ON_COMMAND(IDM_REVERT, OnRevert)
	ON_COMMAND(ID_BOOKMARKS_GOTOBOOKMARK, OnBookmarksGotobookmark)
	ON_UPDATE_COMMAND_UI(ID_BOOKMARKS_GOTOBOOKMARK, OnUpdateBookmarksGotobookmark)
	ON_COMMAND(ID_EDIT_PASTE_SPECIAL, OnEditPasteSpecial)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_REGISTERED_MESSAGE(_myMsgForFindReplace, OnFindReplaceCmd)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFshedView construction/destruction

CFshedView::CFshedView()
{
   hFont = NULL;
   m_bPrinting = FALSE;
   m_cfPrintFont = NULL;
iCutMode = BST_CHECKED;

	bDontMarkCurrentPos = FALSE;

	bInsertingHex = FALSE;

	iWindowX = CW_USEDEFAULT;
	iWindowY = CW_USEDEFAULT;
	iWindowWidth = CW_USEDEFAULT;
	iWindowHeight = CW_USEDEFAULT;
	iWindowShowCmd = SW_SHOW;

	iHexWidth = 3;

	// iClipboardEncode = TRUE;

	pcGotoDlgBuffer = NULL;
	iGotoDlgBufLen = 0;
	iBmkCount=0;
	szFileName[0] = '\0';
	iInsertMode = FALSE;
	bSelected = FALSE;
	bLButtonIsDown = FALSE;
	iStartOfSelection = 0;
	iEndOfSelection = 0;
	m_stScreenSettings.iByteSpace = 2;
	m_stScreenSettings.iCharSpace = 1;
	m_stScreenSettings.iCharsPerLine = App->m_iOffsetLen + m_stScreenSettings.iByteSpace + 
                                       App->m_iBytesPerLine * 3 + m_stScreenSettings.iCharSpace + 
                                       App->m_iBytesPerLine;
	m_iEnteringMode = BYTES;
//	m_iFileChanged = FALSE;

	// Read in the last saved preferences.
//	count_instances();
//	read_ini_data ();

	bSelected = FALSE;
	bLButtonIsDown = FALSE;
//	m_iFileChanged = FALSE;

   m_bFirstSearch = TRUE;
	m_pFindReplaceDlg = NULL; // find or replace dialog
	m_bFindOnly = TRUE; // Is pFindReplace the find or replace?
	m_bCase = FALSE; // TRUE==case sensitive, FALSE==not
	m_bNext = TRUE;  // TRUE==search down, FALSE== search up
	m_bWord = FALSE; // TRUE==match whole word, FALSE==not
   m_lInitialSearchPos = 0;
}

CFshedView::~CFshedView()
{
   if (m_cfPrintFont)
      delete m_cfPrintFont;
	if (hFont != NULL)
		DeleteObject (hFont);
	if( pcGotoDlgBuffer != NULL )
		delete [] pcGotoDlgBuffer;
   if (m_pFindReplaceDlg)
      delete m_pFindReplaceDlg;
}

BOOL CFshedView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFshedView drawing

void CFshedView::OnDraw(CDC* pDC)
{
	CFshedDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);


	// TODO: add draw code for native data here
//	PAINTSTRUCT ps;
//   HDC hdc = ::BeginPaint (m_hWnd, &ps);
   HDC hdc = pDC->m_hDC;
	//-------------------------------------------------------
	HideCaret ();
	// Delete remains of last position.
	int a, b;
	b = min (m_stScreenSettings.iCurLine + m_stScreenSettings.cyBuffer, m_stScreenSettings.iNumlines-1);
	iBkColor = PALETTERGB (GetRValue(App->m_clrBk),GetGValue(App->m_clrBk),GetBValue(App->m_clrBk));
	iTextColor = PALETTERGB (GetRValue(App->m_clrText),GetGValue(App->m_clrText),GetBValue(App->m_clrText));
	SetTextColor (hdc, iTextColor);
	SetBkColor (hdc, iBkColor);
	HPEN pen1 = CreatePen (PS_SOLID, 1, iBkColor);
	HPEN oldpen = (HPEN) SelectObject (hdc, pen1);
	HBRUSH brush1 = CreateSolidBrush (iBkColor);
	HBRUSH oldbrush = (HBRUSH) SelectObject (hdc, brush1);
	// Delete lower border if there are empty lines on screen.
	if ((b-m_stScreenSettings.iCurLine+1)*m_stScreenSettings.cyChar+CLIENT_BORDER_WIDTH < m_stScreenSettings.cyClient-CLIENT_BORDER_WIDTH)
		Rectangle (hdc, CLIENT_BORDER_WIDTH, (b-m_stScreenSettings.iCurLine+1)*m_stScreenSettings.cyChar+CLIENT_BORDER_WIDTH + m_stScreenSettings.iToolbarHeight, m_stScreenSettings.cxClient-CLIENT_BORDER_WIDTH,
			m_stScreenSettings.cyClient-CLIENT_BORDER_WIDTH + m_stScreenSettings.iToolbarHeight);
	// Delete right border.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -