+ // check if it is same page with different anchor:
+ if (m_LastPage != NULL)
+ {
+ wxChar *p1, *p2;
+ for (p1 = thepage, p2 = m_LastPage;
+ *p1 != 0 && *p1 != _T('#') && *p1 == *p2; p1++, p2++) {}
+
+ m_LastPage = thepage;
+
+ if (*p1 == 0 || *p1 == _T('#'))
+ return FALSE;
+ }
+ else m_LastPage = thepage;
+
+ wxFileSystem fsys;
+ file = fsys.OpenFile(m_Data->m_Contents[i].m_Book->GetFullPath(thepage));
+ if (file)
+ {
+ if (m_Engine.Scan(file->GetStream()))
+ {
+ m_Name = m_Data->m_Contents[i].m_Name;
+ m_ContentsItem = m_Data->m_Contents + i;
+ found = TRUE;
+ }
+ delete file;
+ }
+ return found;
+}
+
+
+
+
+
+
+
+
+//--------------------------------------------------------------------------------
+// wxSearchEngine
+//--------------------------------------------------------------------------------
+
+void wxSearchEngine::LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only)
+{
+ m_CaseSensitive = case_sensitive;
+ m_WholeWords = whole_words_only;
+ if (m_Keyword) delete[] m_Keyword;
+ m_Keyword = new wxChar[keyword.Length() + 1];
+ wxStrcpy(m_Keyword, keyword.c_str());
+
+ if (!m_CaseSensitive)
+ {
+ for (int i = wxStrlen(m_Keyword) - 1; i >= 0; i--)
+ {
+ if ((m_Keyword[i] >= wxT('A')) && (m_Keyword[i] <= wxT('Z')))
+ m_Keyword[i] += wxT('a') - wxT('A');
+ }
+ }
+}
+
+
+
+#define WHITESPACE(c) (c == ' ' || c == '\n' || c == '\r' || c == '\t')
+
+bool wxSearchEngine::Scan(wxInputStream *stream)
+{
+ wxASSERT_MSG(m_Keyword != NULL, wxT("wxSearchEngine::LookFor must be called before scanning!"));
+
+ int i, j;
+ int lng = stream ->GetSize();
+ int wrd = wxStrlen(m_Keyword);
+ bool found = FALSE;
+ char *buf = new char[lng + 1];
+ stream->Read(buf, lng);
+ buf[lng] = 0;
+
+ if (!m_CaseSensitive)
+ for (i = 0; i < lng; i++)
+ if ((buf[i] >= 'A') && (buf[i] <= 'Z')) buf[i] += 'a' - 'A';
+
+ if (m_WholeWords)
+ {
+ for (i = 0; i < lng - wrd; i++)
+ {
+ if (WHITESPACE(buf[i])) continue;
+ j = 0;
+ while ((j < wrd) && (buf[i + j] == m_Keyword[j])) j++;
+ if (j == wrd && WHITESPACE(buf[i + j])) { found = TRUE; break; }
+ }
+ }
+
+ else
+ {
+ for (i = 0; i < lng - wrd; i++)
+ {
+ j = 0;
+ while ((j < wrd) && (buf[i + j] == m_Keyword[j])) j++;
+ if (j == wrd) { found = TRUE; break; }
+ }
+ }
+
+ delete[] buf;