source: trunk/dll/avl.c@ 1082

Last change on this file since 1082 was 1082, checked in by Gregg Young, 17 years ago

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 33.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: avl.c 1082 2008-07-19 22:37:36Z gyoung $
5
6 archiver.bb2 search, load, save and date parse
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2004, 2008 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 13 Aug 05 SHL Beautify with indent
13 13 Aug 05 SHL find_type: correct no sig exists bypass logic
14 13 Aug 05 SHL SBoxDlgProc: avoid dereferencing NULL signature
15 18 Aug 05 SHL Comments
16 31 Dec 05 SHL indent -i2
17 08 Dec 05 SHL load_archivers: allow empty startlist
18 30 Dec 05 SHL load_archivers: use get_archiver_line?(), clean nits
19 29 May 06 SHL SBoxDlgProc: support move, add, delete
20 30 May 06 SHL load_archivers: add reload support
21 16 Jun 06 SHL load_archivers: support signatures containing 0s
22 26 Jun 06 SHL load_archivers: remember where comments are
23 14 Jul 06 SHL Use Runtime_Error
24 29 Jul 06 SHL Use xfgets, xfgets_bstripcr
25 15 Aug 06 SHL Use Runtime_Error more
26 01 Nov 06 SHL Turn off leftover debug code
27 06 Apr 07 GKY Work around PM DragInfo and DrgFreeDISH limit
28 19 Apr 07 SHL Use FreeDragInfoData
29 19 Apr 07 SHL Add more drag/drop error checking
30 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
31 25 Aug 07 SHL load_archivers: add missing close on error path
32 29 Feb 08 GKY Use xfree where appropriate
33 22 Jun 08 GKY Added free_archivers for fortify checking
34 19 Jul 08 GKY ifdef Fortify free_archivers
35
36***********************************************************************/
37
38#include <stdlib.h>
39#include <string.h>
40#include <ctype.h>
41#include <share.h>
42
43#define INCL_DOS
44#define INCL_WIN
45#define INCL_WINSTDDRAG
46#define INCL_LONGLONG
47
48#include "fm3dlg.h"
49#include "fm3str.h"
50#include "avl.h"
51#include "strutil.h" // GetPString
52#include "errutil.h" // Runtime_Error
53#include "fm3dll.h"
54#include "fortify.h"
55
56static PSZ pszSrcFile = __FILE__;
57
58static void fill_listbox(HWND hwnd, BOOL fShowAll, SHORT sOldSelect);
59
60//=== quick_find_type() ===
61
62ARC_TYPE *quick_find_type(CHAR * filespec, ARC_TYPE * topsig)
63{
64 ARC_TYPE *info, *found = NULL;
65 CHAR *p;
66
67 if (!arcsigsloaded)
68 load_archivers();
69 p = strrchr(filespec, '.');
70 if (p) {
71 p++;
72 info = (topsig) ? topsig : arcsighead;
73 while (info) {
74 if (info->ext && *(info->ext) && !stricmp(p, info->ext)) {
75 found = find_type(filespec, topsig);
76 break;
77 }
78 info = info->next;
79 }
80 }
81 return found;
82}
83
84//=== fill_listbox() fill or refill listbox from current archiver definitions ===
85
86static VOID fill_listbox(HWND hwnd, BOOL fShowAll, SHORT sOldSelect)
87{
88 ARC_TYPE *pat;
89 BOOL found = FALSE;
90 SHORT sSelect;
91
92 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
93
94 for (pat = arcsighead; pat; pat = pat->next) {
95 /*
96 * this inner loop tests for a dup signature entry and assures
97 * that only the entry at the top of the list gets used for
98 * conversion; editing any is okay
99 */
100 if (!fShowAll) {
101 ARC_TYPE *pat2;
102 BOOL isDup = FALSE;
103
104 for (pat2 = arcsighead;
105 pat2 && pat->siglen && pat2 != pat && !isDup; pat2 = pat2->next) {
106 isDup = pat2->siglen == pat->siglen &&
107 !memcmp(pat2->signature, pat->signature, pat->siglen);
108 } // for
109 if (isDup)
110 continue;
111 }
112
113 // If caller is editing archivers or entry useful to caller, show in listbox
114 if (fShowAll || (pat->id && pat->extract && pat->create)) {
115 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM,
116 MPFROM2SHORT(LIT_END, 0),
117 MPFROMP(pat->id ? pat->id : "?"));
118 if (!found && *szDefArc && pat->id && !strcmp(szDefArc, pat->id)) {
119 // Highlight default
120 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
121 MPFROMSHORT(sSelect), MPFROMSHORT(TRUE));
122 found = TRUE;
123 }
124 }
125 else {
126 // Complain about odd entry
127 if (!pat->id || !*pat->id) {
128 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM,
129 MPFROM2SHORT(LIT_END, 0),
130 MPFROMP(GetPString(IDS_UNKNOWNUNUSABLETEXT)));
131 }
132 else {
133 CHAR s[81];
134
135 sprintf(s, "%0.12s %s", pat->id, GetPString(IDS_UNUSABLETEXT));
136 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM,
137 MPFROM2SHORT(LIT_END, 0), MPFROMP(s));
138 }
139 }
140 } // while scanning
141
142 // Try to reselect last selection unless user wants default selection
143 if (sOldSelect != LIT_NONE && !found) {
144 SHORT sItemCount =
145 (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMCOUNT,
146 MPVOID, MPVOID);
147
148 if (sOldSelect >= sItemCount)
149 sOldSelect = sItemCount - 1;
150 if (sOldSelect >= 0) {
151 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
152 MPFROMSHORT(sOldSelect), MPFROMSHORT(TRUE));
153 }
154 }
155
156 if (found)
157 PosOverOkay(hwnd);
158}
159
160ARC_TYPE *find_type(CHAR * filespec, ARC_TYPE * topsig)
161{
162 HFILE handle;
163 ULONG action;
164 ULONG len;
165 ULONG l;
166 ARC_TYPE *info;
167 CHAR *p;
168 // CHAR buffer[80];
169 CHAR buffer[4096]; // 06 Oct 07 SHL Protect against NTFS defect
170
171 if (!arcsigsloaded)
172 load_archivers();
173 if (!topsig)
174 topsig = arcsighead;
175 DosError(FERR_DISABLEHARDERR);
176 if (DosOpen(filespec,
177 &handle,
178 &action,
179 0,
180 0,
181 OPEN_ACTION_FAIL_IF_NEW |
182 OPEN_ACTION_OPEN_IF_EXISTS,
183 OPEN_FLAGS_FAIL_ON_ERROR |
184 OPEN_FLAGS_NOINHERIT |
185 OPEN_FLAGS_RANDOMSEQUENTIAL |
186 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, 0))
187 return NULL;
188 // Scan signatures
189 for (info = topsig; info; info = info->next) {
190 if (info->siglen == 0) {
191 // No signature -- check extension
192 p = strrchr(filespec, '.');
193 if (p) {
194 p++;
195 if (info->ext && *(info->ext) && !stricmp(p, info->ext))
196 break; // Matched
197
198 }
199 continue; // Next sig
200
201 }
202 // Try signature match
203 l = info->siglen;
204 l = min(l, 79);
205 if (!DosChgFilePtr(handle,
206 abs(info->file_offset),
207 (info->file_offset >= 0) ?
208 FILE_BEGIN : FILE_END, &len)) {
209 if (!DosRead(handle, buffer, l, &len) && len == l) {
210 if (!memcmp(info->signature, buffer, l))
211 break; // Matched
212
213 }
214 }
215 } // for
216
217 DosClose(handle); /* Either way, we're done for now */
218 return info; /* Return signature, if any */
219}
220
221# ifdef FORTIFY
222
223VOID free_archivers(VOID)
224{
225 ARC_TYPE *pat, *next;
226
227 pat = arcsighead;
228 while (pat) {
229 next = pat->next;
230 xfree(pat->id, pszSrcFile, __LINE__);
231 xfree(pat->ext, pszSrcFile, __LINE__);
232 xfree(pat->list, pszSrcFile, __LINE__);
233 xfree(pat->extract, pszSrcFile, __LINE__);
234 xfree(pat->create, pszSrcFile, __LINE__);
235 xfree(pat->move, pszSrcFile, __LINE__);
236 xfree(pat->delete, pszSrcFile, __LINE__);
237 xfree(pat->signature, pszSrcFile, __LINE__);
238 xfree(pat->startlist, pszSrcFile, __LINE__);
239 xfree(pat->endlist, pszSrcFile, __LINE__);
240 xfree(pat->exwdirs, pszSrcFile, __LINE__);
241 xfree(pat->test, pszSrcFile, __LINE__);
242 xfree(pat->createrecurse, pszSrcFile, __LINE__);
243 xfree(pat->createwdirs, pszSrcFile, __LINE__);
244 xfree(pat->movewdirs, pszSrcFile, __LINE__);
245 xfree(pat, pszSrcFile, __LINE__);
246 pat = next;
247 }
248 arcsighead = NULL;
249}
250
251//=== free_arc_type() free allocated ARC_TYPE ===
252
253# endif
254
255VOID free_arc_type(ARC_TYPE * pat)
256{
257 if (pat) {
258 xfree(pat->id, pszSrcFile, __LINE__);
259 xfree(pat->ext, pszSrcFile, __LINE__);
260 xfree(pat->list, pszSrcFile, __LINE__);
261 xfree(pat->extract, pszSrcFile, __LINE__);
262 xfree(pat->create, pszSrcFile, __LINE__);
263 xfree(pat->move, pszSrcFile, __LINE__);
264 xfree(pat->delete, pszSrcFile, __LINE__);
265 xfree(pat->signature, pszSrcFile, __LINE__);
266 xfree(pat->startlist, pszSrcFile, __LINE__);
267 xfree(pat->endlist, pszSrcFile, __LINE__);
268 xfree(pat->exwdirs, pszSrcFile, __LINE__);
269 xfree(pat->test, pszSrcFile, __LINE__);
270 xfree(pat->createrecurse, pszSrcFile, __LINE__);
271 xfree(pat->createwdirs, pszSrcFile, __LINE__);
272 xfree(pat->movewdirs, pszSrcFile, __LINE__);
273 free(pat);
274 }
275}
276
277static UINT cur_line_num; // Input file line counter
278
279//=== get_line_strip_comments() read line, strip comments and whitespace ===
280
281#define ARCHIVER_LINE_BYTES 256
282
283static PSZ get_line_strip_comments(PSZ pszIn, FILE * fp)
284{
285 PSZ psz = xfgets(pszIn, ARCHIVER_LINE_BYTES, fp, pszSrcFile, __LINE__);
286 PSZ psz2;
287
288 if (psz) {
289 cur_line_num++;
290 psz2 = strchr(pszIn, ';');
291 if (psz2)
292 *psz2 = 0; // Chop comment
293 bstripcr(pszIn); // Strip leading white and trailing white and CR/LF
294
295 }
296 return psz;
297}
298
299//=== get_line_strip_white() read line, strip whitespace ===
300
301static PSZ get_line_strip_white(PSZ pszIn, FILE * fp)
302{
303 PSZ psz =
304 xfgets_bstripcr(pszIn, ARCHIVER_LINE_BYTES, fp, pszSrcFile, __LINE__);
305
306 if (psz)
307 cur_line_num++;
308
309 return psz;
310}
311
312//=== load_archivers() load or reload archive definitions from archiver.bb2 ===
313
314INT load_archivers(VOID)
315{
316 FILE *fp;
317 CHAR sz[ARCHIVER_LINE_BYTES + 1];
318 CHAR *psz;
319 ARC_TYPE *pat = NULL;
320 ARC_TYPE *patLast = NULL;
321 UINT lines_per_arcsig = LINES_PER_ARCSIG;
322 UINT per_sig_comment_line_num = 0;
323 INT i;
324
325 // Free current signatures
326 if (arcsighead) {
327 for (pat = arcsighead; pat;) {
328 patLast = pat;
329 pat = pat->next;
330 free_arc_type(patLast);
331 }
332 arcsighead = NULL;
333 }
334
335 arcsigsmodified = FALSE;
336 arcsigs_header_lines = 0;
337 arcsigs_trailer_line_num = 0;
338
339 DosEnterCritSec();
340 psz = searchpath(GetPString(IDS_ARCHIVERBB2));
341 if (!psz || !*psz) {
342 DosExitCritSec();
343 return -1;
344 }
345 fp = _fsopen(psz, "r", SH_DENYWR);
346 DosExitCritSec();
347 if (!fp)
348 return -2;
349 strcpy(archiverbb2, psz); // Remember full path
350
351 cur_line_num = 0;
352
353 // Line 1 must contain number of lines per signature definition
354 if (!get_line_strip_comments(sz, fp)) {
355 fclose(fp);
356 return -3;
357 }
358 if (*sz)
359 lines_per_arcsig = atoi(sz);
360 if (!*sz || lines_per_arcsig < LINES_PER_ARCSIG) {
361 fclose(fp); // 25 Aug 07 SHL
362 return -3;
363 }
364
365 // Parse rest of file
366 // 1st non-blank line starts definition
367 // Need to determine header size and start of trailer
368
369 while (!feof(fp)) {
370 // If reading header
371 if (!arcsigs_header_lines) {
372 // Reading header - find header size and start of signtures
373 if (!get_line_strip_white(sz, fp))
374 break; // Unexpected EOF
375 if (stristr(sz, "-- Current Archivers --")) {
376 arcsigs_header_lines = cur_line_num;
377 continue;
378 }
379 if (!*sz || *sz == ';')
380 continue; // Header comment or blank line
381 else {
382 // Not a comment, must be start of signatures
383 PSZ psz2 = strchr(sz, ';');
384
385 if (psz2) {
386 *psz2 = 0; // Chop trailing comment
387 bstripcr(sz); // Strip leading white and trailing white and CR/LF
388 }
389 arcsigs_header_lines = cur_line_num - 1;
390 }
391 }
392 else {
393 // Reading defintiions
394 if (!get_line_strip_comments(sz, fp))
395 break; // EOF
396 }
397
398 // fixme to avoid allocating empty fields
399
400 // Remember start of per sig comments for next definition
401 if (per_sig_comment_line_num == 0)
402 per_sig_comment_line_num = cur_line_num;
403
404 if (*sz) {
405 // At start of defintion
406
407 pat = xmallocz(sizeof(ARC_TYPE), pszSrcFile, __LINE__);
408 if (!pat)
409 break;
410 pat->id = xstrdup(sz, pszSrcFile, __LINE__);
411
412 pat->comment_line_num = per_sig_comment_line_num;
413 pat->defn_line_num = cur_line_num;
414
415 if (!get_line_strip_comments(sz, fp)) // line 2 - extension
416 break;
417 if (*sz)
418 pat->ext = xstrdup(sz, pszSrcFile, __LINE__);
419 else
420 pat->ext = NULL;
421 if (!get_line_strip_comments(sz, fp)) // line 3 - offset to signature
422 break;
423 pat->file_offset = atol(sz);
424 if (!get_line_strip_comments(sz, fp)) // line 4 - list command
425 break;
426 if (*sz)
427 pat->list = xstrdup(sz, pszSrcFile, __LINE__);
428 else
429 pat->list = NULL;
430 if (!pat->list)
431 break; // Must have list command - fixme to complain
432 if (!get_line_strip_comments(sz, fp)) // line 5
433 break;
434 if (*sz)
435 pat->extract = xstrdup(sz, pszSrcFile, __LINE__);
436 else
437 pat->extract = NULL;
438 if (!get_line_strip_comments(sz, fp)) // line 6
439 break;
440 if (*sz)
441 pat->exwdirs = xstrdup(sz, pszSrcFile, __LINE__);
442 else
443 pat->exwdirs = NULL;
444 if (!get_line_strip_comments(sz, fp)) // line 7
445 break;
446 if (*sz)
447 pat->test = xstrdup(sz, pszSrcFile, __LINE__);
448 else
449 pat->test = NULL;
450 if (!get_line_strip_comments(sz, fp)) // line 8
451 break;
452 if (*sz)
453 pat->create = xstrdup(sz, pszSrcFile, __LINE__);
454 else
455 pat->create = NULL;
456 if (!get_line_strip_comments(sz, fp)) // line 9
457 break;
458 if (*sz)
459 pat->createwdirs = xstrdup(sz, pszSrcFile, __LINE__);
460 else
461 pat->createwdirs = NULL;
462 if (!get_line_strip_comments(sz, fp)) // line 10
463 break;
464 if (*sz)
465 pat->createrecurse = xstrdup(sz, pszSrcFile, __LINE__);
466 else
467 pat->createrecurse = NULL;
468 if (!get_line_strip_comments(sz, fp)) // line 11
469 break;
470 if (*sz)
471 pat->move = xstrdup(sz, pszSrcFile, __LINE__);
472 else
473 pat->move = NULL;
474 if (!get_line_strip_comments(sz, fp)) // line 12
475 break;
476 if (*sz)
477 pat->movewdirs = xstrdup(sz, pszSrcFile, __LINE__);
478 else
479 pat->movewdirs = NULL;
480 if (!get_line_strip_comments(sz, fp)) // line 13
481 break;
482 if (*sz)
483 pat->delete = xstrdup(sz, pszSrcFile, __LINE__);
484 else
485 pat->delete = NULL;
486 if (!get_line_strip_white(sz, fp)) // line 14
487 break;
488 i = literal(sz); // Translate \ escapes
489 if (i) {
490 pat->siglen = i;
491 pat->signature = xmalloc(i, pszSrcFile, __LINE__);
492 if (!pat->signature)
493 break;
494 memcpy(pat->signature, sz, i); // signature may not be a string
495 }
496 else {
497 pat->siglen = 0;
498 pat->signature = NULL;
499 }
500 if (!get_line_strip_white(sz, fp)) // line 15
501 break;
502 if (*sz)
503 pat->startlist = xstrdup(sz, pszSrcFile, __LINE__);
504 else
505 pat->startlist = NULL;
506 if (!get_line_strip_white(sz, fp)) // line 16
507 break;
508 if (*sz)
509 pat->endlist = xstrdup(sz, pszSrcFile, __LINE__);
510 else
511 pat->endlist = NULL;
512 if (!get_line_strip_comments(sz, fp)) // line 17
513 break;
514 pat->osizepos = atoi(sz);
515 if (!get_line_strip_comments(sz, fp)) // line 18
516 break;
517 pat->nsizepos = atoi(sz);
518 if (!get_line_strip_comments(sz, fp)) // line 19
519 break;
520 pat->fdpos = atoi(sz);
521 psz = strchr(sz, ',');
522 if (psz) {
523 psz++;
524 pat->datetype = atoi(psz);
525 }
526 if (!get_line_strip_comments(sz, fp)) // line 20
527 break;
528 pat->fdflds = atoi(sz);
529 if (!get_line_strip_comments(sz, fp)) // line 21
530 break;
531 pat->fnpos = atoi(sz);
532 psz = strchr(sz, ',');
533 if (psz) {
534 psz++;
535 pat->nameislast = (BOOL) (*psz && atol(psz) == 0) ? FALSE : TRUE;
536 psz = strchr(psz, ',');
537 if (psz) {
538 psz++;
539 pat->nameisnext = (BOOL) (*psz && atol(psz) == 0) ? FALSE : TRUE;
540 psz = strchr(psz, ',');
541 if (psz) {
542 psz++;
543 pat->nameisfirst = (BOOL) (*psz && atol(psz) == 0) ? FALSE : TRUE;
544 }
545 }
546 }
547 // Ignore unknown lines - must be newer file format
548 for (i = LINES_PER_ARCSIG; i < lines_per_arcsig; i++) {
549 if (!get_line_strip_comments(sz, fp))
550 break; // Unexpected EOF - fixme to complain
551 }
552
553 // Add to list, assume next and prev already NULL
554 if (!arcsighead)
555 arcsighead = patLast = pat;
556 else {
557 patLast->next = pat;
558 pat->prev = patLast;
559 patLast = pat;
560 }
561 pat = NULL; // Done with this defintion
562
563 arcsigs_trailer_line_num = cur_line_num + 1; // In case this is last defintion
564 per_sig_comment_line_num = 0;
565 } // if got definition
566
567 } // while more lines
568
569 fclose(fp);
570
571 free_arc_type(pat); // In case partial definition in progress
572
573 if (!arcsighead)
574 return -4;
575
576 arcsigsloaded = TRUE;
577
578 return 0;
579}
580
581#define TEST_DRAG 0 // fixme to be gone or to work
582
583static MRESULT EXPENTRY SDlgListboxSubclassProc(HWND hwnd, ULONG msg,
584 MPARAM mp1, MPARAM mp2)
585{
586 PFNWP pfnOldProc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
587
588 PDRAGITEM pDItem;
589 PDRAGINFO pDInfo;
590 BOOL ok;
591
592 static BOOL emphasized = FALSE;
593 static PSZ DRMDRF_LBOX = "<DRM_LBOX,DRF_UNKNOWN>";
594 static PSZ DRM_LBOX = "DRM_LBOX";
595
596 switch (msg) {
597 case WM_BEGINDRAG:
598 {
599 LONG cur_ndx;
600 DRAGITEM ditem;
601 DRAGIMAGE dimage;
602 HWND hwndDrop;
603
604 // fprintf(stderr, "SDlgListboxSubclassProc: BEGINDRAG\n");
605 cur_ndx = WinQueryLboxSelectedItem(hwnd);
606
607 if (cur_ndx != LIT_NONE) {
608 pDInfo = DrgAllocDraginfo(1);
609 if (pDInfo) {
610 pDInfo->usOperation = DO_DEFAULT;
611 pDInfo->hwndSource = hwnd;
612
613 memset(&ditem, 0, sizeof(DRAGITEM));
614 ditem.hwndItem = hwnd;
615 ditem.ulItemID = 1;
616 ditem.hstrType = DrgAddStrHandle(DRT_UNKNOWN);
617 ditem.hstrRMF = DrgAddStrHandle(DRMDRF_LBOX);
618 ditem.hstrContainerName = DrgAddStrHandle("");
619 ditem.hstrSourceName = DrgAddStrHandle("");
620 ditem.hstrTargetName = DrgAddStrHandle("");
621 // ditem.fsControl = 0;
622 ditem.fsSupportedOps = DO_MOVEABLE;
623
624 memset(&dimage, 0, sizeof(DRAGIMAGE));
625 dimage.cb = sizeof(DRAGIMAGE);
626 dimage.hImage = hptrFile;
627 dimage.cptl = 0;
628 dimage.fl = DRG_ICON;
629 dimage.sizlStretch.cx = 32;
630 dimage.sizlStretch.cy = 32;
631 dimage.cxOffset = -16;
632 dimage.cyOffset = 0;
633 DrgSetDragitem(pDInfo, &ditem, sizeof(DRAGITEM), 0); /* Index of DRAGITEM */
634 hwndDrop = DrgDrag(hwnd, pDInfo, &dimage, 1, /* One DRAGIMAGE */
635 VK_ENDDRAG, NULL);
636 if (!hwndDrop)
637 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "DrgDrag");
638
639 DrgFreeDraginfo(pDInfo);
640 // WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_ACTIVATE);
641 }
642 }
643 break;
644 }
645
646 case DM_DRAGOVER:
647 ok = FALSE;
648 if (!emphasized) {
649 POINTL ptl;
650 POINTL ptl2;
651
652 emphasized = TRUE;
653 ptl.x = SHORT1FROMMP(mp2);
654 ptl.y = SHORT2FROMMP(mp2);
655 ptl2 = ptl;
656 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl2, 1);
657 // fprintf(stderr, "DRAGOVER mapped x y %d %d to %d %d\n", ptl.x, ptl.y, ptl2.x, ptl2.y);
658 WinPostMsg(hwnd, WM_BUTTON1CLICK,
659 MPFROM2SHORT((SHORT) ptl2.x, (SHORT) ptl2.y),
660 MPFROM2SHORT(HT_NORMAL, KC_NONE));
661 // fprintf(stderr, "DRAGOVER posted 0x%x WM_BUTTON1CLICK x y %d %d\n", hwnd, ptl2.x, ptl2.y);
662 }
663 pDInfo = (PDRAGINFO) mp1; /* Get DRAGINFO pointer */
664 if (pDInfo) {
665 if (!DrgAccessDraginfo(pDInfo)) {
666 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
667 "DrgAccessDraginfo");
668 }
669 else {
670 pDItem = DrgQueryDragitemPtr(pDInfo, 0);
671 /* Check valid rendering mechanisms and data format */
672 ok = DrgVerifyRMF(pDItem, DRM_LBOX, NULL);
673 DrgFreeDraginfo(pDInfo);
674 }
675 }
676 return ok ? MRFROM2SHORT(DOR_DROP, DO_MOVE) :
677 MRFROM2SHORT(DOR_NEVERDROP, 0);
678
679 case DM_DRAGLEAVE:
680 if (emphasized) {
681 emphasized = FALSE;
682 // fixme to draw listbox item emphasized
683 // DrawTargetEmphasis(hwnd, emphasized);
684 // fprintf(stderr, "DRAGLEAVE\n");
685 fflush(stderr);
686 }
687 return 0;
688
689 case DM_DROPHELP:
690 DropHelp(mp1, mp2, hwnd, "fixme to give some help");
691 return 0;
692
693 case DM_DROP:
694 ok = FALSE;
695 if (emphasized) {
696 emphasized = FALSE;
697 // DrawTargetEmphasis(hwnd, emphasized);
698 }
699 pDInfo = (PDRAGINFO) mp1; /* Get DRAGINFO pointer */
700 if (pDInfo) {
701 if (!DrgAccessDraginfo(pDInfo)) {
702 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,
703 "DrgAccessDraginfo");
704 }
705 else {
706 pDItem = DrgQueryDragitemPtr(pDInfo, 0);
707 if (!pDItem)
708 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "DM_DROP");
709 /* Check valid rendering mechanisms and data */
710 ok = DrgVerifyRMF(pDItem, DRM_LBOX, NULL)
711 && ~pDItem->fsControl & DC_PREPARE;
712 if (ok) {
713 // ret = FullDrgName(pDItem,buffer,buflen);
714 /* note: targetfail is returned to source for all items */
715 DrgSendTransferMsg(pDInfo->hwndSource, DM_ENDCONVERSATION,
716 MPFROMLONG(pDItem->ulItemID),
717 MPFROMLONG(DMFL_TARGETSUCCESSFUL));
718 }
719 FreeDragInfoData(hwnd, pDInfo);
720 }
721 }
722 return 0;
723 } // switch
724 return pfnOldProc ? pfnOldProc(hwnd, msg, mp1, mp2) :
725 WinDefWindowProc(hwnd, msg, mp1, mp2);
726}
727
728//=== SBoxDlgProc() Select archiver to use or edit, supports list reorder too ===
729
730static PSZ pszCantFindMsg = "Can't find item %d";
731
732MRESULT EXPENTRY SBoxDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
733{
734 ARC_TYPE **ppatReturn; // Where to return selected archiver
735 ARC_TYPE *pat;
736 SHORT sSelect;
737 SHORT sItemCount;
738 CHAR szItemText[256];
739 CHAR szPCItemText[256]; // Parent or child item text
740 SHORT i;
741 BOOL fShowAll;
742
743 static SHORT sLastSelect = LIT_NONE;
744
745 switch (msg) {
746 case WM_INITDLG:
747 if (!arcsigsloaded)
748 load_archivers();
749 if (!(ARC_TYPE **) mp2) {
750 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
751 WinDismissDlg(hwnd, 0);
752 break;
753 }
754 /* Passed arg points to where to return selected archiver definition
755 * On input arg value controls selection list content
756 * If non-NULL, dup names are suppressed
757 * If NULL, all definitions are shown
758 */
759 ppatReturn = (ARC_TYPE **) mp2;
760 fShowAll = *ppatReturn == NULL;
761 if (*ppatReturn)
762 *ppatReturn = arcsighead; // Preset to first
763 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) ppatReturn);
764 fill_listbox(hwnd, fShowAll, sLastSelect);
765
766#ifdef TEST_DRAG // fixme
767 {
768 HWND hwnd2 = WinWindowFromID(hwnd, ASEL_LISTBOX);
769 PFNWP pfn = WinSubclassWindow(hwnd2,
770 SDlgListboxSubclassProc);
771
772 WinSetWindowPtr(hwnd2, QWL_USER, (PVOID) pfn);
773 }
774#endif // TEST_DRAG fixme
775
776 break;
777
778 case WM_COMMAND:
779 ppatReturn = (ARC_TYPE **) WinQueryWindowPtr(hwnd, QWL_USER);
780 switch (SHORT1FROMMP(mp1)) {
781 case DID_OK:
782 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
783 ASEL_LISTBOX,
784 LM_QUERYSELECTION,
785 MPFROMSHORT(LIT_FIRST), MPVOID);
786 if (sSelect == LIT_NONE) {
787 Runtime_Error(pszSrcFile, __LINE__, "list empty");
788 return 0;
789 }
790 pat = arcsighead;
791 if (*ppatReturn) {
792 // If dups hidden, find archiver with matching id
793 *szItemText = 0;
794 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT,
795 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText));
796 if (!*szItemText)
797 pat = NULL;
798 else {
799 for (; pat; pat = pat->next) {
800 if (pat->id && !strcmp(szItemText, pat->id))
801 break; // Found it
802 }
803 }
804 }
805 else {
806 // If dups not hidden, lookup by count
807 for (i = 0; pat && i < sSelect; i++, pat = pat->next) ; // Scan
808 }
809 if (pat && (!*ppatReturn || (pat->id && pat->extract && pat->create))) {
810 *ppatReturn = pat;
811 }
812 else {
813 Runtime_Error(pszSrcFile, __LINE__, "no match");
814 // Refuse to select
815 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
816 MPFROMSHORT(LIT_NONE), FALSE);
817 return 0;
818 }
819 sLastSelect = sSelect;
820 WinDismissDlg(hwnd, TRUE);
821 return 0;
822
823 case DID_CANCEL:
824 if (arcsigsmodified) {
825 if (saymsg(MB_YESNO,
826 hwnd,
827 GetPString(IDS_ADCHANGESINMEMTEXT),
828 GetPString(IDS_ADREWRITETEXT), NullStr) == MBID_YES) {
829 PSZ ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without prompting
830
831 rewrite_archiverbb2(ab2);
832 }
833 }
834 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
835 ASEL_LISTBOX,
836 LM_QUERYSELECTION,
837 MPFROMSHORT(LIT_FIRST), MPVOID);
838 if (sSelect != LIT_NONE)
839 sLastSelect = sSelect;
840 *ppatReturn = NULL;
841 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); // fixme to understand why needed
842 return 0;
843
844 case ASEL_PB_ADD:
845 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
846 ASEL_LISTBOX,
847 LM_QUERYSELECTION,
848 MPFROMSHORT(LIT_FIRST), MPVOID);
849 if (sSelect != LIT_NONE) {
850 ARCDUMP ad;
851
852 memset(&ad, 0, sizeof(ARCDUMP));
853 ad.info = xmallocz(sizeof(ARC_TYPE), pszSrcFile, __LINE__);
854 if (ad.info) {
855 if (!WinDlgBox(HWND_DESKTOP,
856 hwnd,
857 ArcReviewDlgProc,
858 FM3ModHandle, AD_FRAME, MPFROMP(&ad))) {
859 free(ad.info);
860 }
861 else {
862 // Find self - assume all archivers listed since we are editing
863 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) ; // Find self
864
865 if (!pat) {
866 if (arcsighead)
867 Runtime_Error(pszSrcFile, __LINE__, pszCantFindMsg, sSelect);
868 else
869 arcsighead = ad.info;
870 }
871 else {
872 // Insert before
873 if (pat->prev) {
874 ad.info->next = pat;
875 ad.info->prev = pat->prev;
876 pat->prev->next = ad.info;
877 pat->prev = ad.info;
878 }
879 else {
880 arcsighead = ad.info;
881 ad.info->next = pat;
882 pat->prev = ad.info;
883 }
884 }
885 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM,
886 MPFROM2SHORT(sSelect, 0),
887 MPFROMP(ad.info->id ? ad.info->id : "?"));
888 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
889 MPFROMSHORT(sSelect - 1), MPFROMSHORT(TRUE));
890 arcsigsmodified = TRUE;
891 }
892 }
893 }
894 return 0;
895 case ASEL_PB_DELETE:
896 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
897 ASEL_LISTBOX,
898 LM_QUERYSELECTION,
899 MPFROMSHORT(LIT_FIRST), MPVOID);
900 if (sSelect != LIT_NONE) {
901 // Find self - assume all archivers listed since we are editing
902 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) ; // Find self
903
904 if (!pat)
905 Runtime_Error(pszSrcFile, __LINE__, pszCantFindMsg, sSelect);
906 else {
907 // Delete current
908 if (pat->prev) {
909 pat->prev->next = pat->next;
910 if (pat->next)
911 pat->next->prev = pat->prev;
912 }
913 else {
914 arcsighead = pat->next;
915 if (pat->next)
916 pat->next->prev = pat->prev;
917 }
918 }
919 free_arc_type(pat);
920 arcsigsmodified = TRUE;
921 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_DELETEITEM,
922 MPFROM2SHORT(sSelect, 0), MPVOID);
923 sItemCount =
924 (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMCOUNT,
925 MPVOID, MPVOID);
926 if (sSelect >= sItemCount)
927 sSelect--;
928 if (sSelect >= 0) {
929 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
930 MPFROMSHORT(sSelect), MPFROMSHORT(TRUE));
931 }
932 }
933 return 0;
934 case ASEL_PB_UP:
935 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
936 ASEL_LISTBOX,
937 LM_QUERYSELECTION,
938 MPFROMSHORT(LIT_FIRST), MPVOID);
939 if (sSelect != LIT_NONE && sSelect > 0) {
940 // Find self - assume all archivers listed since we are editing
941 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) ; // Find self
942 if (!pat || !pat->prev)
943 Runtime_Error(pszSrcFile, __LINE__, pszCantFindMsg, sSelect);
944 else {
945 ARC_TYPE *patGDad;
946 ARC_TYPE *patDad;
947 ARC_TYPE *patChild;
948
949 patChild = pat->next;
950 patDad = pat->prev;
951 patGDad = patDad->prev;
952 patDad->next = patChild;
953 if (patChild)
954 patChild->prev = patDad;
955 patDad->prev = pat;
956 pat->next = patDad;
957 if (patGDad) {
958 patGDad->next = pat;
959 pat->prev = patGDad;
960 }
961 else {
962 arcsighead = pat;
963 pat->prev = NULL;
964 }
965
966 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT,
967 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText));
968 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT,
969 MPFROM2SHORT(sSelect - 1, 255),
970 MPFROMP(szPCItemText));
971 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT,
972 MPFROMSHORT(sSelect), MPFROMP(szPCItemText));
973 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT,
974 MPFROMSHORT(sSelect - 1), MPFROMP(szItemText));
975 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
976 MPFROMSHORT(sSelect - 1), MPFROMSHORT(TRUE));
977 arcsigsmodified = TRUE;
978 }
979 }
980 return 0;
981 case ASEL_PB_DOWN:
982 sSelect =
983 (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYSELECTION,
984 MPFROMSHORT(LIT_FIRST), MPVOID);
985 sItemCount =
986 (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMCOUNT,
987 MPVOID, MPVOID);
988 if (sSelect != LIT_NONE && sSelect < sItemCount - 1) {
989 // Find self - assume all archivers listed since we are editing
990 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) ; // Find self
991 if (!pat || !pat->next)
992 Runtime_Error(pszSrcFile, __LINE__, "Can't find item %d of %d",
993 sSelect, sItemCount);
994 else {
995 ARC_TYPE *patDad;
996 ARC_TYPE *patChild;
997
998 patDad = pat->prev;
999 patChild = pat->next;
1000 pat->next = patChild->next;
1001 patChild->next = pat;
1002 pat->prev = patChild;
1003 patChild->prev = patDad;
1004 if (patDad) {
1005 patDad->next = patChild;
1006 patChild->prev = patDad;
1007 }
1008 else {
1009 arcsighead = patChild;
1010 patChild->prev = NULL;
1011 }
1012
1013 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT,
1014 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText));
1015 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT,
1016 MPFROM2SHORT(sSelect + 1, 255),
1017 MPFROMP(szPCItemText));
1018 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT,
1019 MPFROMSHORT(sSelect), MPFROMP(szPCItemText));
1020 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT,
1021 MPFROMSHORT(sSelect + 1), MPFROMP(szItemText));
1022 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM,
1023 MPFROMSHORT(sSelect + 1), MPFROMSHORT(TRUE));
1024 arcsigsmodified = TRUE;
1025 }
1026 }
1027 return 0;
1028
1029 case ASEL_PB_REVERT:
1030 // Reload without checking in case changed outside
1031 sSelect =
1032 (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYSELECTION,
1033 MPFROMSHORT(LIT_FIRST), MPVOID);
1034 load_archivers();
1035 fill_listbox(hwnd, TRUE, sSelect);
1036 return 0;
1037
1038 case IDM_HELP:
1039 if (hwndHelp) {
1040 WinSendMsg(hwndHelp, HM_DISPLAY_HELP, MPFROM2SHORT(HELP_EDITARC, 0), // fixme to be HELP_SELARC
1041 MPFROMSHORT(HM_RESOURCEID));
1042 }
1043 }
1044 return 0; // WM_COMMAND
1045
1046 case WM_CONTROL:
1047 if (SHORT1FROMMP(mp1) == ASEL_LISTBOX && SHORT2FROMMP(mp1) == LN_ENTER)
1048 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
1049 return 0;
1050
1051 case WM_CLOSE:
1052 WinDismissDlg(hwnd, FALSE);
1053 return 0;
1054
1055 default:
1056 break;
1057 }
1058 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1059}
1060
1061/*
1062 see archiver.tmp
1063 02-08-96 23:55 1
1064 8 Feb 96 23:55:32 2
1065 8 Feb 96 11:55p 3
1066 96-02-08 23:55:32 4
1067 31-02-98 23:55 5
1068 */
1069
1070BOOL ArcDateTime(CHAR * dt, INT type, CDATE * cdate, CTIME * ctime)
1071{
1072 INT x;
1073 BOOL ret = FALSE;
1074 CHAR *p, *pp, *pd;
1075
1076 if (dt && cdate && ctime) {
1077 memset(cdate, 0, sizeof(CDATE));
1078 memset(ctime, 0, sizeof(CTIME));
1079 if (type) {
1080 p = dt;
1081 while (*p && *p == ' ')
1082 p++;
1083 pd = dt;
1084 switch (type) {
1085 case 1:
1086 cdate->month = atoi(pd);
1087 p = to_delim(pd, "-/.");
1088 if (p) {
1089 p++;
1090 cdate->day = atoi(p);
1091 pd = p;
1092 p = to_delim(pd, "-/.");
1093 if (p) {
1094 p++;
1095 cdate->year = atoi(p);
1096 if (cdate->year > 80 && cdate->year < 1900)
1097 cdate->year += 1900;
1098 else if (cdate->year < 1900)
1099 cdate->year += 2000;
1100 ret = TRUE;
1101 p = strchr(p, ' ');
1102 if (p) {
1103 while (*p && *p == ' ')
1104 p++;
1105 ctime->hours = atoi(p);
1106 p = to_delim(pd, ":.");
1107 if (p) {
1108 p++;
1109 ctime->minutes = atoi(p);
1110 p = to_delim(pd, ":.");
1111 if (p) {
1112 p++;
1113 ctime->seconds = atoi(p);
1114 }
1115 }
1116 }
1117 }
1118 }
1119 break;
1120
1121 case 2:
1122 cdate->day = atoi(p);
1123 p = strchr(p, ' ');
1124 if (p) {
1125 p++;
1126 for (x = 0; x < 12; x++) {
1127 if (!strnicmp(p, GetPString(IDS_JANUARY + x), 3))
1128 break;
1129 }
1130 if (x < 12) {
1131 cdate->month = x;
1132 p = strchr(p, ' ');
1133 if (p) {
1134 p++;
1135 cdate->year = atoi(p);
1136 if (cdate->year > 80 && cdate->year < 1900)
1137 cdate->year += 1900;
1138 else if (cdate->year < 1900)
1139 cdate->year += 2000;
1140 ret = TRUE;
1141 p = strchr(p, ' ');
1142 if (p) {
1143 while (*p && *p == ' ')
1144 p++;
1145 ctime->hours = atoi(p);
1146 p = to_delim(pd, ":.");
1147 if (p) {
1148 p++;
1149 ctime->minutes = atoi(p);
1150 p = to_delim(pd, ":.");
1151 if (p) {
1152 p++;
1153 ctime->seconds = atoi(p);
1154 }
1155 }
1156 }
1157 }
1158 }
1159 }
1160 break;
1161
1162 case 3:
1163 cdate->day = atoi(p);
1164 p = strchr(p, ' ');
1165 if (p) {
1166 p++;
1167 for (x = 0; x < 12; x++) {
1168 if (!strnicmp(p, GetPString(IDS_JANUARY + x), 3))
1169 break;
1170 }
1171 if (x < 12) {
1172 cdate->month = x;
1173 p = strchr(p, ' ');
1174 if (p) {
1175 p++;
1176 cdate->year = atoi(p);
1177 if (cdate->year > 80 && cdate->year < 1900)
1178 cdate->year += 1900;
1179 else if (cdate->year < 1900)
1180 cdate->year += 2000;
1181 ret = TRUE;
1182 p = strchr(p, ' ');
1183 if (p) {
1184 while (*p && *p == ' ')
1185 p++;
1186 ctime->hours = atoi(p);
1187 p = to_delim(pd, ":.");
1188 if (p) {
1189 p++;
1190 pp = p;
1191 ctime->minutes = atoi(p);
1192 p = to_delim(pd, ":.");
1193 if (p) {
1194 p++;
1195 ctime->seconds = atoi(p);
1196 p += 2;
1197 if (toupper(*p) == 'P')
1198 ctime->hours += 12;
1199 }
1200 else {
1201 p = pp;
1202 p += 2;
1203 if (toupper(*p) == 'P')
1204 ctime->hours += 12;
1205 }
1206 }
1207 }
1208 }
1209 }
1210 }
1211 break;
1212
1213 case 4:
1214 cdate->year = atoi(p);
1215 if (cdate->year > 80 && cdate->year < 1900)
1216 cdate->year += 1900;
1217 else if (cdate->year < 1900)
1218 cdate->year += 2000;
1219 p = to_delim(pd, "-/.");
1220 if (p) {
1221 p++;
1222 cdate->month = atoi(p);
1223 pd = p;
1224 p = to_delim(pd, "-/.");
1225 if (p) {
1226 p++;
1227 cdate->day = atoi(p);
1228 ret = TRUE;
1229 p = strchr(p, ' ');
1230 if (p) {
1231 while (*p && *p == ' ')
1232 p++;
1233 ctime->hours = atoi(p);
1234 p = to_delim(pd, ":.");
1235 if (p) {
1236 p++;
1237 ctime->minutes = atoi(p);
1238 p = to_delim(pd, ":.");
1239 if (p) {
1240 p++;
1241 ctime->seconds = atoi(p);
1242 }
1243 }
1244 }
1245 }
1246 }
1247 break;
1248
1249 case 5:
1250 cdate->day = atoi(pd);
1251 p = to_delim(pd, "-/.");
1252 if (p) {
1253 p++;
1254 cdate->month = atoi(p);
1255 pd = p;
1256 p = to_delim(pd, "-/.");
1257 if (p) {
1258 p++;
1259 cdate->year = atoi(p);
1260 if (cdate->year > 80 && cdate->year < 1900)
1261 cdate->year += 1900;
1262 else if (cdate->year < 1900)
1263 cdate->year += 2000;
1264 ret = TRUE;
1265 p = strchr(p, ' ');
1266 if (p) {
1267 while (*p && *p == ' ')
1268 p++;
1269 ctime->hours = atoi(p);
1270 p = to_delim(pd, ":.");
1271 if (p) {
1272 p++;
1273 ctime->minutes = atoi(p);
1274 p = to_delim(pd, ":.");
1275 if (p) {
1276 p++;
1277 ctime->seconds = atoi(p);
1278 }
1279 }
1280 }
1281 }
1282 }
1283 break;
1284
1285 default:
1286 break;
1287 }
1288 }
1289 }
1290 return ret;
1291}
1292
1293#pragma alloc_text(MISC9,quick_find_type,find_type)
1294#pragma alloc_text(AVL,load_archivers, get_line_strip_comments, get_line_strip_white, free_archivers)
1295#pragma alloc_text(FMARCHIVE,SBoxDlgProc,SDlgListboxSubclassProc)
1296#pragma alloc_text(ARCCNRS,ArcDateTime)
Note: See TracBrowser for help on using the repository browser.