#include "PortTool.h" /* global search string */ char lpszSearch[MAXSEARCHSTRING+1] = ""; HWND hDlgSearch; FINDREPLACE frSearch; /* compare two substrings */ BOOL WINAPI RealSlowCompare (WORD, char *, char *); BOOL WINAPI RealSlowCompare ( WORD wCase, char *lpszSubject, char *lpszTarget) { if (wCase) { while (*lpszTarget) if (*lpszTarget++ != *lpszSubject++) return FALSE; } else { while (*lpszTarget) { if (IsDBCSLeadByte(*lpszSubject) || IsDBCSLeadByte(*lpszTarget)) { if (*lpszTarget++ != *lpszSubject++ || *lpszTarget++ != *lpszSubject++) { return FALSE; } } else { if ((CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszTarget++) != (CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszSubject++)) { return FALSE; } } } } return TRUE; } /* invoke the common search/replace dialog */ BOOL WINAPI FindDialog ( HWND hWnd, WORD wCase, WORD wDir, char *lpszInit) { frSearch.lStructSize = sizeof (FINDREPLACE); frSearch.hwndOwner = hWnd; frSearch.hInstance = (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE); frSearch.Flags = FR_HIDEWHOLEWORD; /* if wCase, case sensitive */ if (wCase) frSearch.Flags |= FR_MATCHCASE; /* if wDir, search forward */ if (wDir) frSearch.Flags |= FR_DOWN; frSearch.lpstrFindWhat = lpszInit; frSearch.lpstrReplaceWith = NULL; frSearch.wFindWhatLen = MAXSEARCHSTRING+1; frSearch.wReplaceWithLen = 0; frSearch.lCustData = 0; frSearch.lpfnHook = NULL; frSearch.lpTemplateName = NULL; /* call common search dialog */ if (hDlgSearch = FindText (&frSearch)) return TRUE; else return FALSE; } /* perform the actual text searching in the edit control data */ BOOL WINAPI LocateText ( HWND hWnd, WORD wCase, WORD wDir, char *lpszStr) { UINT uBegSel, uEndSel, uOrgBegSel, uOrgEndSel; HANDLE hEditData; HWND hWndEdit = (HANDLE)GetWindowLong (hWnd, WL_HWNDEDIT); char *lpEditData; char *lpEditHead; UINT uLen; int nStrLen = strlen (lpszStr); int nChars; /* test for valid string */ if (!*lpszStr) return FALSE; /* locate beginning of selected text */ SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel); uOrgBegSel = uBegSel; uOrgEndSel = uEndSel; /* get length of the text */ uLen = (UINT)SendMessage (hWndEdit, WM_GETTEXTLENGTH, 0, 0); /* Get handle to edit text data and lock it */ #if !defined (WIN32) hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0); lpEditData = LocalLock (hEditData); lpEditHead = lpEditData; #else hEditData = LocalAlloc (LHND, uLen); lpEditData = LocalLock (hEditData); lpEditHead = lpEditData; GetWindowText (hWndEdit, lpEditData, uLen); #endif /* advance starting point past selection one char */ if (wDir) { if (IsDBCSLeadByte(lpEditData[uBegSel])) { uBegSel += 2; } else { uBegSel += 1; } } else { if (IsDBCSLeadByte(*CharPrev(lpEditData, lpEditData + uBegSel))) { uBegSel -= 2; } else { uBegSel -= 1; } } lpEditData += uBegSel; /* count characters to search (either forward to end of file or back to beginning) */ if (wDir) nChars = (int)(uLen - uBegSel + 1 - nStrLen); else nChars = (int)uBegSel; /* compare character by character for a substring match */ //DBCS_FIX while ((wDir && nChars >= nStrLen) || (!wDir && nChars >= 0)) { /* compare this substring for a match */ if (RealSlowCompare (wCase, lpEditData, lpszStr)) { /* string found, cleanup and go away */ LocalUnlock(hEditData); /* scroll parent edit control and select offending text */ SendMessage (hWndEdit, EM_LINESCROLL, 0, SendMessage (hWndEdit, EM_LINEFROMCHAR, uBegSel, 0) - SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0)); /* Select the located string */ uEndSel = uBegSel + nStrLen; SendMessage(hWndEdit, EM_SETSEL, uBegSel, uEndSel); /* return success */ return TRUE; } if (wDir) { if (IsDBCSLeadByte(*lpEditData)) { nChars -= 2; lpEditData += 2; uBegSel += 2; } else { nChars--; lpEditData++; uBegSel++; } } else { lpEditData = CharPrev(lpEditHead, lpEditData); if (IsDBCSLeadByte(*lpEditData)) { nChars -= 2; uBegSel -= 2; } else { nChars--; uBegSel--; } } } LocalUnlock (hEditData); SendMessage (hWndEdit, EM_SETSEL, uOrgBegSel, uOrgEndSel); /* return failed search */ return FALSE; }