Code: Select all
Index: cache.hpp
===================================================================
--- cache.hpp (revision 5769)
+++ cache.hpp (working copy)
@@ -38,7 +38,10 @@
CachedRead(File& file);
~CachedRead();
bool Read(LPVOID Data, DWORD DataSize, LPDWORD BytesRead);
- bool FillBuffer();
+#if 1 // =(w17)=
+ bool Unread(DWORD BytesUnread);
+#endif
+ bool FillBuffer();
void Clear();
private:
Index: cache.cpp
===================================================================
--- cache.cpp (revision 5769)
+++ cache.cpp (working copy)
@@ -109,6 +109,18 @@
return Result;
}
+#if 1 // =(w17)=
+bool CachedRead::Unread(DWORD BytesUnread)
+{
+ if (BytesUnread + BytesLeft <= ReadSize)
+ {
+ BytesLeft += BytesUnread;
+ return true;
+ }
+ return false;
+}
+#endif
+
bool CachedRead::FillBuffer()
{
bool Result=false;
Index: viewer.cpp
===================================================================
--- viewer.cpp (revision 5769)
+++ viewer.cpp (working copy)
@@ -2309,6 +2309,7 @@
ReverseSearch=SearchDlg[SD_CHECKBOX_REVERSE].Selected;
SearchRegexp=SearchDlg[SD_CHECKBOX_REGEXP].Selected;
+ bool t_utf8 = false;
if (SearchHex)
{
strSearchStr = SearchDlg[SD_EDIT_HEX].strData;
@@ -2317,6 +2318,7 @@
else
{
strSearchStr = SearchDlg[SD_EDIT_TEXT].strData;
+ t_utf8 = VM.CodePage == CP_UTF8;
}
strLastSearchStr = strSearchStr;
@@ -2380,7 +2382,7 @@
if (SearchLength>0 && (!ReverseSearch || LastSelPos>0))
{
- wchar_t Buf[8192];
+ wchar_t Buf[8192], t_Buf[ARRAYSIZE(Buf)];
__int64 CurPos=LastSelPos;
int BufSize=ARRAYSIZE(Buf);
@@ -2419,6 +2421,9 @@
if ((ReadSize=vread(Buf,BufSize,SearchHex!=0))<=0)
break;
+ if (t_utf8)
+ memcpy(t_Buf, Buf, ReadSize*sizeof(Buf[0]));
+
DWORD CurTime=GetTickCount();
if (CurTime-StartTime>RedrawTimeout)
@@ -2508,6 +2513,11 @@
if (Match)
{
MatchPos=CurPos+I;
+ if (t_utf8)
+ {
+ MatchPos = CurPos + GetStrBytesNum(t_Buf, I);
+ SearchLength = GetStrBytesNum(t_Buf+I, SearchLength);
+ }
break;
}
}
@@ -2802,6 +2812,11 @@
else
{
ReadSize = MultiByteToWideChar(VM.CodePage, 0, TmpBuf, ConvertSize, Buf, Count);
+ if ( VM.CodePage==CP_UTF8 && ReadSize )
+ {
+ int nb = WideCharToMultiByte(VM.CodePage, 0, Buf,ReadSize, NULL,0, NULL,NULL);
+ Reader.Unread(ConvertSize - nb);
+ }
}
xf_free(TmpBuf);