source: trunk/dll/sortcnr.c

Last change on this file was 1890, checked in by Steven Levine, 6 years ago

Add PMPRINTF enable support to makefiles.
Correct PMPRINTF debug macro enables in sources.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: sortcnr.c 1890 2020-01-30 06:39:42Z stevenhl $
5
6 Sort container items
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H. Levine
10
11 24 May 05 SHL Rework for CNRITEM.szSubject
12 25 May 05 SHL Rework with ULONGLONG
13 22 Mar 07 GKY Use QWL_USER
14 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
15
16***********************************************************************/
17
18#include <string.h>
19
20#define INCL_WIN
21#define INCL_DOSSEMAPHORES
22
23#include "fm3dll.h"
24#include "dircnrs.h" // Data declaration(s)
25#include "treecnr.h" // Data declaration(s)
26#include "init.h" // Data declaration(s)
27#include "collect.h" // Data declarations
28#include "sortcnr.h"
29#include "valid.h" // TestCDates
30
31#ifdef PMPRINTF
32#define _PMPRINTF_ // Enable debug macros
33#include "PMPRINTF.H"
34#endif
35
36static SHORT SortCnr(PMINIRECORDCORE p1, PMINIRECORDCORE p2, INT Sortflags);
37
38SHORT APIENTRY SortTreeCnr(PMINIRECORDCORE p1, PMINIRECORDCORE p2,
39 PVOID pStorage)
40{
41 return SortCnr(p1, p2, ((pStorage) ? (INT) pStorage : TreesortFlags));
42}
43
44SHORT APIENTRY SortDirCnr(PMINIRECORDCORE p1, PMINIRECORDCORE p2,
45 PVOID pStorage)
46{
47 DIRCNRDATA *dcd = WinQueryWindowPtr(((PCNRITEM) p1)->hwndCnr, QWL_USER);
48
49 return SortCnr(p1, p2, ((pStorage) ? (INT) pStorage :
50 (dcd && dcd->size == sizeof(DIRCNRDATA)) ?
51 dcd->sortFlags : sortFlags));
52}
53
54SHORT APIENTRY SortCollectorCnr(PMINIRECORDCORE p1, PMINIRECORDCORE p2,
55 PVOID pStorage)
56{
57 return SortCnr(p1, p2, ((pStorage) ? (INT) pStorage : CollectorsortFlags));
58}
59
60SHORT SortCnr(PMINIRECORDCORE pRec1, PMINIRECORDCORE pRec2, INT SortFlags)
61{
62 PCNRITEM pCI1 = (PCNRITEM) pRec1;
63 PCNRITEM pCI2 = (PCNRITEM) pRec2;
64 SHORT ret = 0;
65 CHAR *pch1, *pch2;
66
67 if (SortFlags & SORT_NOSORT)
68 return 0;
69 if (!strcmp(pCI1->pszFileName, NullStr) || !strcmp(pCI2->pszFileName, NullStr)) {
70 return 0;
71 }
72 if (SortFlags && pCI1->pszFileName + 3 && pCI2->pszFileName + 3) {
73 if (SortFlags & SORT_DIRSFIRST) {
74 if ((pCI1->attrFile & FILE_DIRECTORY) !=
75 (pCI2->attrFile & FILE_DIRECTORY))
76 return (pCI1->attrFile & FILE_DIRECTORY) ? -1 : 1;
77 }
78 else if (SortFlags & SORT_DIRSLAST) {
79 if ((pCI1->attrFile & FILE_DIRECTORY) !=
80 (pCI2->attrFile & FILE_DIRECTORY))
81 return (pCI1->attrFile & FILE_DIRECTORY) ? 1 : -1;
82 }
83 switch (SortFlags & (~(SORT_DIRSFIRST | SORT_DIRSLAST | SORT_REVERSE))) {
84 case SORT_SUBJECT:
85 if (*pCI1->pszSubject && *pCI2->pszSubject)
86 ret = stricmp(pCI1->pszSubject, pCI2->pszSubject);
87 else {
88 ret = (*pCI2->pszSubject) ? 1 : (*pCI1->pszSubject) ? -1 : 0;
89 if (ret && (SortFlags & SORT_REVERSE))
90 ret = (ret > 0) ? -1 : 1;
91 }
92 break;
93
94 case SORT_FILENAME:
95 pch1 = strrchr(pCI1->pszFileName, '\\');
96 pch2 = strrchr(pCI2->pszFileName, '\\');
97 if (!pch1)
98 pch1 = NullStr;
99 if (!pch2)
100 pch2 = NullStr;
101 ret = stricmp(pch1, pch2);
102 break;
103
104 case SORT_FIRSTEXTENSION:
105 pch1 = strrchr(pCI1->pszFileName, '\\');
106 pch2 = strrchr(pCI2->pszFileName, '\\');
107 if (!pch1)
108 pch1 = pCI1->pszFileName;
109 if (!pch2)
110 pch2 = pCI2->pszFileName;
111 pch1 = strchr(pch1, '.');
112 pch2 = strchr(pch2, '.');
113 if (!pch1)
114 pch1 = NullStr;
115 if (!pch2)
116 pch2 = NullStr;
117 ret = stricmp(pch1, pch2);
118 break;
119
120 case SORT_LASTEXTENSION:
121 pch1 = strrchr(pCI1->pszFileName, '\\');
122 pch2 = strrchr(pCI2->pszFileName, '\\');
123 if (!pch1)
124 pch1 = pCI1->pszFileName;
125 if (!pch2)
126 pch2 = pCI2->pszFileName;
127 pch1 = strrchr(pch1, '.');
128 pch2 = strrchr(pch2, '.');
129 if (!pch1)
130 pch1 = NullStr;
131 if (!pch2)
132 pch2 = NullStr;
133 ret = stricmp(pch1, pch2);
134 break;
135
136 case SORT_SIZE:
137 ret =
138 (pCI1->cbFile < pCI2->cbFile) ? 1 : (pCI1->cbFile ==
139 pCI2->cbFile) ? 0 : -1;
140 if (!ret)
141 ret =
142 (pCI1->easize < pCI2->easize) ? 1 : (pCI1->easize ==
143 pCI2->easize) ? 0 : -1;
144 break;
145
146 case SORT_EASIZE:
147 ret =
148 (pCI1->easize < pCI2->easize) ? 1 : (pCI1->easize ==
149 pCI2->easize) ? 0 : -1;
150 if (!ret)
151 ret =
152 (pCI1->cbFile < pCI2->cbFile) ? 1 : (pCI1->cbFile ==
153 pCI2->cbFile) ? 0 : -1;
154 break;
155
156 case SORT_LWDATE:
157 ret = TestCDates(&pCI1->date, &pCI1->time,
158 &pCI2->date, &pCI2->time);
159 break;
160
161 case SORT_LADATE:
162 ret = TestCDates(&pCI1->ladate, &pCI1->latime,
163 &pCI2->ladate, &pCI2->latime);
164 break;
165
166 case SORT_CRDATE:
167 ret = TestCDates(&pCI1->crdate, &pCI1->crtime,
168 &pCI2->crdate, &pCI2->crtime);
169 break;
170 }
171
172 if (!ret)
173 ret = (SHORT) stricmp(pCI1->pszFileName, pCI2->pszFileName);
174
175 if (ret && (SortFlags & SORT_REVERSE))
176 ret = (ret > 0) ? -1 : 1;
177
178 return ret;
179 }
180 return (SHORT) stricmp(pCI1->pszFileName, pCI2->pszFileName);
181}
182
183#pragma alloc_text(SORTCNR,SortCnr,SortTreeCnr,SortDirCnr,SortCollectorCnr)
Note: See TracBrowser for help on using the repository browser.