source: trunk/dll/makelist.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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