source: trunk/dll/avl.c@ 844

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

Reversion of some large file funtions where file sizes is not used

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