Changeset 1563 for trunk/dll/comp.c
- Timestamp:
- May 30, 2011, 9:21:53 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/comp.c
r1545 r1563 75 75 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *. 76 76 23 Oct 10 GKY Add ForwardslashToBackslash function to streamline code 77 29 May 11 SHL Rework >65K records logic - prior fix was not quite right 77 78 78 79 ***********************************************************************/ … … 83 84 #include <io.h> 84 85 #include <ctype.h> 86 #include <limits.h> // USHRT_MAX 85 87 86 88 #define INCL_DOS … … 1067 1069 CHAR buf1[1024]; 1068 1070 CHAR buf2[1024]; 1069 1070 1071 HAB hab = WinQueryAnchorBlock(hwndCnrS); 1072 CHAR *moderb = "rb"; 1071 1073 1072 1074 if (!*pciS->pszFileName || … … 1503 1505 UINT numallocl = 0; 1504 1506 UINT numallocr = 0; 1505 INT ret = 0;1506 1507 UINT lenl; // Directory prefix length 1507 1508 UINT lenr; 1508 UINT recsNeeded; 1509 UINT recsGotten; 1510 PCNRITEM pcilFirst; 1511 PCNRITEM pcirFirst; 1512 PCNRITEM pcilLast; 1513 PCNRITEM pcirLast; 1514 PCNRITEM pcil; 1515 PCNRITEM pcir; 1516 RECORDINSERT ri; 1509 ULONG ulRecsNeeded; 1517 1510 CHAR *pch; 1518 1511 HWND hwndLeft; … … 1561 1554 FILE *fp; 1562 1555 FILEFINDBUF4L fb4; 1563 1564 1556 CHAR str[CCHMAXPATH * 2], *p; 1557 CHAR *moder = "r"; 1565 1558 1566 1559 memset(&fb4, 0, sizeof(fb4)); … … 1697 1690 // We now have two lists of files, both sorted. 1698 1691 // Count total number of container entries required on each side 1699 l = r = 0; 1700 recsNeeded = 0; 1692 l = 0; 1693 r = 0; 1694 ulRecsNeeded = 0; 1701 1695 while ((filesl && filesl[l]) || (filesr && filesr[r])) { 1702 1696 … … 1718 1712 r++; // On right side 1719 1713 1720 recsNeeded++; // Keep count of how many entries req'd 1721 1722 } // while 1723 1724 if (cmp->stop) { 1725 recsNeeded = 0; 1726 } 1727 1728 // Now insert records into the containers 1729 1730 if (recsNeeded) { 1714 ulRecsNeeded++; // Count how many entries req'd 1715 1716 } // while counting 1717 1718 if (cmp->stop) 1719 ulRecsNeeded = 0; 1720 1721 // Insert records into the containers 1722 1723 if (ulRecsNeeded) { 1724 1725 PCNRITEM pcilFirst; 1726 PCNRITEM pcirFirst; 1727 PCNRITEM pcil = NULL; 1728 PCNRITEM pcir = NULL; 1729 INT ret; 1730 ULONG ulRecsAllocated = 0; 1731 ULONG insertedl; 1732 ULONG insertedr; 1733 1734 l = 0; 1735 r = 0; 1731 1736 1732 1737 // Use send to get message on screen quickly 1733 1738 WinSendMsg(cmp->hwnd, UM_CONTAINERHWND, MPVOID, MPVOID); 1734 1739 1735 pcilFirst = WinSendMsg(hwndLeft,1736 CM_ALLOCRECORD,1737 MPFROMLONG(EXTRA_RECORD_BYTES),1738 MPFROMLONG(recsNeeded));1739 if (!pcilFirst) {1740 Win_Error(hwndLeft, cmp->hwnd, pszSrcFile, __LINE__, PCSZ_CM_ALLOCRECORD);1741 recsNeeded = 0;1742 }1743 }1744 1745 if (recsNeeded) {1746 pcirFirst = WinSendMsg(hwndRight, CM_ALLOCRECORD,1747 MPFROMLONG(EXTRA_RECORD_BYTES),1748 MPFROMLONG(recsNeeded));1749 if (!pcirFirst) {1750 Win_Error(hwndRight, cmp->hwnd, pszSrcFile, __LINE__, PCSZ_CM_ALLOCRECORD);1751 recsNeeded = 0;1752 FreeCnrItemList(hwndLeft, pcilFirst);1753 }1754 }1755 1756 if (recsNeeded) {1757 1758 l = 0;1759 r = 0;1760 pcil = pcilFirst;1761 pcir = pcirFirst;1762 pcilLast = NULL;1763 pcirLast = NULL;1764 1765 recsGotten = 0;1766 1740 cmp->cmp->totalleft = 0; 1767 1741 cmp->cmp->totalright = 0; … … 1769 1743 while ((filesl && filesl[l]) || (filesr && filesr[r])) { 1770 1744 1745 ULONG ulRecsToInsert; // limited to USHRT_MAX 1746 1771 1747 if (cmp->stop) 1772 1748 break; 1773 1749 1774 if (!pcil) { 1775 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_INSUFFICIENTMEMORY), 1776 recsNeeded, recsGotten); 1777 break; 1778 } 1779 1780 if (!pcir) { 1781 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_INSUFFICIENTMEMORY), 1782 recsNeeded, recsGotten); 1783 break; 1784 } 1785 recsGotten++; 1750 // Check alloc needed 1751 if (!pcil || !pcir) { 1752 if (pcil != pcir) { 1753 // 2011-05-29 SHL fixme to GetPString 1754 Runtime_Error(pszSrcFile, __LINE__, "pcil and pcir out of sync"); 1755 cmp->stop = TRUE; 1756 break; 1757 } 1758 ulRecsToInsert = ulRecsNeeded - ulRecsAllocated; 1759 if (ulRecsToInsert > USHRT_MAX) 1760 ulRecsToInsert = USHRT_MAX; 1761 1762 pcilFirst = WinSendMsg(hwndLeft, 1763 CM_ALLOCRECORD, 1764 MPFROMLONG(EXTRA_RECORD_BYTES), 1765 MPFROMLONG(ulRecsToInsert)); 1766 if (!pcilFirst) { 1767 Win_Error(hwndLeft, cmp->hwnd, pszSrcFile, __LINE__, PCSZ_CM_ALLOCRECORD); 1768 cmp->stop = TRUE; 1769 break; 1770 } 1771 pcirFirst = WinSendMsg(hwndRight, CM_ALLOCRECORD, 1772 MPFROMLONG(EXTRA_RECORD_BYTES), 1773 MPFROMLONG(ulRecsToInsert)); 1774 if (!pcirFirst) { 1775 Win_Error(hwndRight, cmp->hwnd, pszSrcFile, __LINE__, PCSZ_CM_ALLOCRECORD); 1776 FreeCnrItemList(hwndLeft, pcilFirst); 1777 pcilFirst = NULL; 1778 cmp->stop = TRUE; 1779 break; 1780 } 1781 pcil = pcilFirst; 1782 pcir = pcirFirst; 1783 insertedl = 0; 1784 insertedr = 0; 1785 ulRecsAllocated += ulRecsToInsert; 1786 } // if need alloc 1787 1786 1788 pcir->hwndCnr = hwndRight; 1787 1789 pcir->rc.hptrIcon = (HPOINTER)0; … … 1801 1803 // File appears on left side 1802 1804 cmp->cmp->totalleft++; 1805 insertedl++; 1803 1806 BldFullPathName(szBuf, cmp->leftdir, filesl[l]->fname); 1804 1807 pcil->pszFileName = xstrdup(szBuf, pszSrcFile, __LINE__); … … 1840 1843 // File appears on right side 1841 1844 cmp->cmp->totalright++; 1845 insertedr++; 1842 1846 BldFullPathName(szBuf, cmp->rightdir, filesr[r]->fname); 1843 1847 pcir->pszFileName = xstrdup(szBuf, pszSrcFile, __LINE__); // 31 Jul 07 SHL … … 1927 1931 } // if on both sides 1928 1932 1929 if (x <= 0) {1933 if (x <= 0) 1930 1934 free(filesl[l++]); // Done with item on left 1931 } 1932 if (x >= 0) {1935 1936 if (x >= 0) 1933 1937 free(filesr[r++]); // Done with item on right 1934 } 1938 1935 1939 // Ensure empty buffers point somewhere 1936 1940 if (!pcil->pszFileName) { … … 1962 1966 SleepIfNeeded(&itdSleep, 0); 1963 1967 1964 pcilLast = pcil;1965 pcirLast = pcir;1966 1968 pcil = (PCNRITEM)pcil->rc.preccNextRecord; 1967 1969 pcir = (PCNRITEM)pcir->rc.preccNextRecord; 1968 1970 1971 if (pcil == NULL || pcir == NULL) { 1972 RECORDINSERT ri; 1973 if (pcil != pcir) { 1974 Runtime_Error(pszSrcFile, __LINE__, "pcil and pcir out of sync"); 1975 cmp->stop = TRUE; 1976 break; 1977 } 1978 // Say inserting 1979 WinSendMsg(cmp->hwnd, UM_CONTAINERDIR, MPVOID, MPVOID); 1980 1981 // Insert left side 1982 memset(&ri, 0, sizeof(RECORDINSERT)); 1983 ri.cb = sizeof(RECORDINSERT); 1984 ri.pRecordOrder = (PRECORDCORE)CMA_END; 1985 ri.pRecordParent = (PRECORDCORE)NULL; 1986 ri.zOrder = (ULONG)CMA_TOP; 1987 ri.cRecordsInsert = ulRecsToInsert; 1988 ri.fInvalidateRecord = FALSE; 1989 1990 if (!WinSendMsg(hwndLeft, CM_INSERTRECORD, 1991 MPFROMP(pcilFirst), MPFROMP(&ri))) { 1992 Win_Error(hwndLeft, cmp->hwnd, pszSrcFile, __LINE__, "CM_INSERTRECORD"); 1993 FreeCnrItemList(hwndLeft, pcilFirst); 1994 cmp->cmp->totalleft -= insertedl; 1995 } 1996 pcilFirst = NULL; 1997 1998 // Insert right side 1999 memset(&ri, 0, sizeof(RECORDINSERT)); 2000 ri.cb = sizeof(RECORDINSERT); 2001 ri.pRecordOrder = (PRECORDCORE)CMA_END; 2002 ri.pRecordParent = (PRECORDCORE)NULL; 2003 ri.zOrder = (ULONG)CMA_TOP; 2004 ri.cRecordsInsert = ulRecsToInsert; 2005 ri.fInvalidateRecord = FALSE; 2006 2007 if (!WinSendMsg(hwndRight, CM_INSERTRECORD, 2008 MPFROMP(pcirFirst), MPFROMP(&ri))) { 2009 Win_Error(hwndRight, cmp->hwnd, pszSrcFile, __LINE__, "CM_INSERTRECORD"); 2010 // 2011-05-29 SHL fixme? 2011 RemoveCnrItems(hwndLeft, NULL, 0, CMA_FREE | CMA_INVALIDATE); 2012 FreeCnrItemList(hwndRight, pcirFirst); 2013 cmp->cmp->totalright -= insertedr; 2014 } 2015 pcirFirst = NULL; 2016 } // if need insert 2017 1969 2018 } // while filling left or right 1970 2019 1971 // If stopped early CM_ALLOCATERECORD partially failed 1972 // Free up container records we did not use on other side 1973 // Free up items we did not insert in container 1974 if (recsGotten < recsNeeded) { 1975 if (pcil) { 1976 if (pcilLast) 1977 pcilLast->rc.preccNextRecord = NULL; 1978 else 1979 pcilFirst = NULL; 1980 FreeCnrItemList(hwndLeft, pcil); 1981 } 2020 // If stopped early clean up 2021 2022 if (cmp->stop) { 2023 // Free up container records that we did not insert in container 2024 if (pcilFirst) 2025 FreeCnrItemList(hwndLeft, pcilFirst); 2026 2027 // Free up items we did not insert in container 1982 2028 if (filesl) { 1983 2029 for(; filesl[l]; l++) { … … 1985 2031 } 1986 2032 } 1987 if (pcir) { 1988 if (pcirLast) 1989 pcirLast->rc.preccNextRecord = NULL; 1990 else 1991 pcirFirst = NULL; 1992 FreeCnrItemList(hwndRight, pcir); 1993 } 2033 2034 if (pcirFirst) 2035 FreeCnrItemList(hwndRight, pcirFirst); 2036 1994 2037 if (filesr) { 1995 2038 for (; filesr[r]; r++) { … … 1997 2040 } 1998 2041 } 1999 // Reduce count to match what is in containers2000 recsNeeded = recsGotten;2001 2042 } // if insufficient resources 2002 2043 2003 2044 xfree(filesl, pszSrcFile, __LINE__); // Free header - have already freed elements 2004 2045 filesl = NULL; 2005 2046 xfree(filesr, pszSrcFile, __LINE__); 2006 2047 filesr = NULL; 2007 2048 2008 // Say inserting 2009 WinSendMsg(cmp->hwnd, UM_CONTAINERDIR, MPVOID, MPVOID); 2010 2011 // Insert left side 2012 memset(&ri, 0, sizeof(RECORDINSERT)); 2013 ri.cb = sizeof(RECORDINSERT); 2014 ri.pRecordOrder = (PRECORDCORE)CMA_END; 2015 ri.pRecordParent = (PRECORDCORE)NULL; 2016 ri.zOrder = (ULONG)CMA_TOP; 2017 ri.cRecordsInsert = recsNeeded; 2018 ri.fInvalidateRecord = FALSE; 2019 2020 if (!WinSendMsg(hwndLeft, CM_INSERTRECORD, 2021 MPFROMP(pcilFirst), MPFROMP(&ri))) { 2022 Win_Error(hwndLeft, cmp->hwnd, pszSrcFile, __LINE__, "CM_INSERTRECORD"); 2023 FreeCnrItemList(hwndLeft, pcilFirst); 2024 cmp->cmp->totalleft = 0; 2025 } 2026 2027 // Insert right side 2028 memset(&ri, 0, sizeof(RECORDINSERT)); 2029 ri.cb = sizeof(RECORDINSERT); 2030 ri.pRecordOrder = (PRECORDCORE)CMA_END; 2031 ri.pRecordParent = (PRECORDCORE)NULL; 2032 ri.zOrder = (ULONG)CMA_TOP; 2033 ri.cRecordsInsert = recsNeeded; 2034 ri.fInvalidateRecord = FALSE; 2035 2036 if (!WinSendMsg(hwndRight, CM_INSERTRECORD, 2037 MPFROMP(pcirFirst), MPFROMP(&ri))) { 2038 Win_Error(hwndRight, cmp->hwnd, pszSrcFile, __LINE__, "CM_INSERTRECORD"); 2039 RemoveCnrItems(hwndLeft, NULL, 0, CMA_FREE | CMA_INVALIDATE); 2040 FreeCnrItemList(hwndRight, pcirFirst); 2041 cmp->cmp->totalright = 0; 2042 } 2043 2044 } // if recsNeeded 2049 } // if ulRecsNeeded 2045 2050 2046 2051 Deselect(hwndLeft); … … 2830 2835 fakelist[1] = szPathName; 2831 2836 fakelist[2] = NULL; 2832 2833 2837 ExecOnList(hwnd, compare, WINDOWED | SEPARATEKEEP, 2838 NULL, NULL, fakelist, NULL, 2834 2839 pszSrcFile, __LINE__); 2835 2840 }
Note:
See TracChangeset
for help on using the changeset viewer.