source: trunk/dll/avl.c@ 1546

Last change on this file since 1546 was 1546, checked in by Gregg Young, 15 years ago

Add menu item to allow opening of directory container from the collector based on the path of the selected item. (Ticket 362) Add open file button to EAs dialog to allow opening of a new file's eas (Ticket 439). Initial work on populating the help table (It provides F1 help a few more places) (Ticket 95). Some minor code cleanup and help file updates.

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