Changeset 1566


Ignore:
Timestamp:
May 31, 2011, 9:11:14 PM (14 years ago)
Author:
Steven Levine
Message:

Rework Filter() for speed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/filter.c

    r1544 r1566  
    44  $Id$
    55
    6   Filter mask select dialog
     6  Filter mask check and select dialog
    77
    88  Copyright (c) 1993-98 M. Kimes
    9   Copyright (c) 2004, 2010 Steven H.Levine
     9  Copyright (c) 2004, 2011 Steven H.Levine
    1010
    1111  01 Aug 04 SHL Rework lstrip/rstrip usage
     
    2020  07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
    2121  17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
     22  31 May 11 SHL Rework Filter() for speed
    2223
    2324***********************************************************************/
     
    4041#include "errutil.h"                    // Dos_Error...
    4142#include "strutil.h"                    // GetPString
    42 #include "pathutil.h"                   // BldFullPathName
     43#include "pathutil.h"                   // BldFullPathName
    4344#include "filter.h"
    4445#include "select.h"                     // SetMask
     
    6869/**
    6970 * Filter callback
     71 * @return TRUE if filter condition matched and item will be visible
    7072 */
    7173
    7274INT APIENTRY Filter(PMINIRECORDCORE rmini, PVOID arg)
    7375{
    74 
    75   MASK *mask = (MASK *) arg;
    76   PCNRITEM r;
     76  MASK *mask = (MASK *)arg;
     77  PCNRITEM pci;
    7778  INT x;
    78   INT ret = FALSE;
     79  INT matched;
    7980  CHAR *file;
    8081
    81   if (mask) {
    82     r = (PCNRITEM) rmini;
    83     if (!(*(r->pszFileName + 3))
    84         || (mask->fShowDirs && (r->attrFile & FILE_DIRECTORY)))
    85       return TRUE;
    86     if ((!(mask->attrFile & FILE_HIDDEN) && (r->attrFile & FILE_HIDDEN)) ||
    87         (!(mask->attrFile & FILE_SYSTEM) && (r->attrFile & FILE_SYSTEM)) ||
    88         (!(mask->attrFile & FILE_READONLY) && (r->attrFile & FILE_READONLY))
    89         || (!(mask->attrFile & FILE_ARCHIVED)
    90             && (r->attrFile & FILE_ARCHIVED))
    91         || (!(mask->attrFile & FILE_DIRECTORY)
    92             && (r->attrFile & FILE_DIRECTORY)))
    93       return FALSE;
    94     if (((mask->antiattr & FILE_HIDDEN) && !(r->attrFile & FILE_HIDDEN)) ||
    95         ((mask->antiattr & FILE_SYSTEM) && !(r->attrFile & FILE_SYSTEM)) ||
    96         ((mask->antiattr & FILE_READONLY) && !(r->attrFile & FILE_READONLY))
    97         || ((mask->antiattr & FILE_ARCHIVED)
    98             && !(r->attrFile & FILE_ARCHIVED))
    99         || ((mask->antiattr & FILE_DIRECTORY)
    100             && !(r->attrFile & FILE_DIRECTORY)))
    101         return FALSE;
    102     if (*mask->szMask) {
    103       file = strrchr(r->pszFileName, '\\');
    104       if (!file)
    105         file = strrchr(r->pszFileName, ':');
    106       if (file)
    107         file++;
    108       else
    109         file = r->pszFileName;
    110       if (mask->pszMasks[1]) {
    111         for (x = 0; mask->pszMasks[x]; x++) {
    112           if (*mask->pszMasks[x]) {
    113             if (*mask->pszMasks[x] != '/') {
    114               if (wildcard((strchr(mask->pszMasks[x], '\\') ||
    115                             strchr(mask->pszMasks[x], ':')) ?
    116                            r->pszFileName : file, mask->pszMasks[x], FALSE))
    117                 ret = TRUE;
    118             }
    119             else {
    120               if (wildcard((strchr(mask->pszMasks[x], '\\') ||
    121                             strchr(mask->pszMasks[x], ':')) ?
    122                            r->pszFileName : file, mask->pszMasks[x] + 1,
    123                            FALSE)) {
    124                 ret = FALSE;
    125                 break;
    126               }
    127             }
    128           }
    129         }
     82  if (!mask)
     83    return TRUE;                        // No mask data
     84
     85  pci = (PCNRITEM) rmini;
     86  // Always show root directory
     87  // 2011-05-31 SHL fixme to know if this is correct
     88  if (!(*(pci->pszFileName + 3))
     89      || mask->fShowDirs && (pci->attrFile & FILE_DIRECTORY))
     90    return TRUE;
     91
     92  if ((~mask->attrFile & FILE_HIDDEN && pci->attrFile & FILE_HIDDEN) ||
     93      (~mask->attrFile & FILE_SYSTEM && pci->attrFile & FILE_SYSTEM) ||
     94      (~mask->attrFile & FILE_READONLY && pci->attrFile & FILE_READONLY) ||
     95      (~mask->attrFile & FILE_ARCHIVED && pci->attrFile & FILE_ARCHIVED) ||
     96      (~mask->attrFile & FILE_DIRECTORY && pci->attrFile & FILE_DIRECTORY))
     97    return FALSE;
     98
     99  if ((mask->antiattr & FILE_HIDDEN && ~pci->attrFile & FILE_HIDDEN) ||
     100      (mask->antiattr & FILE_SYSTEM && ~pci->attrFile & FILE_SYSTEM) ||
     101      (mask->antiattr & FILE_READONLY && ~pci->attrFile & FILE_READONLY) ||
     102      (mask->antiattr & FILE_ARCHIVED && ~pci->attrFile & FILE_ARCHIVED) ||
     103      (mask->antiattr & FILE_DIRECTORY && ~pci->attrFile & FILE_DIRECTORY))
     104    return FALSE;
     105
     106  if (!*mask->szMask)
     107    return TRUE;                        // No masks
     108
     109  // Have mask string
     110  file = strrchr(pci->pszFileName, '\\');
     111  if (!file)
     112    file = strrchr(pci->pszFileName, ':');
     113  if (file)
     114    file++;                             // Point after drive spec
     115  else
     116    file = pci->pszFileName;
     117
     118  if (!mask->pszMasks[1]) {
     119    // Just one mask string
     120    return wildcard(strchr(mask->szMask, '\\') ||
     121                      strchr(mask->szMask, ':') ?
     122                        pci->pszFileName : file,
     123                    mask->szMask,
     124                    FALSE);
     125  }
     126
     127  // Have multiple mask strings
     128  matched = FALSE;
     129  for (x = 0; mask->pszMasks[x]; x++) {
     130    if (*mask->pszMasks[x]) {
     131      if (*mask->pszMasks[x] != '/') {
     132        if (wildcard((strchr(mask->pszMasks[x], '\\') ||
     133                      strchr(mask->pszMasks[x], ':')) ?
     134                       pci->pszFileName : file,
     135                     mask->pszMasks[x],
     136                     FALSE))
     137        {
     138          matched = TRUE;
     139        }
    130140      }
    131141      else {
    132         if (wildcard((strchr(mask->szMask, '\\') ||
    133                       strchr(mask->szMask, ':')) ?
    134                      r->pszFileName : file, mask->szMask, FALSE))
    135           ret = TRUE;
    136       }
    137     }
    138     else
    139       ret = TRUE;
    140   }
    141   else
    142     ret = TRUE;
    143   return ret;
     142        // Check for non-match
     143        if (wildcard(strchr(mask->pszMasks[x], '\\') ||
     144                      strchr(mask->pszMasks[x], ':') ?
     145                       pci->pszFileName : file, mask->pszMasks[x] + 1,
     146                     FALSE))
     147        {
     148          matched = FALSE;
     149          break;
     150        }
     151      }
     152    }
     153  } // for
     154
     155  return matched;
    144156}
    145157
     
    179191        }
    180192      }
    181     }  //while
     193    } //while
    182194    fclose(fp);
    183195  }
     
    327339      WinCheckButton(hwnd, MSK_HIDDEN, (mask->attrFile & FILE_HIDDEN) != 0);
    328340      WinCheckButton(hwnd, MSK_READONLY,
    329                      (mask->attrFile & FILE_READONLY) != 0);
     341                     (mask->attrFile & FILE_READONLY) != 0);
    330342      WinCheckButton(hwnd, MSK_ARCHIVED,
    331                      (mask->attrFile & FILE_ARCHIVED) != 0);
     343                     (mask->attrFile & FILE_ARCHIVED) != 0);
    332344      WinCheckButton(hwnd, MSK_DIRECTORY,
    333                      (mask->attrFile & FILE_DIRECTORY) != 0);
     345                     (mask->attrFile & FILE_DIRECTORY) != 0);
    334346      WinCheckButton(hwnd, MSK_MUSTSYSTEM,
    335                      (mask->antiattr & FILE_SYSTEM) != 0);
     347                     (mask->antiattr & FILE_SYSTEM) != 0);
    336348      WinCheckButton(hwnd, MSK_MUSTHIDDEN,
    337                      (mask->antiattr & FILE_HIDDEN) != 0);
     349                     (mask->antiattr & FILE_HIDDEN) != 0);
    338350      WinCheckButton(hwnd, MSK_MUSTREADONLY,
    339                      (mask->antiattr & FILE_READONLY) != 0);
     351                     (mask->antiattr & FILE_READONLY) != 0);
    340352      WinCheckButton(hwnd, MSK_MUSTARCHIVED,
    341                      (mask->antiattr & FILE_ARCHIVED) != 0);
     353                     (mask->antiattr & FILE_ARCHIVED) != 0);
    342354      WinCheckButton(hwnd, MSK_MUSTDIRECTORY,
    343                      (mask->antiattr & FILE_DIRECTORY) != 0);
     355                     (mask->antiattr & FILE_DIRECTORY) != 0);
    344356      if (mask->fNoDirs)
    345         WinEnableWindow(WinWindowFromID(hwnd, MSK_SHOWDIRS), FALSE);
     357        WinEnableWindow(WinWindowFromID(hwnd, MSK_SHOWDIRS), FALSE);
    346358      else
    347         WinCheckButton(hwnd, MSK_SHOWDIRS, (mask->fShowDirs != FALSE));
     359        WinCheckButton(hwnd, MSK_SHOWDIRS, (mask->fShowDirs != FALSE));
    348360      WinEnableWindow(WinWindowFromID(hwnd, MSK_MUSTSYSTEM),
    349                       (mask->attrFile & FILE_SYSTEM) != 0);
     361                      (mask->attrFile & FILE_SYSTEM) != 0);
    350362      WinEnableWindow(WinWindowFromID(hwnd, MSK_MUSTHIDDEN),
    351                       (mask->attrFile & FILE_HIDDEN) != 0);
     363                      (mask->attrFile & FILE_HIDDEN) != 0);
    352364      WinEnableWindow(WinWindowFromID(hwnd, MSK_MUSTARCHIVED),
    353                       (mask->attrFile & FILE_ARCHIVED) != 0);
     365                      (mask->attrFile & FILE_ARCHIVED) != 0);
    354366      WinEnableWindow(WinWindowFromID(hwnd, MSK_MUSTREADONLY),
    355                       (mask->attrFile & FILE_READONLY) != 0);
     367                      (mask->attrFile & FILE_READONLY) != 0);
    356368      WinEnableWindow(WinWindowFromID(hwnd, MSK_MUSTDIRECTORY),
    357                     (mask->attrFile & FILE_DIRECTORY) != 0);
     369                    (mask->attrFile & FILE_DIRECTORY) != 0);
    358370    }
    359371    if (*mask->szMask) {
     
    362374      strcpy(s, mask->szMask);
    363375      if (!strchr(mask->szMask, '?') && !strchr(mask->szMask, '*')) {
    364         p = strrchr(mask->szMask, '.');
    365         if (p && *(p + 1)) {
    366           *s = '*';
    367           strcpy(s + 1, p);
    368         }
     376        p = strrchr(mask->szMask, '.');
     377        if (p && *(p + 1)) {
     378          *s = '*';
     379          strcpy(s + 1, p);
     380        }
    369381      }
    370382      WinSetDlgItemText(hwnd, MSK_MASK, s);
    371383      WinSendDlgItemMsg(hwnd, MSK_MASK, EM_SETSEL,
    372                         MPFROM2SHORT(0, CCHMAXPATH), MPVOID);
     384                        MPFROM2SHORT(0, CCHMAXPATH), MPVOID);
    373385      PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
    374386    }
     
    425437                             50,
    426438                             swpE.cy, hwnd, HWND_TOP, 65535, NULL, NULL)) {
    427           Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
    428                     PCSZ_WINCREATEWINDOW);
     439          Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
     440                    PCSZ_WINCREATEWINDOW);
    429441        }
    430442        if (!WinCreateWindow(hwnd,
     
    437449                             swpL.cx - 54,
    438450                             swpE.cy, hwnd, HWND_TOP, MSK_TEXT, NULL, NULL)) {
    439           Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
    440                     PCSZ_WINCREATEWINDOW);
     451          Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
     452                    PCSZ_WINCREATEWINDOW);
    441453        }
    442454        WinSendDlgItemMsg(hwnd, MSK_TEXT,
     
    521533      case LN_SELECT:
    522534        {
    523           sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
     535          sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
    524536                                              MSK_LISTBOX,
    525537                                              LM_QUERYSELECTION,
     
    584596        }
    585597      }
    586       /* intentional fallthru */
     598      // intentional fallthru
    587599    case MSK_CLEAR:
    588600      WinSetDlgItemText(hwnd, MSK_MASK, NullStr);
     
    592604    case DID_OK:
    593605      {
    594 
    595606        mask = INSTDATA(hwnd);
    596607        *s = 0;
     
    600611        if (SHORT1FROMMP(mp1) == DID_OK) {
    601612          mask->attrFile =
    602             (WinQueryButtonCheckstate(hwnd, MSK_SYSTEM) *
    603              FILE_SYSTEM) | (WinQueryButtonCheckstate(hwnd,
    604                                                       MSK_HIDDEN) *
    605                              FILE_HIDDEN) | (WinQueryButtonCheckstate(hwnd,
    606                                                                       MSK_READONLY)
    607                                              *
    608                                              FILE_READONLY) |
    609             (WinQueryButtonCheckstate(hwnd, MSK_ARCHIVED) *
    610              FILE_ARCHIVED) | (WinQueryButtonCheckstate(hwnd,
    611                                                         MSK_DIRECTORY) *
    612                                FILE_DIRECTORY);
     613            (WinQueryButtonCheckstate(hwnd, MSK_SYSTEM) * FILE_SYSTEM) |
     614            (WinQueryButtonCheckstate(hwnd, MSK_HIDDEN) * FILE_HIDDEN) |
     615            (WinQueryButtonCheckstate(hwnd, MSK_READONLY) * FILE_READONLY) |
     616            (WinQueryButtonCheckstate(hwnd, MSK_ARCHIVED) * FILE_ARCHIVED) |
     617            (WinQueryButtonCheckstate(hwnd, MSK_DIRECTORY) * FILE_DIRECTORY);
    613618          mask->antiattr =
    614             (WinQueryButtonCheckstate(hwnd, MSK_MUSTSYSTEM) *
    615              FILE_SYSTEM) | (WinQueryButtonCheckstate(hwnd,
    616                                                       MSK_MUSTHIDDEN) *
    617                              FILE_HIDDEN) | (WinQueryButtonCheckstate(hwnd,
    618                                                                       MSK_MUSTREADONLY)
    619                                              *
    620                                              FILE_READONLY) |
    621             (WinQueryButtonCheckstate(hwnd, MSK_MUSTARCHIVED) *
    622              FILE_ARCHIVED) | (WinQueryButtonCheckstate(hwnd,
    623                                                         MSK_MUSTDIRECTORY) *
    624                                FILE_DIRECTORY);
    625           mask->fShowDirs =
    626             (WinQueryButtonCheckstate(hwnd, MSK_SHOWDIRS) != FALSE);
     619            (WinQueryButtonCheckstate(hwnd, MSK_MUSTSYSTEM) * FILE_SYSTEM) |
     620            (WinQueryButtonCheckstate(hwnd, MSK_MUSTHIDDEN) * FILE_HIDDEN) |
     621            (WinQueryButtonCheckstate(hwnd, MSK_MUSTREADONLY) * FILE_READONLY) |
     622            (WinQueryButtonCheckstate(hwnd, MSK_MUSTARCHIVED) * FILE_ARCHIVED) |
     623            (WinQueryButtonCheckstate(hwnd, MSK_MUSTDIRECTORY) * FILE_DIRECTORY);
     624          mask->fShowDirs = WinQueryButtonCheckstate(hwnd, MSK_SHOWDIRS) != FALSE;
    627625          if (mask->fText)
    628626            WinQueryDlgItemText(hwnd, MSK_TEXT, 256, mask->szText);
    629627        }
    630628        if (*s) {
     629          // Got mask string
    631630          if (SHORT1FROMMP(mp1) == DID_OK) {
    632631            strcpy(mask->szMask, s);
     
    636635            WinDismissDlg(hwnd, 1);
    637636          }
    638           else {
    639             // MSK_DELETE
     637          else {
     638            // MSK_DELETE
    640639            WinSetDlgItemText(hwnd, MSK_MASK, NullStr);
    641640            remove_mask(s);
     
    649648        }
    650649        else {
     650          // No mask string
    651651          if (SHORT1FROMMP(mp1) == DID_OK) {
    652652            *mask->szMask = 0;
     
    655655          }
    656656          else if (!fAlertBeepOff)
    657             DosBeep(50, 100);           // MSK_DELETE
     657            DosBeep(50, 100);           // MSK_DELETE not allowed here
    658658        }
    659659      }
Note: See TracChangeset for help on using the changeset viewer.