Annotation of mstools/samples/multipad/mpfind.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  *                                                                        *
                      3:  *  MODULE     : MpFind.c                                                 *
                      4:  *                                                                        *
                      5:  *  PURPOSE    : Code to do text searches in MultiPad.                    *
                      6:  *                                                                        *
                      7:  *  FUNCTIONS  : RealSlowCompare () - Compares subject string with target *
                      8:  *                                    string.                             *
                      9:  *                                                                        *
                     10:  *               Local_FindText ()          - Looks for the search string in the  *
                     11:  *                                    active window.                      *
                     12:  *                                                                        *
                     13:  *               FindPrev ()        - Find previous occurence of search   *
                     14:  *                                    string.                             *
                     15:  *                                                                        *
                     16:  *               FindNext ()        - Find next occurence of search string*
                     17:  *                                                                        *
                     18:  *               FindDlgProc ()     - Dialog function for Search/Find.    *
                     19:  *                                                                        *
                     20:  *               Find ()            - Invokes FindDlgProc ()              *
                     21:  *                                                                        *
                     22:  ***************************************************************************/
                     23: #include "multipad.h"
                     24: 
                     25: #undef HIWORD
                     26: #undef LOWORD
                     27: 
                     28: #define HIWORD(l) (((WORD*)&(l))[1])
                     29: #define LOWORD(l) (((WORD*)&(l))[0])
                     30: 
                     31: BOOL fCase        = FALSE;    /* Turn case sensitivity off */
                     32: CHAR szSearch[160] = "";       /* Initialize search string  */
                     33: 
                     34: LPSTR AnsiLower (LPSTR);
                     35: 
                     36: /****************************************************************************
                     37:  *                                                                         *
                     38:  *  FUNCTION   : RealSlowCompare ()                                        *
                     39:  *                                                                         *
                     40:  *  PURPOSE    : Compares subject string with the target string. This fn/   *
                     41:  *              is called repeatedly so that all substrings are compared,  *
                     42:  *              which makes it O(n ** 2), hence it's name.                 *
                     43:  *                                                                         *
                     44:  *  RETURNS    : TRUE  - If pSubject is identical to pTarget.              *
                     45:  *              FALSE - otherwise.                                         *
                     46:  *                                                                         *
                     47:  ****************************************************************************/
                     48: 
                     49: BOOL NEAR PASCAL RealSlowCompare (
                     50:        register PSTR pSubject,
                     51:        register PSTR pTarget)
                     52: {
                     53:     if (fCase){
                     54:        while (*pTarget)
                     55:            if (*pTarget++ != *pSubject++)
                     56:                return FALSE;
                     57:     }
                     58:     else{
                     59:        /* If case-insensitive, convert both subject and target to lowercase
                     60:         * before comparing.
                     61:         */
                     62:        AnsiLower ((LPSTR)pTarget);
                     63:        while (*pTarget)
                     64:            if (*pTarget++ != (CHAR)(DWORD)AnsiLower ((LPSTR)(DWORD)(BYTE)*pSubject++))
                     65:                return FALSE;
                     66:     }
                     67:     return TRUE;
                     68: }
                     69: 
                     70: /****************************************************************************
                     71:  *                                                                         *
                     72:  *  FUNCTION   : Local_FindText ()                                                 *
                     73:  *                                                                         *
                     74:  *  PURPOSE    : Finds the search string in the active window according to  *
                     75:  *              search direction (dch) specified ( -1 for reverse and 1 for*
                     76:  *              forward searches).                                         *
                     77:  *                                                                         *
                     78:  ****************************************************************************/
                     79: VOID NEAR PASCAL Local_FindText(register INT dch)
                     80: {
                     81:     register PSTR pText;
                     82:     HANDLE       hT;
                     83:     LONG         l;
                     84:     WORD         cch;
                     85:     INT          i;
                     86: 
                     87:     if (!*szSearch)
                     88:        return;
                     89: 
                     90:     /* Find the current selection range */
                     91:     l = (LONG)SendMessage(hwndActiveEdit, EM_GETSEL, NULL, NULL);
                     92: 
                     93:     /* Get the handle to the text buffer and lock it */
                     94:     hT   = (HANDLE)SendMessage (hwndActiveEdit, EM_GETHANDLE, 0, 0L);
                     95:     pText = LocalLock(hT);
                     96: 
                     97:     /* Get the length of the text */
                     98:     cch = (WORD)SendMessage (hwndActiveEdit, WM_GETTEXTLENGTH, 0, 0L);
                     99: 
                    100:     /* Start with the next char. in selected range ... */
                    101:     pText += LOWORD (l) + dch;
                    102: 
                    103:     /* Compute how many characters are before/after the current selection*/
                    104:     if (dch < 0)
                    105:        i = LOWORD (l);
                    106:     else
                    107:        i = cch - LOWORD (l) + 1 - lstrlen (szSearch);
                    108: 
                    109:     /* While there are uncompared substrings... */
                    110:     while ( i > 0){
                    111:        LOWORD(l)+=dch;
                    112: 
                    113:        /* Does this substring match? */
                    114:        if (RealSlowCompare(pText,szSearch)){
                    115: 
                    116:            /* Yes, unlock the buffer.*/
                    117:            LocalUnlock(hT);
                    118: 
                    119:            /* Select the located string */
                    120:            HIWORD(l) = LOWORD(l) + (WORD)lstrlen (szSearch);
                    121:            SendMessage(hwndActiveEdit, EM_SETSEL, GET_EM_SETSEL_MPS(LOWORD(l), HIWORD(l)));
                    122:            return;
                    123:        }
                    124:        i--;
                    125: 
                    126:        /* increment/decrement start position by 1 */
                    127:        pText += dch;
                    128:     }
                    129: 
                    130:     /* Not found... unlock buffer. */
                    131:     LocalUnlock (hT);
                    132: 
                    133:     /* Give a message */
                    134:     MPError (hwndFrame, MB_OK | MB_ICONEXCLAMATION, IDS_CANTFIND, (LPSTR)szSearch);
                    135: 
                    136:     return;
                    137: }
                    138: 
                    139: /****************************************************************************
                    140:  *                                                                         *
                    141:  *  FUNCTION   : FindPrev ()                                               *
                    142:  *                                                                         *
                    143:  *  PURPOSE    : Finds the previous occurence of the search string. Calls   *
                    144:  *              Local_FindText () with a negative search direction.                *
                    145:  *                                                                         *
                    146:  ****************************************************************************/
                    147: VOID APIENTRY FindPrev()
                    148: {
                    149:     Local_FindText(-1);
                    150: }
                    151: 
                    152: /****************************************************************************
                    153:  *                                                                         *
                    154:  *  FUNCTION   : FindNext ()                                               *
                    155:  *                                                                         *
                    156:  *  PURPOSE    : Finds the next occurence of search string. Calls          *
                    157:  *              Local_FindText () with a positive search direction.                *
                    158:  *                                                                         *
                    159:  ****************************************************************************/
                    160: VOID APIENTRY FindNext()
                    161: {
                    162:     Local_FindText(1);
                    163: }
                    164: 
                    165: /****************************************************************************
                    166:  *                                                                         *
                    167:  *  FUNCTION   : FindDlgProc(hwnd, message, wParam, lParam)                *
                    168:  *                                                                         *
                    169:  *  PURPOSE    : Dialog function for the Search/Find command. Prompts user  *
                    170:  *              for target string, case flag and search direction.         *
                    171:  *                                                                         *
                    172:  ****************************************************************************/
                    173: BOOL APIENTRY FindDlgProc(
                    174:        HWND hwnd,
                    175:        UINT msg,
                    176:        UINT wParam,
                    177:        LONG lParam)
                    178: {
                    179:     switch (msg){
                    180:        case WM_INITDIALOG:{
                    181: 
                    182:            /* Check/uncheck case button */
                    183:            CheckDlgButton (hwnd, (int)IDD_CASE, (WORD)fCase);
                    184: 
                    185:            /* Set default search string to most recently searched string */
                    186:            SetDlgItemText (hwnd, IDD_SEARCH, szSearch);
                    187: 
                    188:            /* Allow search only if target is nonempty */
                    189:            if (!lstrlen (szSearch)){
                    190:                EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
                    191:                EnableWindow (GetDlgItem (hwnd, IDD_PREV), FALSE);
                    192:            }
                    193:            break;
                    194:        }
                    195: 
                    196:        case WM_COMMAND:
                    197:        {
                    198: 
                    199:            /* Search forward by default (see IDOK below) */
                    200:            INT i = 1;
                    201: 
                    202:            switch (LOWORD(wParam)){
                    203:                /* if the search target becomes non-empty, enable searching */
                    204:                case IDD_SEARCH:
                    205:                    if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE){
                    206:                        if (!(WORD) SendDlgItemMessage (hwnd,
                    207:                                                        IDD_SEARCH,
                    208:                                                        WM_GETTEXTLENGTH,
                    209:                                                        0,
                    210:                                                        0L))
                    211:                            i = FALSE;
                    212:                        else
                    213:                            i = TRUE;
                    214:                        EnableWindow (GetDlgItem (hwnd, IDOK), i);
                    215:                        EnableWindow (GetDlgItem (hwnd, IDD_PREV), i);
                    216:                    }
                    217:                    break;
                    218: 
                    219:                case IDD_CASE:
                    220:                    /* Toggle state of case button */
                    221:                    CheckDlgButton (hwnd,
                    222:                                    (int)IDD_CASE,
                    223:                                    (WORD)!IsDlgButtonChecked (hwnd, (int)IDD_CASE));
                    224:                    break;
                    225: 
                    226:                case IDD_PREV:
                    227:                    /* Set direction to backwards */
                    228:                    i=-1;
                    229:                    /*** FALL THRU ***/
                    230: 
                    231:                case IDOK:
                    232:                    /* Save case selection */
                    233:                    fCase = IsDlgButtonChecked( hwnd, IDD_CASE);
                    234: 
                    235:                    /* Get search string */
                    236:                    GetDlgItemText (hwnd, IDD_SEARCH, szSearch, sizeof (szSearch));
                    237: 
                    238:                    /* Find the text */
                    239:                    Local_FindText (i);
                    240:                    /*** FALL THRU ***/
                    241: 
                    242:                /* End the dialog */
                    243:                case IDCANCEL:
                    244:                    EndDialog (hwnd, 0);
                    245:                    break;
                    246: 
                    247:                default:
                    248:                    return FALSE;
                    249:            }
                    250:            break;
                    251:        }
                    252:        default:
                    253:            return FALSE;
                    254:     }
                    255:     return TRUE;
                    256:        UNREFERENCED_PARAMETER(lParam);
                    257: }
                    258: 
                    259: /****************************************************************************
                    260:  *                                                                         *
                    261:  *  FUNCTION   : Find()                                                    *
                    262:  *                                                                         *
                    263:  *  PURPOSE    : Invokes the Search/Find dialog.                           *
                    264:  *                                                                         *
                    265:  ****************************************************************************/
                    266: 
                    267: VOID APIENTRY Find()
                    268: {
                    269:     DialogBox (hInst, IDD_FIND, hwndFrame, (WNDPROC)FindDlgProc);
                    270: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.