Changeset 783 for trunk/dll/comp.c


Ignore:
Timestamp:
Aug 14, 2007, 6:09:54 AM (18 years ago)
Author:
Steven Levine
Message:

Rework DosFindFirst/Next loops to optimize memory allocation and code paths
Adjust FilesToGet limits
Update configuration notebook scanning page
Start updating #pragma alloc_text positioning for OpenWatcom compatibility

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/comp.c

    r775 r783  
    3131  07 Aug 07 SHL COMP_COLLECT: Avoid collecting empty entries when nothing selected
    3232  06 Aug 07 GKY Reduce DosSleep times (ticket 148)
    33 
     33  13 Aug 07 SHL Sync code with other FilesToGet usage
     34  13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
    3435
    3536***********************************************************************/
     
    3738#define INCL_DOS
    3839#define INCL_WIN
     40#define INCL_DOSERRORS
    3941#define INCL_GPI
    4042#define INCL_LONGLONG
     
    5254#include "fm3dlg.h"
    5355#include "fm3str.h"
    54 
    55 #pragma alloc_text(COMPAREDIR,FillCnrsThread,FillDirList,CompNames,BldFullPathName)
    56 #pragma alloc_text(COMPAREDIR1,CompareDlgProc)
    57 #pragma alloc_text(COMPAREDIR2,SelectCnrsThread,ActionCnrThread)
    58 #pragma alloc_text(COMPAREFILE,CFileDlgProc,CompareFilesThread)
    59 #pragma alloc_text(SNAPSHOT,SnapShot,StartSnap)
    6056
    6157typedef struct
     
    9288//=== SnapShot() Write directory tree to file and recurse if requested ===
    9389
    94 static VOID SnapShot(char *path, FILE * fp, BOOL recurse)
     90static VOID SnapShot(char *path, FILE *fp, BOOL recurse)
    9591{
    96   FILEFINDBUF4 *fb;
     92  PFILEFINDBUF4 pffb;
    9793  char *mask, *enddir;
    9894  HDIR hdir = HDIR_CREATE;
    99   ULONG nm = 1;
    100 
    101   fb = xmalloc(sizeof(FILEFINDBUF4), pszSrcFile, __LINE__);
    102   if (fb) {
     95  ULONG ulFindCnt;
     96
     97  // 13 Aug 07 SHL fimxe to use FileToGet
     98  pffb = xmalloc(sizeof(FILEFINDBUF4), pszSrcFile, __LINE__);
     99  if (pffb) {
    103100    mask = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
    104101    if (mask) {
    105       sprintf(mask,
    106               "%s%s*",
    107               path, (path[strlen(path) - 1] != '\\') ? "\\" : NullStr);
     102      BldFullPathName(mask, path, "*");
     103      // sprintf(mask,
     104      //         "%s%s*",
     105      //         path, (path[strlen(path) - 1] != '\\') ? "\\" : NullStr);
    108106      enddir = strrchr(mask, '\\');
    109107      enddir++;
     108      ulFindCnt = 1;
     109      // 13 Aug 07 SHL fixme to report errors
    110110      if (!DosFindFirst(mask,
    111111                        &hdir,
     
    113113                        FILE_ARCHIVED | FILE_READONLY | FILE_HIDDEN |
    114114                        FILE_SYSTEM,
    115                         fb, sizeof(FILEFINDBUF4), &nm, FIL_QUERYEASIZE)) {
     115                        pffb, sizeof(FILEFINDBUF4), &ulFindCnt, FIL_QUERYEASIZE)) {
    116116        do {
    117           strcpy(enddir, fb->achName);
    118           if (!(fb->attrFile & FILE_DIRECTORY))
     117          strcpy(enddir, pffb->achName);
     118          if (!(pffb->attrFile & FILE_DIRECTORY))
    119119            fprintf(fp,
    120120                    "\"%s\",%u,%lu,%04u/%02u/%02u,%02u:%02u:%02u,%lu,%lu,N\n",
    121121                    mask,
    122122                    enddir - mask,
    123                     fb->cbFile,
    124                     (fb->fdateLastWrite.year + 1980),
    125                     fb->fdateLastWrite.month,
    126                     fb->fdateLastWrite.day,
    127                     fb->ftimeLastWrite.hours,
    128                     fb->ftimeLastWrite.minutes,
    129                     fb->ftimeLastWrite.twosecs,
    130                     fb->attrFile, (fb->cbList > 4) ? (fb->cbList / 2) : 0);
     123                    pffb->cbFile,
     124                    (pffb->fdateLastWrite.year + 1980),
     125                    pffb->fdateLastWrite.month,
     126                    pffb->fdateLastWrite.day,
     127                    pffb->ftimeLastWrite.hours,
     128                    pffb->ftimeLastWrite.minutes,
     129                    pffb->ftimeLastWrite.twosecs,
     130                    pffb->attrFile, (pffb->cbList > 4) ? (pffb->cbList / 2) : 0);
    131131          // Skip . and ..
    132132          else if (recurse &&
    133                    (fb->achName[0] != '.' ||
    134                     (fb->achName[1] &&
    135                      (fb->achName[1] != '.' || fb->achName[2])))) {
     133                   (pffb->achName[0] != '.' ||
     134                    (pffb->achName[1] &&
     135                     (pffb->achName[1] != '.' || pffb->achName[2])))) {
    136136            SnapShot(mask, fp, recurse);
    137137          }
    138           nm = 1;
    139         } while (!DosFindNext(hdir, fb, sizeof(FILEFINDBUF4), &nm));
     138          ulFindCnt = 1;
     139        } while (!DosFindNext(hdir, pffb, sizeof(FILEFINDBUF4), &ulFindCnt));
    140140        DosFindClose(hdir);
    141141      }
    142142      free(mask);
    143143    }
    144     free(fb);
     144    free(pffb);
    145145  }
    146146}
     
    683683  HMQ hmq;
    684684
    685   if (!cmp)
     685  if (!cmp) {
     686    Runtime_Error(pszSrcFile, __LINE__, "no data");
    686687    return;
     688  }
    687689
    688690  DosError(FERR_DISABLEHARDERR);
     
    729731                        FILELIST ***list, INT *numfiles, INT *numalloc)
    730732{
    731 
    732   BYTE *fb;
    733733  CHAR *enddir;
    734734  ULONG x;
    735735  CHAR *maskstr;
    736   FILEFINDBUF4 *ffb4, *pffb;
     736  PFILEFINDBUF4 pffbArray;
     737  PFILEFINDBUF4 pffbFile;
    737738  HDIR hDir;
    738   ULONG nm, fl = 0, ulM = FilesToGet;
     739  ULONG ulFindCnt;
     740  ULONG ulBufBytes = sizeof(FILEFINDBUF4) * FilesToGet;
    739741  APIRET rc;
    740742
     
    744746  }
    745747
    746   //if (!recurse)
    747   //  ulM = FilesToGet;
    748748  maskstr = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
    749749  if (!maskstr)
    750750    return;
    751   ffb4 = xmalloc(sizeof(FILEFINDBUF4) * ulM, pszSrcFile, __LINE__);
    752   if (!ffb4) {
     751  pffbArray = xmalloc(ulBufBytes, pszSrcFile, __LINE__);
     752  if (!pffbArray) {
    753753    free(maskstr);
    754754    return;
     
    765765  *(enddir + 1) = 0;
    766766  hDir = HDIR_CREATE;
    767   nm = ulM;
    768   if (recurse)
    769     fl = FILE_DIRECTORY;
    770767  DosError(FERR_DISABLEHARDERR);
     768  ulFindCnt = FilesToGet;
    771769  rc = DosFindFirst(maskstr, &hDir,
    772                     (FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
    773                      FILE_SYSTEM | FILE_HIDDEN) | fl,
    774                     ffb4, sizeof(FILEFINDBUF4) * nm, &nm, FIL_QUERYEASIZE);
     770                    FILE_NORMAL | FILE_READONLY | FILE_ARCHIVED |
     771                    FILE_SYSTEM | FILE_HIDDEN |
     772                    (recurse ? FILE_DIRECTORY : 0),
     773                    pffbArray, ulBufBytes, &ulFindCnt, FIL_QUERYEASIZE);
    775774  if (!rc) {
    776     while (!rc) {
    777       fb = (BYTE *) ffb4;
    778       x = 0;
    779       while (x < nm) {
    780         pffb = (FILEFINDBUF4 *) fb;
    781         if (pffb->attrFile & FILE_DIRECTORY) {
     775    do {
     776      pffbFile = pffbArray;
     777      for (x = 0; x < ulFindCnt; x++) {
     778        if (pffbFile->attrFile & FILE_DIRECTORY) {
    782779          // Skip . and ..
    783780          if (recurse &&
    784               (pffb->achName[0] != '.' ||
    785                (pffb->achName[1] &&
    786                 (pffb->achName[1] != '.' || pffb->achName[2])))) {
     781              (pffbFile->achName[0] != '.' ||
     782               (pffbFile->achName[1] &&
     783                (pffbFile->achName[1] != '.' || pffbFile->achName[2])))) {
    787784            if (fForceUpper)
    788               strupr(pffb->achName);
     785              strupr(pffbFile->achName);
    789786            else if (fForceLower)
    790               strlwr(pffb->achName);
    791             memcpy(enddir, pffb->achName, pffb->cchName + 1);
     787              strlwr(pffbFile->achName);
     788            memcpy(enddir, pffbFile->achName, pffbFile->cchName + 1);
    792789            FillDirList(maskstr, skiplen, recurse, list, numfiles, numalloc);
    793790          }
     
    795792        else {
    796793          if (fForceUpper)
    797             strupr(pffb->achName);
     794            strupr(pffbFile->achName);
    798795          else if (fForceLower)
    799             strlwr(pffb->achName);
    800           memcpy(enddir, pffb->achName, pffb->cchName + 1);
    801           if (AddToFileList
    802               (maskstr + skiplen, pffb, list, numfiles, numalloc))
     796            strlwr(pffbFile->achName);
     797          memcpy(enddir, pffbFile->achName, pffbFile->cchName + 1);
     798          if (AddToFileList(maskstr + skiplen,
     799                            pffbFile, list, numfiles, numalloc)) {
    803800            goto Abort;
    804         }
    805         fb += pffb->oNextEntryOffset;
    806         x++;
    807       }
    808       nm = ulM;
     801          }
     802        }
     803        pffbFile = (PFILEFINDBUF4)((PBYTE)pffbFile + pffbFile->oNextEntryOffset);
     804      } // for
    809805      DosError(FERR_DISABLEHARDERR);
    810       rc = DosFindNext(hDir, ffb4, sizeof(FILEFINDBUF4) * nm, &nm);
    811     }
    812   Abort:
     806      ulFindCnt = FilesToGet;
     807      rc = DosFindNext(hDir, pffbArray, ulBufBytes, &ulFindCnt);
     808    } while (!rc);
     809
     810Abort:
     811
    813812    DosFindClose(hDir);
    814813    DosSleep(1);
    815814  }
     815
     816  if (rc && rc != ERROR_NO_MORE_FILES) {
     817    Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
     818              GetPString(IDS_CANTFINDDIRTEXT), maskstr);
     819  }
     820
    816821  free(maskstr);
    817   free(ffb4);
     822  free(pffbArray);
    818823}
    819824
     
    25002505  return WinDefDlgProc(hwnd, msg, mp1, mp2);
    25012506}
     2507
     2508#pragma alloc_text(COMPAREDIR,FillCnrsThread,FillDirList,CompNames,BldFullPathName)
     2509#pragma alloc_text(COMPAREDIR1,CompareDlgProc)
     2510#pragma alloc_text(COMPAREDIR2,SelectCnrsThread,ActionCnrThread)
     2511#pragma alloc_text(COMPAREFILE,CFileDlgProc,CompareFilesThread)
     2512#pragma alloc_text(SNAPSHOT,SnapShot,StartSnap)
     2513
Note: See TracChangeset for help on using the changeset viewer.