/*********************************************************************** $Id: select.c 618 2007-04-20 19:19:03Z stevenhl $ Container item selection support routines Copyright (c) 1993-98 M. Kimes Copyright (c) 2004, 2006 Steven H. Levine 01 Aug 04 SHL Rework lstrip/rstrip usage 25 May 05 SHL Rework for ULONGLONG 06 Jun 05 SHL Drop unused code 06 Jul 06 SHL Support compare content (IDM_SELECTSAMECONTENT) 13 Jul 06 SHL Use Runtime_Error 29 Jul 06 SHL Use xfgets_bstripcr 15 Aug 06 SHL Rework SetMask args and logic 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits 19 Apr 07 SHL Sync with NumItemsToUnhilite mods ***********************************************************************/ #define INCL_DOS #define INCL_WIN #define INCL_LONGLONG #include #include #include #include #include #include #include "fm3dll.h" #include "fm3str.h" #pragma alloc_text(SELECT,UnHilite,SelectAll,DeselectAll,MarkAll,SetMask) #pragma alloc_text(SELECT,SelectList) #pragma alloc_text(SELECT1,Deselect,HideAll,RemoveAll,ExpandAll,InvertAll) static PSZ pszSrcFile = __FILE__; VOID UnHilite(HWND hwndCnr, BOOL all, CHAR *** list) { PCNRITEM pci; INT numfiles = 0, numalloc = 0, x = 0; INT attribute = CRA_CURSORED; if (all && list && *list) { FreeList(*list); *list = NULL; } pci = (PCNRITEM) CurrentRecord(hwndCnr); if (pci && (INT) pci != -1) { if (pci->rc.flRecordAttr & CRA_SELECTED) { attribute = CRA_SELECTED; pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); } while (pci && (INT) pci != -1) { WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); if (!all) break; // Count is one extra to ensure non-zero elsewhere if (NumItemsToUnhilite && x + 2 == NumItemsToUnhilite){ NumItemsToUnhilite = 0; break; } if (list) AddToList(pci->szFileName, list, &numfiles, &numalloc); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), MPFROMSHORT(CRA_SELECTED)); x++; } } } VOID SelectList(HWND hwndCnr, BOOL partial, BOOL deselect, BOOL clearfirst, PCNRITEM pciParent, CHAR * filename, CHAR ** list) { PCNRITEM pci; register INT x; BOOL foundone = FALSE; ULONG errs = 0L; if (clearfirst && !deselect) UnHilite(hwndCnr, TRUE, NULL); if (list && list[0]) { for (x = 0; list[x]; x++) { pci = FindCnrRecord(hwndCnr, list[x], pciParent, partial, partial, TRUE); if (pci) { WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT((SHORT) ((deselect) ? FALSE : TRUE), CRA_SELECTED)); foundone = TRUE; } } if (!foundone) Runtime_Error(pszSrcFile, __LINE__, "select failed"); } else if (filename && *filename) { FILE *fp; CHAR input[1024], *p; fp = _fsopen(filename, "r", SH_DENYNO); if (fp) { while (!feof(fp)) { if (!xfgets_bstripcr(input, sizeof(input), fp, pszSrcFile, __LINE__)) break; if (*input == '\"') { memmove(input, input + 1, strlen(input) + 1); lstrip(input); p = strchr(input, '\"'); if (p) *p = 0; rstrip(input); } else { p = strchr(input, ' '); if (p) *p = 0; } /* input now contains name of file to select */ pci = FindCnrRecord(hwndCnr, input, pciParent, partial, partial, TRUE); if (pci) /* found it? */ WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT((SHORT) ((deselect) ? FALSE : TRUE), CRA_SELECTED)); else errs++; if (errs > 50L) { /* prevent runaway on bad file */ APIRET ret; ret = saymsg(MB_YESNO, hwndCnr, GetPString(IDS_POSSIBLEERRORTEXT), GetPString(IDS_MAYNOTBELISTTEXT), filename); if (ret == MBID_NO) break; errs = 0L; } } fclose(fp); } } } VOID SelectAll(HWND hwndCnr, BOOL files, BOOL dirs, CHAR * maskstr, CHAR * text, BOOL is_arc) { PCNRITEM pci; BOOL markit; register CHAR *file; MASK Mask; register INT x; ULONG textlen = 0; if (text) textlen = strlen(text); memset(&Mask, 0, sizeof(Mask)); if (maskstr) SetMask(maskstr, &Mask); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); while (pci && (INT) pci != -1) { markit = FALSE; if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { if (!is_arc) { if (files && !(pci->attrFile & FILE_DIRECTORY)) markit = TRUE; if (dirs && (pci->attrFile & FILE_DIRECTORY)) markit = TRUE; } else markit = TRUE; if (maskstr && *maskstr && markit) { markit = FALSE; file = strrchr(pci->szFileName, '\\'); if (!file) file = strrchr(pci->szFileName, ':'); if (file) file++; else file = pci->szFileName; for (x = 0; Mask.pszMasks[x]; x++) { if (*Mask.pszMasks[x]) { if (*Mask.pszMasks[x] != '/') { if (wildcard((strchr(Mask.pszMasks[x], '\\') || strchr(Mask.pszMasks[x], ':')) ? pci->szFileName : file, Mask.pszMasks[x], FALSE)) markit = TRUE; } else { if (wildcard((strchr(Mask.pszMasks[x], '\\') || //fixme always true? strchr(Mask.pszMasks[x], ':'), FALSE) ? pci->szFileName : file, Mask.pszMasks[x] + 1, FALSE)) { markit = FALSE; break; } } } } } } if (markit && text && *text && !(pci->attrFile & FILE_DIRECTORY)) { CHAR *input; markit = FALSE; input = xmalloc(65537, pszSrcFile, __LINE__); if (input) { ULONG pos; LONG len; FILE *inputFile; if ((inputFile = _fsopen(pci->szFileName, "rb", SH_DENYNO)) != NULL) { pos = ftell(inputFile); while (!feof(inputFile)) { if (pos) fseek(inputFile, pos - 256, SEEK_SET); len = fread(input, 1, 65536, inputFile); if (len >= 0) { if (findstring(text, textlen, input, len, FALSE)) { markit = TRUE; break; } } else break; } fclose(inputFile); } free(input); DosSleep(1L); } } else if (markit && text && *text && (pci->attrFile & FILE_DIRECTORY)) markit = FALSE; if (markit) WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); } // while } VOID DeselectAll(HWND hwndCnr, BOOL files, BOOL dirs, CHAR * maskstr, CHAR * text, BOOL is_arc) { PCNRITEM pci; BOOL unmarkit; register CHAR *file; MASK Mask; register INT x; ULONG textlen = 0; if (text) textlen = strlen(text); memset(&Mask, 0, sizeof(Mask)); if (maskstr && *maskstr) SetMask(maskstr, &Mask); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); while (pci && (INT) pci != -1) { unmarkit = FALSE; if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { if (!is_arc) { if (files && !(pci->attrFile & FILE_DIRECTORY)) unmarkit = TRUE; if (dirs && (pci->attrFile & FILE_DIRECTORY)) unmarkit = TRUE; } else unmarkit = TRUE; if (maskstr && *maskstr && unmarkit) { unmarkit = FALSE; file = strrchr(pci->szFileName, '\\'); if (!file) file = strrchr(pci->szFileName, ':'); if (file) file++; else file = pci->szFileName; for (x = 0; Mask.pszMasks[x]; x++) { if (*Mask.pszMasks[x]) { if (*Mask.pszMasks[x] != '/') { if (wildcard((strchr(Mask.pszMasks[x], '\\') || strchr(Mask.pszMasks[x], ':')) ? pci->szFileName : file, Mask.pszMasks[x], FALSE)) unmarkit = TRUE; } else { if (wildcard((strchr(Mask.pszMasks[x], '\\') || strchr(Mask.pszMasks[x], ':')) ? pci->szFileName : file, Mask.pszMasks[x] + 1, FALSE)) { unmarkit = FALSE; break; } } } } } } if (unmarkit && text && *text && !(pci->attrFile & FILE_DIRECTORY)) { CHAR *input; unmarkit = FALSE; input = xmalloc(65537, pszSrcFile, __LINE__); if (input) { ULONG pos; LONG len; FILE *inputFile; if ((inputFile = _fsopen(pci->szFileName, "rb", SH_DENYNO)) != NULL) { pos = ftell(inputFile); while (!feof(inputFile)) { if (pos) fseek(inputFile, pos - 256, SEEK_SET); len = fread(input, 1, 65536, inputFile); if (len >= 0) { if (findstring(text, textlen, input, len, FALSE)) { unmarkit = TRUE; break; } } else break; } fclose(inputFile); } free(input); DosSleep(1L); } } else if (unmarkit && text && *text && (pci->attrFile & FILE_DIRECTORY)) unmarkit = FALSE; if (unmarkit) WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, pci, MPFROM2SHORT(FALSE, CRA_SELECTED | CRA_CURSORED | CRA_INUSE | CRA_SOURCE)); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); } } VOID Deselect(HWND hwndCnr) { PCNRITEM pcil; pcil = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_SELECTED)); while (pcil && (INT) pcil != -1) { WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pcil), MPFROM2SHORT(FALSE, CRA_SELECTED)); pcil = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pcil), MPFROMSHORT(CRA_SELECTED)); } } //=== HideAll() Hide all selected records === VOID HideAll(HWND hwndCnr) { PCNRITEM pci, pciH; INT attribute = CRA_CURSORED; CNRINFO cnri; BOOL didone = FALSE; memset(&cnri, 0, sizeof(CNRINFO)); cnri.cb = sizeof(CNRINFO); WinSendMsg(hwndCnr, CM_QUERYCNRINFO, MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); pci = (PCNRITEM) CurrentRecord(hwndCnr); if (pci && (INT) pci != -1) { if (pci->rc.flRecordAttr & CRA_SELECTED) { attribute = CRA_SELECTED; pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); } } while (pci && (INT) pci != -1) { pciH = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), MPFROMSHORT(attribute)); WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(FALSE, CRA_CURSORED | CRA_SELECTED | CRA_INUSE | CRA_SOURCE)); pci->rc.flRecordAttr |= CRA_FILTERED; didone = TRUE; if (fSyncUpdates) { if (cnri.flWindowAttr & CV_DETAIL) WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPVOID, MPFROM2SHORT(0, CMA_REPOSITION | CMA_ERASE)); else WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPFROMP(&pci), MPFROM2SHORT(1, CMA_REPOSITION | CMA_ERASE)); } pci = pciH; } if (didone && !fSyncUpdates) WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPVOID, MPFROM2SHORT(0, CMA_ERASE | CMA_REPOSITION)); } VOID MarkAll(HWND hwndCnr, BOOL quitit, BOOL target, BOOL source) { PCNRITEM pci; INT attribute = CRA_CURSORED; if (quitit) attribute = target ? CRA_TARGET : source ? CRA_SOURCE : CRA_INUSE; pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); if (pci && (INT) pci != -1) { if (attribute == CRA_CURSORED) { if (pci->rc.flRecordAttr & CRA_SELECTED) { attribute = CRA_SELECTED; pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); } } } while (pci && (INT) pci != -1) { WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(!quitit, target ? CRA_TARGET : source ? CRA_SOURCE : CRA_INUSE)); pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), MPFROMSHORT(attribute)); } } VOID RemoveAll(HWND hwndCnr, ULONGLONG * pullTotalBytes, ULONG * pulTotalFiles) { PCNRITEM pci; INT attribute = CRA_CURSORED; BOOL didone = FALSE; pci = (PCNRITEM) CurrentRecord(hwndCnr); if (pci && (INT) pci != -1) { if (pci->rc.flRecordAttr & CRA_SELECTED) { attribute = CRA_SELECTED; pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); } } while (pci && (INT) pci != -1) { if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { didone = TRUE; if (pulTotalFiles) *pulTotalFiles--; if (pullTotalBytes) *pullTotalBytes -= (pci->cbFile + pci->easize); WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(0, CRA_SELECTED)); if (fSyncUpdates) WinSendMsg(hwndCnr, CM_REMOVERECORD, MPFROMP(&pci), MPFROM2SHORT(1, CMA_FREE | CMA_INVALIDATE)); else WinSendMsg(hwndCnr, CM_REMOVERECORD, MPFROMP(&pci), MPFROM2SHORT(1, CMA_FREE)); if (attribute == CRA_CURSORED) break; pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute)); } else pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), MPFROMSHORT(attribute)); } if (didone && !fSyncUpdates) WinSendMsg(hwndCnr, CM_INVALIDATERECORD, MPVOID, MPFROM2SHORT(0, CMA_REPOSITION)); } //== SetMask() Convert mask string to array of pointers to masks == VOID SetMask(PSZ maskstr, MASK * mask) { UINT x; PSZ p; if (maskstr) strcpy(mask->szMask, maskstr); // Got new mask string // Build array of pointers p = mask->szMaskCopy; strcpy(p, mask->szMask); // memset(mask->pszMasks,0,sizeof(mask->pszMasks); // fixme to be gone // Allow up to 25 masks - ignore extras for (x = 0; *p && x < 25; x++) { mask->pszMasks[x] = p; while (*p && *p != ';') p++; // Find separator if (*p) { *p = 0; // Replace ; p++; } } // for mask->pszMasks[x] = NULL; // Mark end } VOID ExpandAll(HWND hwndCnr, BOOL expand, PCNRITEM pciParent) { PCNRITEM pci; if (!pciParent) pciParent = WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(NULL), MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); if (pciParent) { if (expand && !(pciParent->rc.flRecordAttr & CRA_EXPANDED)) WinSendMsg(hwndCnr, CM_EXPANDTREE, MPFROMP(pciParent), MPVOID); else if (!expand && (pciParent->rc.flRecordAttr & CRA_EXPANDED)) WinSendMsg(hwndCnr, CM_COLLAPSETREE, MPFROMP(pciParent), MPVOID); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(pciParent), MPFROM2SHORT(CMA_FIRSTCHILD, CMA_ITEMORDER)); if (pci) DosSleep(1L); while (pci && (INT) pci != -1) { ExpandAll(hwndCnr, expand, pci); pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); } } DosSleep(0L); } VOID InvertAll(HWND hwndCnr) { PCNRITEM pci; pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); while (pci && (INT) pci != -1) { if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { if (!(pci->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); else WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORD, MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); } } #pragma alloc_text (SELECT3,SpecialSelect) #pragma alloc_text(SELECT4,FreeCnrs,SpecialSelect2,CompSSNames,CompSSNamesB) VOID SpecialSelect(HWND hwndCnrS, HWND hwndCnrD, INT action, BOOL reset) { PCNRITEM pciS, pciD, *pciSa = NULL, *pciDa = NULL; CNRINFO cnri; BOOL slow = FALSE; register INT x, numD, numS; if (!hwndCnrS || !hwndCnrD) return; memset(&cnri, 0, sizeof(CNRINFO)); cnri.cb = sizeof(CNRINFO); WinSendMsg(hwndCnrD, CM_QUERYCNRINFO, MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); numD = (INT) cnri.cRecords; memset(&cnri, 0, sizeof(CNRINFO)); cnri.cb = sizeof(CNRINFO); WinSendMsg(hwndCnrS, CM_QUERYCNRINFO, MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); numS = (INT) cnri.cRecords; if (!numD || numS != numD) { saymsg(MB_ENTER, HWND_DESKTOP, DEBUG_STRING, "numD (%lu) != numS (%lu)", numD, numS); return; } pciDa = xmalloc(sizeof(PCNRITEM) * numD, pszSrcFile, __LINE__); if (!pciDa) return; pciSa = xmalloc(sizeof(PCNRITEM) * numS, pszSrcFile, __LINE__); if (!pciSa) { free(pciDa); return; } Restart: memset(pciDa, 0, sizeof(PCNRITEM) * numD); memset(pciSa, 0, sizeof(PCNRITEM) * numS); pciD = (PCNRITEM) WinSendMsg(hwndCnrD, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); x = 0; while (pciD && (INT) pciD != -1 && x < numD) { if (reset) pciD->flags = 0; pciDa[x] = pciD; x++; if (!slow) pciD = (PCNRITEM) pciD->rc.preccNextRecord; else pciD = (PCNRITEM) WinSendMsg(hwndCnrD, CM_QUERYRECORD, MPFROMP(pciD), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } if (numD != x) { if (!slow) { slow = TRUE; goto Restart; } free(pciDa); free(pciSa); saymsg(MB_ENTER, HWND_DESKTOP, DEBUG_STRING, "numD (%lu) != x (%lu)", numD, x); return; } pciS = (PCNRITEM) WinSendMsg(hwndCnrS, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); x = 0; while (pciS && (INT) pciS != -1 && x < numS) { if (reset) pciS->flags = 0; pciSa[x] = pciS; x++; if (!slow) pciS = (PCNRITEM) pciS->rc.preccNextRecord; else pciS = (PCNRITEM) WinSendMsg(hwndCnrS, CM_QUERYRECORD, MPFROMP(pciS), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } if (numS != x) { if (!slow) { slow = TRUE; goto Restart; } free(pciSa); free(pciDa); Runtime_Error(pszSrcFile, __LINE__, "numS (%lu) != x (%lu)", numS, x); return; } if (reset) { for (x = 0; x < numS; x++) { if (!*pciSa[x]->szFileName || !*pciDa[x]->szFileName) continue; pciSa[x]->flags |= CNRITEM_EXISTS; pciDa[x]->flags |= CNRITEM_EXISTS; if (pciSa[x]->cbFile + pciSa[x]->easize > pciDa[x]->cbFile + pciDa[x]->easize) { pciSa[x]->flags |= CNRITEM_LARGER; pciDa[x]->flags |= CNRITEM_SMALLER; } else if (pciSa[x]->cbFile + pciSa[x]->easize < pciDa[x]->cbFile + pciDa[x]->easize) { pciSa[x]->flags |= CNRITEM_SMALLER; pciDa[x]->flags |= CNRITEM_LARGER; } if ((pciSa[x]->date.year > pciDa[x]->date.year) ? TRUE : (pciSa[x]->date.year < pciDa[x]->date.year) ? FALSE : (pciSa[x]->date.month > pciDa[x]->date.month) ? TRUE : (pciSa[x]->date.month < pciDa[x]->date.month) ? FALSE : (pciSa[x]->date.day > pciDa[x]->date.day) ? TRUE : (pciSa[x]->date.day < pciDa[x]->date.day) ? FALSE : (pciSa[x]->time.hours > pciDa[x]->time.hours) ? TRUE : (pciSa[x]->time.hours < pciDa[x]->time.hours) ? FALSE : (pciSa[x]->time.minutes > pciDa[x]->time.minutes) ? TRUE : (pciSa[x]->time.minutes < pciDa[x]->time.minutes) ? FALSE : (pciSa[x]->time.seconds > pciDa[x]->time.seconds) ? TRUE : (pciSa[x]->time.seconds < pciDa[x]->time.seconds) ? FALSE : FALSE) { pciSa[x]->flags |= CNRITEM_NEWER; pciDa[x]->flags |= CNRITEM_OLDER; } else if ((pciSa[x]->date.year < pciDa[x]->date.year) ? TRUE : (pciSa[x]->date.year > pciDa[x]->date.year) ? FALSE : (pciSa[x]->date.month < pciDa[x]->date.month) ? TRUE : (pciSa[x]->date.month > pciDa[x]->date.month) ? FALSE : (pciSa[x]->date.day < pciDa[x]->date.day) ? TRUE : (pciSa[x]->date.day > pciDa[x]->date.day) ? FALSE : (pciSa[x]->time.hours < pciDa[x]->time.hours) ? TRUE : (pciSa[x]->time.hours > pciDa[x]->time.hours) ? FALSE : (pciSa[x]->time.minutes < pciDa[x]->time.minutes) ? TRUE : (pciSa[x]->time.minutes > pciDa[x]->time.minutes) ? FALSE : (pciSa[x]->time.seconds < pciDa[x]->time.seconds) ? TRUE : (pciSa[x]->time.seconds > pciDa[x]->time.seconds) ? FALSE : FALSE) { pciSa[x]->flags |= CNRITEM_OLDER; pciDa[x]->flags |= CNRITEM_NEWER; } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } } switch (action) { case IDM_SELECTIDENTICAL: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED)) { if (*pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_EXISTS) && !(pciSa[x]->flags & CNRITEM_SMALLER) && !(pciSa[x]->flags & CNRITEM_LARGER) && !(pciSa[x]->flags & CNRITEM_NEWER) && !(pciSa[x]->flags & CNRITEM_OLDER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } } break; case IDM_SELECTSAME: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_EXISTS) && !(pciSa[x]->flags & CNRITEM_SMALLER) && !(pciSa[x]->flags & CNRITEM_LARGER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTSAMECONTENT: // fixme for (x = 0; x < numS; x++) { if (~pciSa[x]->rc.flRecordAttr & CRA_FILTERED && *pciSa[x]->szFileName && *pciDa[x]->szFileName && pciSa[x]->flags & CNRITEM_EXISTS && pciDa[x]->flags & CNRITEM_EXISTS) { FILE *fp1 = NULL; FILE *fp2 = NULL; BOOL gotMatch = FALSE; UINT errLineNo = 0; UINT compErrno = 0; CHAR buf1[1024]; CHAR buf2[1024]; HAB hab = WinQueryAnchorBlock(hwndCnrS); fp1 = _fsopen(pciSa[x]->szFileName, "rb", SH_DENYNO); if (!fp1) { errLineNo = __LINE__; compErrno = errno; } else { fp2 = _fsopen(pciDa[x]->szFileName, "rb", SH_DENYNO); if (!fp2) { errLineNo = __LINE__; compErrno = errno; } else { size_t len1 = filelength(fileno(fp1)); size_t len2 = filelength(fileno(fp2)); if (len1 == len2) { setbuf(fp1, NULL); setbuf(fp2, NULL); while (WinIsWindow(hab, hwndCnrS)) { size_t numread1 = fread(buf1, 1, 1024, fp1); size_t numread2 = fread(buf2, 1, 1024, fp2); if (!numread1 || !numread2 || numread1 != numread2) { if (ferror(fp1) || ferror(fp2)) { errLineNo = __LINE__; compErrno = errno; } else if (feof(fp1) && feof(fp2)) gotMatch = TRUE; break; } else if (memcmp(buf1, buf2, numread1)) break; } // while } // same len } } if (fp1) fclose(fp1); if (fp2) fclose(fp2); if (errLineNo) { Runtime_Error(pszSrcFile, errLineNo, "error %d while comparing", compErrno); } if (gotMatch) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } // for records break; case IDM_SELECTBOTH: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_EXISTS)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTONE: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && !(pciSa[x]->flags & CNRITEM_EXISTS)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } else if (*pciDa[x]->szFileName && !(pciDa[x]->flags & CNRITEM_EXISTS)) { if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTBIGGER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_LARGER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_LARGER)) { if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTSMALLER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_SMALLER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_SMALLER)) { if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTNEWER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_NEWER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_NEWER)) { if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_SELECTOLDER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_OLDER)) { if (!(pciSa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_OLDER)) { if (!(pciDa[x]->rc.flRecordAttr & CRA_SELECTED)) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(TRUE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTBOTH: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_EXISTS)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTONE: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && !(pciSa[x]->flags & CNRITEM_EXISTS)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } else if (*pciDa[x]->szFileName && !(pciDa[x]->flags & CNRITEM_EXISTS)) { if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTBIGGER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_LARGER)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_LARGER)) { if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTSMALLER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_SMALLER)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_SMALLER)) { if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTNEWER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_NEWER)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_NEWER)) { if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; case IDM_DESELECTOLDER: for (x = 0; x < numS; x++) { if (!(pciSa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciSa[x]->szFileName && (pciSa[x]->flags & CNRITEM_OLDER)) { if (pciSa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrS, CM_SETRECORDEMPHASIS, MPFROMP(pciSa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } else if (!(pciDa[x]->rc.flRecordAttr & CRA_FILTERED) && *pciDa[x]->szFileName && (pciDa[x]->flags & CNRITEM_OLDER)) { if (pciDa[x]->rc.flRecordAttr & CRA_SELECTED) WinSendMsg(hwndCnrD, CM_SETRECORDEMPHASIS, MPFROMP(pciDa[x]), MPFROM2SHORT(FALSE, CRA_SELECTED)); } if (!(x % 500)) DosSleep(1L); else if (!(x % 50)) DosSleep(0L); } break; default: break; } if (reset) { while (numS) { WinSendMsg(hwndCnrS, CM_INVALIDATERECORD, MPFROMP(pciSa), MPFROM2SHORT((min(numS, 65535)), 0)); DosSleep(0L); WinSendMsg(hwndCnrD, CM_INVALIDATERECORD, MPFROMP(pciDa), MPFROM2SHORT((min(numD, 65535)), 0)); numS -= min(numS, 65535); if (numS) DosSleep(0L); } } free(pciSa); free(pciDa); DosPostEventSem(CompactSem); } struct SS { PCNRITEM pci; BOOL unique, all, smallest, largest, newest, oldest; }; struct Cnr { HWND hwndCnr; ULONG numfiles; struct SS *ss; }; static int CompSSNamesB(const void *s1, const void *s2) { struct SS *ss2 = (struct SS *)s2; return stricmp((CHAR *) s1, ss2->pci->pszFileName); } static int CompSSNames(const void *s1, const void *s2) { struct SS *ss1 = (struct SS *)s1; struct SS *ss2 = (struct SS *)s2; return stricmp(ss1->pci->pszFileName, ss2->pci->pszFileName); } VOID FreeCnrs(struct Cnr * Cnrs, INT numw) { register INT z; for (z = 0; z < numw; z++) { if (Cnrs[z].ss) free(Cnrs[z].ss); } free(Cnrs); DosPostEventSem(CompactSem); } VOID SpecialSelect2(HWND hwndParent, INT action) { PCNRITEM pci; HENUM henum; HWND hwnd; register INT numwindows = 0, w, x, z, cmp; struct Cnr *Cnrs = NULL; struct SS *bsres; if (!hwndParent) return; /* count directory containers, build array of hwnds */ henum = WinBeginEnumWindows(hwndParent); while ((hwnd = WinGetNextWindow(henum)) != NULLHANDLE) { if (WinWindowFromID(WinWindowFromID(hwnd, FID_CLIENT), DIR_CNR)) { Cnrs = xrealloc(Cnrs, (numwindows + 1) * sizeof(struct Cnr), pszSrcFile, __LINE__); if (!Cnrs) { Notify(GetPString(IDS_OUTOFMEMORY)); return; } memset(&Cnrs[numwindows], 0, sizeof(struct Cnr)); Cnrs[numwindows].hwndCnr = WinWindowFromID(WinWindowFromID(hwnd, FID_CLIENT), DIR_CNR); numwindows++; } } WinEndEnumWindows(henum); if (numwindows < 2) { FreeCnrs(Cnrs, numwindows); Runtime_Error(pszSrcFile, __LINE__, "expected two windows"); // fixme DosBeep(250,100); Notify(GetPString(IDS_COMPSEL2ORMORETEXT)); return; } if (numwindows > 4) { WinSendMsg(Cnrs[0]. hwndCnr, UM_NOTIFY, MPFROMP(GetPString(IDS_BUILDINGLISTSTEXT)), MPVOID); DosSleep(0L); } /* count records, build array of pointers to records */ for (z = 0; z < numwindows; z++) { pci = (PCNRITEM) WinSendMsg(Cnrs[z].hwndCnr, CM_QUERYRECORD, MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); x = 0; while (pci && (INT) pci != -1) { if (!(pci->rc.flRecordAttr & CRA_FILTERED) && !(pci->attrFile & FILE_DIRECTORY)) { Cnrs[z].ss = xrealloc(Cnrs[z].ss, (x + 1) * sizeof(struct SS), pszSrcFile, __LINE__); if (!Cnrs[z].ss) { FreeCnrs(Cnrs, numwindows); Notify(GetPString(IDS_OUTOFMEMORY)); return; } memset(&Cnrs[z].ss[x], 0, sizeof(struct SS)); Cnrs[z].ss[x].pci = pci; x++; } pci = (PCNRITEM) WinSendMsg(Cnrs[z].hwndCnr, CM_QUERYRECORD, MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); } DosSleep(0L); Cnrs[z].numfiles = x; if (Cnrs[z].numfiles) qsort(Cnrs[z].ss, Cnrs[z].numfiles, sizeof(struct SS), CompSSNames); } for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { Cnrs[z].ss[x].all = Cnrs[z].ss[x].unique = Cnrs[z].ss[x].newest = Cnrs[z].ss[x].oldest = Cnrs[z].ss[x].smallest = Cnrs[z].ss[x].largest = TRUE; for (w = 0; w < numwindows; w++) { if (w != z && Cnrs[w].numfiles) { bsres = (struct SS *)bsearch(Cnrs[z].ss[x].pci->pszFileName, Cnrs[w].ss, Cnrs[w].numfiles, sizeof(struct SS), CompSSNamesB); if (bsres) { Cnrs[z].ss[x].unique = FALSE; if (Cnrs[z].ss[x].pci->cbFile + Cnrs[z].ss[x].pci->easize > bsres->pci->cbFile + bsres->pci->easize) Cnrs[z].ss[x].smallest = FALSE; if (Cnrs[z].ss[x].pci->cbFile + Cnrs[z].ss[x].pci->easize < bsres->pci->cbFile + bsres->pci->easize) Cnrs[z].ss[x].largest = FALSE; cmp = (Cnrs[z].ss[x].pci->date.year > bsres->pci->date.year) ? TRUE : (Cnrs[z].ss[x].pci->date.year < bsres->pci->date. year) ? FALSE : (Cnrs[z]. ss[x].pci-> date.month > bsres->pci-> date. month) ? TRUE : (Cnrs[z].ss[x].pci->date.month < bsres->pci->date.month) ? FALSE : (Cnrs[z].ss[x].pci->date. day > bsres->pci->date. day) ? TRUE : (Cnrs[z]. ss[x].pci-> date.day < bsres-> pci->date. day) ? FALSE : (Cnrs[z].ss[x].pci->time.hours > bsres->pci->time.hours) ? TRUE : (Cnrs[z].ss[x].pci-> time.hours < bsres->pci->time. hours) ? FALSE : (Cnrs[z].ss[x].pci->time.minutes > bsres->pci->time.minutes) ? TRUE : (Cnrs[z].ss[x].pci->time. minutes < bsres->pci->time. minutes) ? FALSE : (Cnrs[z].ss[x].pci->time.seconds > bsres->pci->time.seconds) ? TRUE : (Cnrs[z].ss[x].pci->time. seconds < bsres->pci->time. seconds) ? FALSE : FALSE; if (!cmp) Cnrs[z].ss[x].newest = FALSE; cmp = (Cnrs[z].ss[x].pci->date.year < bsres->pci->date.year) ? TRUE : (Cnrs[z].ss[x].pci->date.year > bsres->pci->date. year) ? FALSE : (Cnrs[z]. ss[x].pci-> date.month < bsres->pci-> date. month) ? TRUE : (Cnrs[z].ss[x].pci->date.month > bsres->pci->date.month) ? FALSE : (Cnrs[z].ss[x].pci->date. day < bsres->pci->date. day) ? TRUE : (Cnrs[z]. ss[x].pci-> date.day > bsres-> pci->date. day) ? FALSE : (Cnrs[z].ss[x].pci->time.hours < bsres->pci->time.hours) ? TRUE : (Cnrs[z].ss[x].pci-> time.hours > bsres->pci->time. hours) ? FALSE : (Cnrs[z].ss[x].pci->time.minutes < bsres->pci->time.minutes) ? TRUE : (Cnrs[z].ss[x].pci->time. minutes > bsres->pci->time. minutes) ? FALSE : (Cnrs[z].ss[x].pci->time.seconds < bsres->pci->time.seconds) ? TRUE : (Cnrs[z].ss[x].pci->time. seconds > bsres->pci->time. seconds) ? FALSE : FALSE; if (!cmp) Cnrs[z].ss[x].oldest = FALSE; cmp = 0; break; } else Cnrs[z].ss[x].all = FALSE; } } if (Cnrs[z].ss[x].unique) Cnrs[z].ss[x].oldest = Cnrs[z].ss[x].newest = Cnrs[z].ss[x].all = Cnrs[z].ss[x].largest = Cnrs[z].ss[x].smallest = FALSE; DosSleep(0L); } DosSleep(1L); } switch (action) { case IDM_SELECTBOTH: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].all) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTMORE: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (!Cnrs[z].ss[x].unique) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTONE: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].unique) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTNEWER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].newest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTOLDER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].oldest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTBIGGER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].largest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_SELECTSMALLER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].smallest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(TRUE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTBOTH: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].all) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTMORE: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (!Cnrs[z].ss[x].unique) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTONE: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].unique) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTNEWER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].newest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTOLDER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].oldest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTBIGGER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].largest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; case IDM_DESELECTSMALLER: for (z = 0; z < numwindows; z++) { for (x = 0; x < Cnrs[z].numfiles; x++) { if (Cnrs[z].ss[x].smallest) WinSendMsg(Cnrs[z].hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(Cnrs[z].ss[x].pci), MPFROM2SHORT(FALSE, CRA_SELECTED)); } DosSleep(0L); } break; } FreeCnrs(Cnrs, numwindows); }