194 lines
6 KiB
C
194 lines
6 KiB
C
|
/*
|
||
|
+-------------------------------------------------------------------------+
|
||
|
| MDI Text File Viewer - Text Search Routines |
|
||
|
+-------------------------------------------------------------------------+
|
||
|
| (c) Copyright 1994 |
|
||
|
| Microsoft Corp. |
|
||
|
| All rights reserved |
|
||
|
| |
|
||
|
| Program : [FVFind.c] |
|
||
|
| Programmer : Arthur Hanson |
|
||
|
| Original Program Date : [Jul 27, 1993 |
|
||
|
| Last Update : [Jul 30, 1993] Time : 18:30 |
|
||
|
| |
|
||
|
| Version: 0.10 |
|
||
|
| |
|
||
|
| Description: |
|
||
|
| |
|
||
|
| History: |
|
||
|
| arth Jul 27, 1993 0.10 Original Version. |
|
||
|
| |
|
||
|
+-------------------------------------------------------------------------+
|
||
|
*/
|
||
|
|
||
|
#include "LogView.h"
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#undef HIWORD
|
||
|
#undef LOWORD
|
||
|
|
||
|
#define HIWORD(l) (((WORD*)&(l))[1])
|
||
|
#define LOWORD(l) (((WORD*)&(l))[0])
|
||
|
|
||
|
BOOL fCase = FALSE; // Turn case sensitivity off
|
||
|
CHAR szSearch[160] = ""; // Initialize search string
|
||
|
|
||
|
|
||
|
extern HWND hDlgFind; /* handle to modeless FindText window */
|
||
|
|
||
|
LPTSTR ReverseScan(
|
||
|
LPTSTR lpSource,
|
||
|
LPTSTR lpLast,
|
||
|
LPTSTR lpSearch,
|
||
|
BOOL fCaseSensitive ) {
|
||
|
int iLen = lstrlen(lpSearch);
|
||
|
|
||
|
if (!lpLast)
|
||
|
lpLast = lpSource + lstrlen(lpSource);
|
||
|
|
||
|
do {
|
||
|
if (lpLast == lpSource)
|
||
|
return NULL;
|
||
|
|
||
|
--lpLast;
|
||
|
|
||
|
if (fCaseSensitive) {
|
||
|
if (*lpLast != *lpSearch)
|
||
|
continue;
|
||
|
} else {
|
||
|
if (CharUpper ((LPTSTR)MAKELONG((WORD)*lpLast, 0)) != CharUpper ((LPTSTR)MAKELONG((WORD)*lpSearch, 0)))
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (fCaseSensitive) {
|
||
|
if (!strncmp( lpLast, lpSearch, iLen))
|
||
|
break;
|
||
|
} else {
|
||
|
if (!_strnicmp (lpLast, lpSearch, iLen))
|
||
|
break;
|
||
|
}
|
||
|
} while (TRUE);
|
||
|
|
||
|
return lpLast;
|
||
|
} // ReverseScan
|
||
|
|
||
|
|
||
|
LPTSTR ForwardScan(LPTSTR lpSource, LPTSTR lpSearch, BOOL fCaseSensitive ) {
|
||
|
int iLen = lstrlen(lpSearch);
|
||
|
|
||
|
while (*lpSource) {
|
||
|
if (fCaseSensitive) {
|
||
|
if (*lpSource != *lpSearch) {
|
||
|
lpSource++;
|
||
|
continue;
|
||
|
}
|
||
|
} else {
|
||
|
if (CharUpper ((LPTSTR)MAKELONG((WORD)*lpSource, 0)) != CharUpper ((LPTSTR)MAKELONG((WORD)*lpSearch, 0))) {
|
||
|
lpSource++;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fCaseSensitive) {
|
||
|
if (!strncmp( lpSource, lpSearch, iLen))
|
||
|
break;
|
||
|
} else {
|
||
|
if (!_strnicmp( lpSource, lpSearch, iLen))
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
lpSource++;
|
||
|
}
|
||
|
|
||
|
return *lpSource ? lpSource : NULL;
|
||
|
} // ForwardScan
|
||
|
|
||
|
|
||
|
// search forward or backward in the edit control text for the given pattern
|
||
|
void FAR Search (TCHAR * szKey) {
|
||
|
HANDLE hText;
|
||
|
TCHAR * pStart, *pMatch;
|
||
|
DWORD_PTR StartIndex, EndIndex;
|
||
|
DWORD SelStart, SelEnd, i;
|
||
|
LRESULT dwSel;
|
||
|
INT_PTR cbText, LineNum;
|
||
|
|
||
|
if (!*szKey)
|
||
|
return;
|
||
|
|
||
|
SetCursor(hWaitCursor);
|
||
|
dwSel= SendMessage(hwndActiveEdit, EM_GETSEL, (WPARAM)&SelStart, (LPARAM)&SelEnd);
|
||
|
|
||
|
/*
|
||
|
* Allocate hText and read edit control text into it.
|
||
|
* Lock hText and fall through to existing code.
|
||
|
*/
|
||
|
|
||
|
cbText= SendMessage(hwndActiveEdit, WM_GETTEXTLENGTH, 0, 0L) + 1;
|
||
|
hText= LocalAlloc( LPTR, cbText );
|
||
|
if( !hText ) // quiet exit if not enough memory
|
||
|
return;
|
||
|
if( !(pStart= LocalLock(hText)) ) {
|
||
|
LocalFree(hText);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
SendMessage(hwndActiveEdit, WM_GETTEXT, cbText, (LPARAM)pStart);
|
||
|
|
||
|
if (fReverse) {
|
||
|
// Get current line number
|
||
|
LineNum= SendMessage(hwndActiveEdit, EM_LINEFROMCHAR, SelStart, 0);
|
||
|
// Get index to start of the line
|
||
|
StartIndex= SendMessage(hwndActiveEdit, EM_LINEINDEX, LineNum, 0);
|
||
|
// Set upper limit for search text
|
||
|
EndIndex= SelStart;
|
||
|
pMatch= NULL;
|
||
|
|
||
|
// Search line by line, from LineNum to 0
|
||
|
i = (DWORD) LineNum;
|
||
|
while (TRUE) {
|
||
|
pMatch= ReverseScan(pStart+StartIndex,pStart+EndIndex,szKey,fCase);
|
||
|
if (pMatch)
|
||
|
break;
|
||
|
// current StartIndex is the upper limit for the next search
|
||
|
EndIndex= StartIndex;
|
||
|
|
||
|
if (i) {
|
||
|
// Get start of the next line
|
||
|
i-- ;
|
||
|
StartIndex= SendMessage(hwndActiveEdit, EM_LINEINDEX, i, 0);
|
||
|
} else
|
||
|
break ;
|
||
|
}
|
||
|
} else {
|
||
|
pMatch= ForwardScan(pStart + SelEnd, szKey, fCase);
|
||
|
}
|
||
|
LocalUnlock(hText);
|
||
|
LocalFree( hText );
|
||
|
SetCursor(hStdCursor);
|
||
|
|
||
|
if (pMatch == NULL) {
|
||
|
TCHAR Message[256], AppName[256] ;
|
||
|
|
||
|
if (!LoadString(hInst, IDS_CANTFINDSTR, Message,
|
||
|
sizeof(Message)/sizeof(Message[0]))) {
|
||
|
Message[0] = 0 ;
|
||
|
}
|
||
|
|
||
|
if (!LoadString(hInst, IDS_APPNAME, AppName,
|
||
|
sizeof(AppName)/sizeof(AppName[0]))) {
|
||
|
AppName[0] = 0 ;
|
||
|
}
|
||
|
|
||
|
MessageBox(hwndFrame, Message, AppName,
|
||
|
MB_APPLMODAL | MB_OK | MB_ICONASTERISK);
|
||
|
} else {
|
||
|
SelStart = (DWORD) (pMatch - pStart);
|
||
|
SendMessage(hwndActiveEdit, EM_SETSEL, SelStart, SelStart+lstrlen(szKey));
|
||
|
SendMessage(hwndActiveEdit, EM_SCROLLCARET, 0, 0);
|
||
|
}
|
||
|
|
||
|
} // Search
|
||
|
|