source: trunk/dll/makelist.c@ 730

Last change on this file since 730 was 730, checked in by Gregg Young, 18 years ago

Preliminary work on variable sized container buffers. Removes szFileName etc. Builds fine but traps.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: makelist.c 730 2007-07-22 17:57:09Z gyoung $
5
6 Make file lists
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2003, 2006 Steven H.Levine
10
11 12 Feb 03 SHL AddToFileList: standardize EA math
12 22 Jul 06 SHL Use Runtime_Error
13 22 Jul 06 SHL AddToList optimize
14 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limits
15
16***********************************************************************/
17
18#define INCL_DOS
19#define INCL_WIN
20#include <os2.h>
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26
27#include "fm3dll.h"
28#include "fm3str.h"
29
30static PSZ pszSrcFile = __FILE__;
31
32#pragma alloc_text(MAKELIST,AddToList,AddToFileList,BuildList,FreeListInfo,FreeList)
33#pragma alloc_text(MAKELIST,SortList,BuildArcList,RemoveFromList,CombineLists)
34
35VOID SortList(LISTINFO * li)
36{
37 /* bubble-sort entries by size, descending */
38
39 INT x;
40 CHAR *s;
41 ULONG l;
42 BOOL swapped;
43
44 if (li && li->list && li->list[0] && li->cbFile) {
45 do {
46 swapped = FALSE;
47 for (x = 0; li->list[x] && li->list[x + 1]; x++) {
48 if (li->cbFile[x] < li->cbFile[x + 1]) {
49 s = li->list[x];
50 li->list[x] = li->list[x + 1];
51 li->list[x + 1] = s;
52 l = li->cbFile[x];
53 li->cbFile[x] = li->cbFile[x + 1];
54 li->cbFile[x + 1] = l;
55 if (li->ulitemID) {
56 l = li->ulitemID[x];
57 li->ulitemID[x] = li->ulitemID[x + 1];
58 li->ulitemID[x + 1] = l;
59 }
60 swapped = TRUE;
61 }
62 }
63 } while (swapped);
64 }
65}
66
67VOID FreeListInfo(LISTINFO * li)
68{
69 if (li) {
70 if (li->ulitemID)
71 free(li->ulitemID);
72 if (li->cbFile)
73 free(li->cbFile);
74 if (li->list)
75 FreeList(li->list);
76 free(li);
77 }
78}
79
80VOID FreeList(CHAR ** list)
81{
82 register INT x;
83
84 if (list) {
85 for (x = 0; list[x]; x++) {
86#ifdef __DEBUG_ALLOC__
87 _heap_check();
88#endif
89 free(list[x]);
90 }
91#ifdef __DEBUG_ALLOC__
92 _heap_check();
93#endif
94 free(list);
95 }
96 DosPostEventSem(CompactSem);
97}
98
99INT AddToFileList(CHAR * string, FILEFINDBUF4 * ffb4, FILELIST *** list,
100 INT * numfiles, INT * numalloced)
101{
102 FILELIST *pfl;
103
104 if (string && ffb4) {
105 if (((*numfiles) + 3) > *numalloced) {
106 FILELIST **pflArray;
107
108 // Use plain realloc for speed
109 pflArray = realloc(*list, (*numalloced + 6) * sizeof(FILELIST *));
110 if (!pflArray) {
111 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_OUTOFMEMORY));
112 return 1;
113 }
114 (*numalloced) += 6;
115 *list = pflArray;
116 }
117 // Use plain malloc for speed
118 pfl = malloc(sizeof(FILELIST) + strlen(string));
119 if (!pfl) {
120 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_OUTOFMEMORY));
121 return 2;
122 }
123 pfl->attrFile = ffb4->attrFile;
124 pfl->date = ffb4->fdateLastWrite;
125 pfl->time = ffb4->ftimeLastWrite;
126 pfl->ladate = ffb4->fdateLastAccess;
127 pfl->latime = ffb4->ftimeLastAccess;
128 pfl->crdate = ffb4->fdateCreation;
129 pfl->crtime = ffb4->ftimeCreation;
130 pfl->cbFile = ffb4->cbFile;
131 pfl->easize = CBLIST_TO_EASIZE(ffb4->cbList);
132 strcpy(pfl->fname, string);
133 (*list)[*numfiles] = pfl;
134 (*numfiles)++;
135 (*list)[*numfiles] = NULL;
136 (*list)[(*numfiles) + 1] = NULL;
137#ifdef __DEBUG_ALLOC__
138 _heap_check();
139#endif
140 }
141 return 0;
142}
143
144INT AddToList(CHAR * string, CHAR *** list, INT * numfiles, INT * numalloced)
145{
146 CHAR **ppsz;
147 PSZ psz;
148
149 if (string) {
150 if (((*numfiles) + 3) > *numalloced) {
151 // Use plain realloc for speed
152 ppsz = realloc(*list, (*numalloced + 6) * sizeof(CHAR *));
153 if (!ppsz) {
154 Runtime_Error(pszSrcFile, __LINE__, "realloc");
155 return 1;
156 }
157 (*numalloced) += 6;
158 *list = ppsz;
159 }
160 // Use plain malloc for speed
161 psz = malloc(strlen(string) + 1);
162 if (!psz) {
163 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_OUTOFMEMORY));
164 return 2;
165 }
166 (*list)[*numfiles] = psz;
167 strcpy((*list)[*numfiles], string);
168 (*numfiles)++;
169 (*list)[*numfiles] = NULL;
170 (*list)[(*numfiles) + 1] = NULL;
171#ifdef __DEBUG_ALLOC__
172 _heap_check();
173#endif
174 }
175 return 0;
176}
177
178CHAR **BuildList(HWND hwndCnr)
179{
180 PCNRITEM pci;
181 CHAR **list = NULL, **test;
182 INT numfiles = 0, numalloc = 0, error = 0, attribute = CRA_CURSORED;
183
184 pci = (PCNRITEM) CurrentRecord(hwndCnr);
185 if (pci && (INT) pci != -1 && !(pci->flags & RECFLAGS_ENV)) {
186 if (pci->rc.flRecordAttr & CRA_SELECTED) {
187 attribute = CRA_SELECTED;
188 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
189 MPFROMSHORT(attribute));
190 }
191 }
192 while (pci && (INT) pci != -1 && !error) {
193 if (!(pci->rc.flRecordAttr & CRA_FILTERED))
194 error = AddToList(pci->pszFileName, &list, &numfiles, &numalloc);
195 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
196 MPFROMSHORT(attribute));
197 }
198 if (numalloc > numfiles + 1) {
199 // Use plain realloc for speed
200 test = realloc(list, sizeof(CHAR *) * (numfiles + 1));
201 if (!test)
202 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_OUTOFMEMORY));
203 else
204 list = test;
205 }
206 return list;
207}
208
209CHAR **BuildArcList(HWND hwndCnr)
210{
211 PARCITEM pai;
212 CHAR **list = NULL;
213 INT numfiles = 0, numalloc = 0, error = 0, attribute = CRA_CURSORED;
214
215 pai = (PARCITEM) CurrentRecord(hwndCnr);
216 if (pai && (INT) pai != -1) {
217 if (pai->rc.flRecordAttr & CRA_SELECTED) {
218 attribute = CRA_SELECTED;
219 pai = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST),
220 MPFROMSHORT(attribute));
221 }
222 }
223 while (pai && (INT) pai != -1 && !error) {
224 if (!(pai->rc.flRecordAttr & CRA_FILTERED))
225 error = AddToList(pai->pszFileName, &list, &numfiles, &numalloc);
226 pai = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pai),
227 MPFROMSHORT(attribute));
228 }
229 return list;
230}
231
232CHAR **RemoveFromList(CHAR ** list, CHAR * item)
233{
234 register INT x, y;
235
236 if (list && list[0] && item) {
237 for (x = 0; list[x]; x++) {
238 if (item == list[x]) {
239 free(list[x]);
240 list[x] = NULL;
241 for (y = x;; y++) {
242 if (y != x && !list[y])
243 break;
244 list[y] = list[y + 1];
245 }
246 if (!list[0]) {
247 FreeList(list);
248 list = NULL;
249 }
250 break;
251 }
252 }
253 }
254 return list;
255}
256
257CHAR **CombineLists(CHAR ** prime, CHAR ** add)
258{
259 register INT x;
260 INT numalloc, numfiles = 0;
261
262 if (add && add[0]) {
263 if (prime) {
264 for (x = 0; prime[x]; x++)
265 numfiles++;
266 }
267 numalloc = numfiles;
268 for (x = 0; add[x]; x++) {
269 if (*add[x])
270 AddToList(add[x], &prime, &numfiles, &numalloc);
271 }
272 FreeList(add);
273 }
274 return prime;
275}
Note: See TracBrowser for help on using the repository browser.