source: trunk/dll/avv.c@ 858

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

Move #pragma alloc_text to end for OpenWatcom compat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.2 KB
RevLine 
[107]1
2/***********************************************************************
3
4 $Id: avv.c 793 2007-08-21 02:53:38Z gyoung $
5
[122]6 archiver.bb2 editor
7
[107]8 Copyright (c) 1993-98 M. Kimes
[697]9 Copyright (c) 2004, 2007 Steven H.Levine
[107]10
[199]11 31 Jul 04 SHL ArcReviewDlgProc: correct nameis... decodes
12 01 Aug 04 SHL Localize functions
13 01 Aug 04 SHL Rework fixup usage
14 06 Jun 05 SHL Drop unused
[250]15 14 Aug 05 SHL rewrite_archiverbb2: avoid dereferencing null signature
16 14 Aug 05 SHL ArcReviewDlgProc: ensure signature allocated
[420]17 29 May 06 SHL EditArchiverDefinition: rework
[313]18 26 Jun 06 SHL rewrite_archiverbb2: include user comments
[347]19 14 Jul 06 SHL Use Runtime_Error
[404]20 29 Jul 06 SHL Use xfgets
[420]21 30 Jul 06 SHL Avoid warnings when editing new definition
[574]22 22 Mar 07 GKY Use QWL_USER
[697]23 16 Jun 07 SHL Update for OpenWatcom
[793]24 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[107]25
26***********************************************************************/
27
[2]28#define INCL_DOS
29#define INCL_WIN
[250]30#include <os2.h>
[2]31
32#include <stdlib.h>
33#include <stdio.h>
34#include <stdarg.h>
35#include <string.h>
36#include <ctype.h>
37#include <time.h>
[250]38
[2]39#include "fm3dll.h"
40#include "fm3dlg.h"
41#include "version.h"
42#include "fm3str.h"
43
44#pragma data_seg(DATA1)
[347]45
46static PSZ pszSrcFile = __FILE__;
47
[551]48static PSZ checkfile(PSZ file, INT * error);
49static BOOL check_archiver(HWND hwnd, ARC_TYPE * info);
50static INT get_int_from_window(HWND hwnd, USHORT id);
51static LONG get_long_from_window(HWND hwnd, USHORT id);
[122]52static PSZ nonull(PSZ a);
[551]53static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest);
[2]54
[420]55//=== EditArchiverDefinition() Select archiver to edit definition ===
[304]56
[420]57VOID EditArchiverDefinition(HWND hwnd)
[122]58{
[2]59 ARCDUMP ad;
[304]60 ARC_TYPE *pat;
[2]61
[304]62 // Allow multiple edits
63 for (;;) {
[551]64 pat = NULL; // Do not hide dups
[304]65 if (!WinDlgBox(HWND_DESKTOP,
[551]66 hwnd,
67 SBoxDlgProc,
68 FM3ModHandle, ASEL_EDIT_FRAME, (PVOID) & pat) || !pat) {
[304]69 break; // we are done
[2]70 }
[304]71
[551]72 memset(&ad, 0, sizeof(ARCDUMP));
[304]73 ad.info = pat;
74 WinDlgBox(HWND_DESKTOP,
[551]75 hwnd, ArcReviewDlgProc, FM3ModHandle, AD_FRAME, MPFROMP(&ad));
76 } // for
[2]77}
78
[551]79static PSZ free_and_strdup_from_window(HWND hwnd, USHORT id, PSZ pszDest)
[122]80{
[420]81 CHAR sz[256];
[2]82
[420]83 xfree(pszDest);
[551]84 WinQueryDlgItemText(hwnd, id, sizeof(sz), sz);
[347]85 if (*sz)
86 pszDest = xstrdup(sz, pszSrcFile, __LINE__);
87 else
88 pszDest = NULL;
[122]89 return pszDest;
[2]90}
91
[551]92static INT get_int_from_window(HWND hwnd, USHORT id)
[122]93{
[420]94 CHAR s[256];
[2]95
[551]96 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
[2]97 return atoi(s);
98}
99
[551]100static INT get_int2_from_window(HWND hwnd, USHORT id)
[122]101{
[420]102 CHAR s[256];
103 PSZ p;
[2]104
[551]105 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
106 p = strchr(s, ',');
107 if (p)
[2]108 p++;
[420]109 return p ? atoi(p) : 0;
[2]110}
111
[551]112INT get_int3_from_window(HWND hwnd, USHORT id)
[122]113{
[420]114 CHAR s[256];
115 PSZ p;
[2]116
[551]117 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
118 p = strchr(s, ',');
119 if (p) {
[2]120 p++;
[551]121 p = strchr(p, ',');
122 if (p)
[2]123 p++;
124 }
[420]125 return p ? atoi(p) : 0;
[2]126}
127
[551]128INT get_int4_from_window(HWND hwnd, USHORT id)
[122]129{
[420]130 CHAR s[256];
131 PSZ p;
[2]132
[551]133 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
134 p = strchr(s, ',');
[420]135 if (p) {
[2]136 p++;
[551]137 p = strchr(p, ',');
[420]138 if (p) {
[2]139 p++;
[551]140 p = strchr(p, ',');
[420]141 if (p)
[551]142 p++;
[2]143 }
144 }
[420]145 return p ? atoi(p) : 0;
[2]146}
147
[551]148LONG get_long_from_window(HWND hwnd, USHORT id)
[122]149{
[420]150 CHAR s[256];
[2]151
[551]152 WinQueryDlgItemText(hwnd, id, sizeof(s), s);
[2]153 return atol(s);
154}
155
[199]156#pragma alloc_text (AVV2,nonull,rewrite_archiverbb2,checkfile)
[2]157
[122]158// nonull - convert NULL pointer to empty string
[2]159
[122]160static PSZ nonull(PSZ psz)
161{
[551]162 if (!psz)
[122]163 psz = NullStr;
164 return psz;
[2]165}
166
[313]167//=== rewrite_archiverbb2() rewrite archiver.bb2, prompt if arg NULL, merge comments ===
[2]168
[551]169VOID rewrite_archiverbb2(PSZ archiverbb2)
[122]170{
[551]171 FILE *fpNew;
172 FILE *fpOld = NULL;
173 UINT entry_num = 0; // Definition counter
174 UINT input_line_num = 0; // Input file line counter
175 ARC_TYPE *pat;
176 CHAR sz[258];
177 CHAR *psz;
178 BOOL needEntryNumber;
179 BOOL needReload = FALSE; // Because line numbers changed
180 time_t t;
[313]181 struct tm *tm;
[551]182 CHAR ch;
[2]183
[304]184 arcsigsmodified = FALSE;
185
186 if (!arcsighead) {
[2]187 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
[551]188 HWND_DESKTOP,
189 GetPString(IDS_SAYWHATTEXT), GetPString(IDS_NOINFOTOSAVETEXT));
[2]190 return;
191 }
[304]192 // Alert unless file name passed
193 if (!archiverbb2 || !*archiverbb2) {
[2]194 saymsg(MB_ENTER | MB_ICONASTERISK,
[551]195 HWND_DESKTOP,
196 GetPString(IDS_NOTETEXT), GetPString(IDS_SAVEARCBB2TEXT));
[2]197 archiverbb2 = GetPString(IDS_ARCHIVERBB2);
198 }
[313]199
200 /* save a backup */
[551]201 psz = strrchr(archiverbb2, '.');
202 if (psz && !stricmp(psz, ".BB2")) {
203 strcpy(psz, ".BAK");
[2]204 DosDelete(archiverbb2);
[551]205 strcpy(sz, archiverbb2);
206 strcpy(psz, ".BB2");
207 DosMove(archiverbb2, sz);
208 fpOld = fopen(sz, "r"); // OK for file not to exist
[2]209 }
[313]210
[551]211 fpNew = fopen(archiverbb2, "w");
[313]212
213 if (fpNew) {
214
[551]215 fprintf(fpNew, "%u\n", LINES_PER_ARCSIG);
[313]216 t = time(NULL);
217 tm = localtime(&t);
218
219 fprintf(fpNew,
[551]220 ";\n; %s file written by FM/2 v%d.%02d on %u/%u/%u %u:%02u:%02u\n;\n",
221 GetPString(IDS_ARCHIVERBB2),
222 VERMAJOR, VERMINOR,
223 tm->tm_mon + 1, tm->tm_mday, tm->tm_year + 1900,
224 tm->tm_hour, tm->tm_min, tm->tm_sec);
[313]225 // Rewrite header if known
226 if (fpOld && arcsigs_header_lines) {
227 needReload = TRUE;
228 while (input_line_num < arcsigs_header_lines) {
[551]229 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]230 if (!psz)
231 break;
[551]232 input_line_num++;
[313]233 if (input_line_num == 1)
[551]234 continue; // Bypass sig count
235 fputs(sz, fpNew);
[313]236 }
237 }
238 else {
239 // Write default header
[551]240 fputs(GetPString(IDS_ARCHIVERBB2TEXT), fpNew);
[313]241 }
242 pat = arcsighead;
243 while (pat) {
244 needEntryNumber = TRUE;
245 // Rewrite per sig header comments if any exist
[551]246 if (fpOld && pat->comment_line_num) {
247 needReload = TRUE; // fixme to optimize
[313]248 // Definitions reordered - need to rewind
[551]249 if (input_line_num > pat->comment_line_num) {
[313]250 fseek(fpOld, 0, SEEK_SET);
251 input_line_num = 0;
252 }
[551]253 while (input_line_num + 1 < pat->defn_line_num) {
254 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]255 if (!psz)
256 break; // Unexpected EOF
[551]257 input_line_num++;
258 if (input_line_num < pat->comment_line_num)
[313]259 continue;
[551]260 if (needEntryNumber && strnicmp(sz, "; Entry #", 9) == 0) {
261 // Rewrite entry count comment
[313]262 needEntryNumber = FALSE;
[551]263 for (psz = sz + 9; *psz == ' '; psz++) ; // Find non-blank
264 for (; (ch = *psz) >= '0' && ch <= '9'; psz++) ; // Find end of entry#
265 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
266 fputs(psz, fpNew);
267 }
[313]268 else {
[551]269 fputs(sz, fpNew);
[313]270 }
[551]271 }
[313]272 }
273
274 if (needEntryNumber) {
[551]275 fputs(";\n", fpNew);
276 fprintf(fpNew, GetPString(IDS_ENTRYCNTRTEXT), ++entry_num);
277 if (pat->id)
278 fprintf(fpNew, " (%s)", pat->id);
279 fputs("\n;\n", fpNew);
[313]280 }
281
282 fprintf(fpNew,
[551]283 "%s\n%s\n%ld\n%s\n",
284 nonull(pat->id),
285 nonull(pat->ext), pat->file_offset, nonull(pat->list));
[313]286 fprintf(fpNew,
[551]287 "%s\n%s\n%s\n%s\n%s\n%s\n",
288 nonull(pat->extract),
289 nonull(pat->exwdirs),
290 nonull(pat->test),
291 nonull(pat->create),
292 nonull(pat->createwdirs), nonull(pat->createrecurse));
[313]293 fprintf(fpNew,
[551]294 "%s\n%s\n%s\n",
295 nonull(pat->move), nonull(pat->movewdirs), nonull(pat->delete));
[313]296 fprintf(fpNew,
[551]297 "%s\n%s\n%s\n%d\n%d\n%d,%d\n%d\n%d,%lu,%lu,%lu\n",
298 fixup(pat->signature,
299 sz,
300 sizeof(sz),
301 pat->siglen),
302 nonull(pat->startlist),
303 nonull(pat->endlist),
304 pat->osizepos,
305 pat->nsizepos,
306 pat->fdpos,
307 pat->datetype,
308 pat->fdflds,
309 pat->fnpos, pat->nameislast, pat->nameisnext, pat->nameisfirst);
[313]310 pat = pat->next;
[551]311 } // while more sigs
[313]312
313 // Rewrite trailer comments if known
314 if (fpOld && arcsigs_trailer_line_num) {
315 for (;;) {
[551]316 psz = xfgets(sz, sizeof(sz), fpOld, pszSrcFile, __LINE__);
[313]317 if (!psz)
318 break;
[551]319 input_line_num++;
[313]320 if (input_line_num < arcsigs_trailer_line_num)
[551]321 continue; // Bypass sig count
322 fputs(sz, fpNew);
[313]323 }
[2]324 }
[313]325
326 fclose(fpNew);
327
[551]328 } // if fpNew open OK
[313]329
330 if (fpOld)
331 fclose(fpOld);
332
333 if (needReload)
334 load_archivers(); // Resync commend line numbers
[2]335}
336
[551]337static PSZ checkfile(PSZ file, INT * error)
[122]338{
[551]339 CHAR *p, *pp = NULL;
340 INT ret;
[2]341 ULONG apptype;
342
[551]343 if (!file || !*file) {
[2]344 *error = 3;
345 return NULL;
346 }
[551]347 pp = strchr(file, ' ');
348 if (pp)
[2]349 *pp = 0;
350 p = searchpath(file);
[551]351 if (!p || !*p)
[2]352 *error = 1;
353 else {
[697]354 ret = (INT) DosQueryAppType(p, &apptype);
[551]355 if (ret)
[2]356 *error = -1;
357 else {
358 apptype &= (~FAPPTYP_32BIT);
[551]359 if (!apptype ||
360 (apptype == FAPPTYP_NOTWINDOWCOMPAT) ||
361 (apptype == FAPPTYP_WINDOWCOMPAT) ||
362 (apptype & FAPPTYP_BOUND) ||
363 (apptype & FAPPTYP_WINDOWAPI) || (apptype & FAPPTYP_DOS)) {
364 *error = 0;
[2]365 }
366 else
[551]367 *error = 2;
[2]368 }
369 }
[551]370 if (pp)
[2]371 *pp = ' ';
372 return p;
373}
374
[199]375#pragma alloc_text (AVV3,check_archiver,ArcReviewDlgProc)
[2]376
[551]377static BOOL check_archiver(HWND hwnd, ARC_TYPE * info)
[122]378{
[551]379 BOOL noStart = FALSE, noEnd = FALSE, badPos = FALSE;
380 INT badList = 0, badCreate = 0, badExtract = 0;
[122]381 static PSZ aerrors[3];
[2]382
383 aerrors[0] = GetPString(IDS_STARTLISTEMPTYTEXT);
384 aerrors[1] = GetPString(IDS_ENDLISTEMPTYTEXT);
385 aerrors[2] = GetPString(IDS_BOGUSNAMETEXT);
[551]386 if (!info->startlist || !*info->startlist)
[304]387 noStart = TRUE;
[551]388 if (!info->endlist || !*info->endlist)
[304]389 noEnd = TRUE;
[551]390 if (info->fnpos > 50 || info->fnpos < -1)
[304]391 badPos = TRUE;
[551]392 checkfile(info->list, &badList);
393 checkfile(info->create, &badCreate);
394 checkfile(info->extract, &badExtract);
395 if (!noStart && !noEnd && !badPos && !badList && !badCreate && !badExtract)
[304]396 return TRUE; // OK
[420]397 if (!info->id)
398 return FALSE; // Assume new if no id
[2]399 saymsg(MB_ENTER | MB_ICONASTERISK,
[551]400 hwnd,
401 GetPString(IDS_WARNINGSTEXT),
402 GetPString(IDS_AVVCHK1TEXT),
403 noStart ? aerrors[0] : NullStr,
404 noEnd ? aerrors[1] : NullStr,
405 badPos ? aerrors[2] : NullStr,
406 badList == 1 ?
407 GetPString(IDS_AVVCHK2TEXT) :
408 badList == -1 ?
409 GetPString(IDS_AVVCHK3TEXT) :
410 badList == 2 ?
411 GetPString(IDS_AVVCHK4TEXT) :
412 badList == 3 ?
413 GetPString(IDS_AVVCHK5TEXT) :
414 NullStr,
415 badCreate == 1 ?
416 GetPString(IDS_AVVCHK6TEXT) :
417 badCreate == -1 ?
418 GetPString(IDS_AVVCHK7TEXT) :
419 badCreate == 2 ?
420 GetPString(IDS_AVVCHK8TEXT) :
421 badCreate == 3 ?
422 GetPString(IDS_AVVCHK9TEXT) :
423 NullStr,
424 badExtract == 1 ?
425 GetPString(IDS_AVVCHK10TEXT) :
426 badExtract == -1 ?
427 GetPString(IDS_AVVCHK11TEXT) :
428 badExtract == 2 ?
429 GetPString(IDS_AVVCHK12TEXT) :
430 badExtract == 3 ? GetPString(IDS_AVVCHK13TEXT) : NullStr);
431 if (badList || badExtract)
[304]432 return FALSE; // Problems
433 return TRUE; // OK
[2]434}
435
[304]436//=== ArcReviewDlgProc() View/edit single archiver.bb2 setup ===
[2]437
[551]438MRESULT EXPENTRY ArcReviewDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
439 MPARAM mp2)
[122]440{
[551]441 ARCDUMP *admp;
442 CHAR s[256];
443 SHORT sSelect;
[2]444
[551]445 if (msg != WM_INITDLG)
[574]446 admp = (ARCDUMP *) WinQueryWindowPtr(hwnd, QWL_USER);
[2]447
[551]448 switch (msg) {
449 case WM_INITDLG:
450 admp = (ARCDUMP *) mp2;
451 if (!admp || !admp->info) {
452 WinDismissDlg(hwnd, 0);
453 return 0;
454 }
[122]455
[551]456 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[122]457
[551]458 WinSendDlgItemMsg(hwnd, AD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
459 for (sSelect = AD_ID; sSelect < AD_ADDWPATHS + 1; sSelect++) {
460 WinSendDlgItemMsg(hwnd,
461 sSelect,
462 EM_SETTEXTLIMIT,
463 MPFROM2SHORT(sizeof(s) - 1, 0), MPVOID);
464 }
465 if (admp->info->id)
466 WinSetDlgItemText(hwnd, AD_ID, admp->info->id);
467 if (admp->info->ext)
468 WinSetDlgItemText(hwnd, AD_EXT, admp->info->ext);
469 sprintf(s, "%ld", admp->info->file_offset);
470 WinSetDlgItemText(hwnd, AD_SIGPOS, s);
471 if (admp->info->siglen) {
472 WinSetDlgItemText(hwnd,
473 AD_SIG,
474 fixup(admp->info->signature,
475 s, sizeof(s), admp->info->siglen));
476 }
477 if (admp->info->startlist)
478 WinSetDlgItemText(hwnd, AD_STARTLIST, admp->info->startlist);
479 if (admp->info->endlist)
480 WinSetDlgItemText(hwnd, AD_ENDLIST, admp->info->endlist);
481 if (admp->info->list)
482 WinSetDlgItemText(hwnd, AD_LIST, admp->info->list);
483 sprintf(s,
484 "%d,%d,%d,%d",
485 admp->info->fnpos,
486 admp->info->nameislast,
487 admp->info->nameisnext, admp->info->nameisfirst);
488 WinSetDlgItemText(hwnd, AD_FNAMEPOS, s);
489 sprintf(s, "%d", admp->info->osizepos);
490 WinSetDlgItemText(hwnd, AD_OLDSZ, s);
491 sprintf(s, "%d", admp->info->nsizepos);
492 WinSetDlgItemText(hwnd, AD_NEWSZ, s);
493 sprintf(s, "%d,%d", admp->info->fdpos, admp->info->datetype);
494 WinSetDlgItemText(hwnd, AD_DATEPOS, s);
495 sprintf(s, "%d", admp->info->fdflds);
496 WinSetDlgItemText(hwnd, AD_NUMDATEFLDS, s);
497 if (admp->info->extract)
498 WinSetDlgItemText(hwnd, AD_EXTRACT, admp->info->extract);
499 if (admp->info->exwdirs)
500 WinSetDlgItemText(hwnd, AD_WDIRS, admp->info->exwdirs);
501 if (admp->info->test)
502 WinSetDlgItemText(hwnd, AD_TEST, admp->info->test);
503 if (admp->info->create)
504 WinSetDlgItemText(hwnd, AD_ADD, admp->info->create);
505 if (admp->info->move)
506 WinSetDlgItemText(hwnd, AD_MOVE, admp->info->move);
507 if (admp->info->delete)
508 WinSetDlgItemText(hwnd, AD_DELETE, admp->info->delete);
509 if (admp->info->createrecurse)
510 WinSetDlgItemText(hwnd, AD_ADDRECURSE, admp->info->createrecurse);
511 if (admp->info->createwdirs)
512 WinSetDlgItemText(hwnd, AD_ADDWPATHS, admp->info->createwdirs);
513 if (admp->info->movewdirs)
514 WinSetDlgItemText(hwnd, AD_MOVEWPATHS, admp->info->movewdirs);
[122]515
[551]516 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
517 break; // WM_INITDLG
[2]518
[551]519 case UM_SETUP:
520 if (admp->listname && *admp->listname) {
[2]521
[551]522 FILE *fp = fopen(admp->listname, "r");
523
524 if (!fp) {
525 WinSendDlgItemMsg(hwnd,
526 AD_LISTBOX,
527 LM_INSERTITEM,
528 MPFROM2SHORT(LIT_END, 0),
529 MPFROMP(GetPString(IDS_CANTOPENFILETEXT)));
[2]530 }
531 else {
[551]532 while (!feof(fp)) {
533 if (!xfgets(s, sizeof(s), fp, pszSrcFile, __LINE__))
534 break;
535 stripcr(s);
536 WinSendDlgItemMsg(hwnd,
537 AD_LISTBOX,
538 LM_INSERTITEM,
539 MPFROM2SHORT(LIT_END, 0), MPFROMP(s));
540 }
541 fclose(fp);
[2]542 }
[551]543 }
544 else {
545 WinSendDlgItemMsg(hwnd,
546 AD_LISTBOX,
547 LM_INSERTITEM,
548 MPFROM2SHORT(LIT_END, 0),
549 MPFROMP(GetPString(IDS_NOTAPPLICABLETEXT)));
550 }
551 check_archiver(hwnd, admp->info);
552 return 0;
[2]553
[551]554 case WM_ADJUSTWINDOWPOS:
555 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
556 break;
[2]557
[551]558 case UM_SETDIR:
559 PaintRecessedWindow(WinWindowFromID(hwnd, AD_HELP), (HPS) 0, FALSE, TRUE);
560 return 0;
[2]561
[551]562 case WM_CONTROL:
563 switch (SHORT1FROMMP(mp1)) {
564 case AD_LISTBOX:
565 switch (SHORT2FROMMP(mp1)) {
566 case LN_ENTER:
567 for (sSelect = 0; sSelect < 10; sSelect++)
568 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, NullStr);
569 if (!admp->listname)
570 Runtime_Error(pszSrcFile, __LINE__, "no listname");
571 else {
572 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
573 AD_LISTBOX,
574 LM_QUERYSELECTION,
575 MPVOID, MPVOID);
576 WinSendDlgItemMsg(hwnd,
577 AD_LISTBOX,
578 LM_QUERYITEMTEXT,
579 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
580 if (!*s)
581 Runtime_Error(pszSrcFile, __LINE__, "no text");
582 else {
583 PSZ p;
584 PSZ pp;
[2]585
[551]586 p = s;
587 for (sSelect = 0; sSelect < 10; sSelect++) {
588 pp = p;
589 while (*pp == ' ' || *pp == '\t')
590 pp++;
591 if (!*pp)
592 break;
593 p = pp;
594 while (*p && (*p != ' ' && *p != '\t'))
595 p++;
596 if (*p)
597 *p++ = 0;
598 WinSetDlgItemText(hwnd, AD_FLD1 + sSelect, pp);
599 }
600 }
601 }
602 break;
[2]603
[551]604 case LN_KILLFOCUS:
605 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
606 break;
[2]607
[551]608 case LN_SETFOCUS:
609 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_TEXTARCPRODUCEDTEXT));
610 break;
611 }
612 break;
[2]613
[551]614 case AD_ID:
615 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
616 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
617 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
618 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADIDTEXT));
619 break;
[2]620
[551]621 case AD_ADD:
622 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
623 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
624 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
625 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDTEXT));
626 break;
[2]627
[551]628 case AD_MOVE:
629 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
630 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
631 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
632 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVETEXT));
633 break;
[2]634
[551]635 case AD_EXT:
636 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
637 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
638 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
639 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTTEXT));
640 break;
[2]641
[551]642 case AD_EXTRACT:
643 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
644 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
645 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
646 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADEXTRACTTEXT));
647 break;
[2]648
[551]649 case AD_WDIRS:
650 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
651 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
652 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
653 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADWDIRSTEXT));
654 break;
[2]655
[551]656 case AD_SIG:
657 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
658 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
659 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
660 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGTEXT));
661 break;
[2]662
[551]663 case AD_LIST:
664 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
665 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
666 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
667 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADLISTTEXT));
668 break;
[2]669
[551]670 case AD_TEST:
671 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
672 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
673 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
674 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADTESTTEXT));
675 break;
[2]676
[551]677 case AD_ADDWPATHS:
678 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
679 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
680 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
681 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDWPATHSTEXT));
682 break;
[2]683
[551]684 case AD_MOVEWPATHS:
685 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
686 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
687 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
688 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADMOVEWPATHSTEXT));
689 break;
[2]690
[551]691 case AD_ADDRECURSE:
692 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
693 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
694 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
695 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADADDRECURSETEXT));
696 break;
[2]697
[551]698 case AD_DELETE:
699 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
700 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
701 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
702 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDELETETEXT));
703 break;
[2]704
[551]705 case AD_SIGPOS:
706 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
707 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
708 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
709 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSIGPOSTEXT));
710 break;
[2]711
[551]712 case AD_FNAMEPOS:
713 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
714 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
715 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
716 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADFNAMEPOSTEXT));
717 break;
[2]718
[551]719 case AD_OLDSZ:
720 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
721 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
722 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
723 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADOLDSZTEXT));
724 break;
[2]725
[551]726 case AD_NUMDATEFLDS:
727 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
728 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
729 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
730 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNUMDATEFLDSTEXT));
731 break;
[2]732
[551]733 case AD_DATEPOS:
734 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
735 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
736 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
737 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADDATEPOSTEXT));
738 break;
[2]739
[551]740 case AD_NEWSZ:
741 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
742 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
743 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
744 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADNEWSZTEXT));
745 break;
[2]746
[551]747 case AD_STARTLIST:
748 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
749 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
750 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
751 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADSTARTLISTTEXT));
752 break;
[2]753
[551]754 case AD_ENDLIST:
755 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
756 WinSetDlgItemText(hwnd, AD_HELP, NullStr);
757 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
758 WinSetDlgItemText(hwnd, AD_HELP, GetPString(IDS_ADENDLISTTEXT));
759 break;
[2]760
[551]761 }
762 return 0;
[2]763
[551]764 case WM_COMMAND:
765 switch (SHORT1FROMMP(mp1)) {
766 case AD_SEEEXTRACTOR:
767 case AD_SEEADDER:
768 {
769 static CHAR tempargs[1026];
[2]770
[551]771 *tempargs = 0;
772 if (SHORT1FROMMP(mp1) == AD_SEEADDER)
773 WinQueryDlgItemText(hwnd, AD_ADD, 255, tempargs);
774 else
775 WinQueryDlgItemText(hwnd, AD_EXTRACT, 255, tempargs);
776 if (!*tempargs)
777 saymsg(MB_CANCEL,
778 hwnd,
779 GetPString(IDS_BZZZTTEXT), GetPString(IDS_NEEDENTRYTEXT));
780 else {
[2]781
[551]782 PSZ p;
[2]783
[551]784 lstrip(tempargs);
785 p = strchr(tempargs, ' ');
786 if (p)
787 *p = 0;
788 {
789 EXECARGS ex;
[2]790
[551]791 ex.flags = SEPARATEKEEP | WINDOWED | MAXIMIZED;
792 ex.commandline = tempargs;
793 *ex.path = 0;
794 *ex.environment = 0;
795 if (WinDlgBox(HWND_DESKTOP,
796 hwnd,
797 CmdLineDlgProc, FM3ModHandle, EXEC_FRAME, &ex) == 1)
798 runemf2(ex.flags,
799 hwnd,
800 NULL,
801 (*ex.environment) ? ex.environment : NULL,
802 "%s", tempargs);
803 }
804 }
805 }
806 return 0;
[2]807
[551]808 case DID_OK:
809 // fixme to avoid creating empty strings for startlist and endlist
810 admp->info->startlist =
811 free_and_strdup_from_window(hwnd, AD_STARTLIST,
812 admp->info->startlist);
813 admp->info->endlist =
814 free_and_strdup_from_window(hwnd, AD_ENDLIST, admp->info->endlist);
815 admp->info->id =
816 free_and_strdup_from_window(hwnd, AD_ID, admp->info->id);
817 admp->info->create =
818 free_and_strdup_from_window(hwnd, AD_ADD, admp->info->create);
819 admp->info->createwdirs =
820 free_and_strdup_from_window(hwnd, AD_ADDWPATHS,
821 admp->info->createwdirs);
822 admp->info->createrecurse =
823 free_and_strdup_from_window(hwnd, AD_ADDRECURSE,
824 admp->info->createrecurse);
825 admp->info->movewdirs =
826 free_and_strdup_from_window(hwnd, AD_MOVEWPATHS,
827 admp->info->movewdirs);
828 admp->info->move =
829 free_and_strdup_from_window(hwnd, AD_MOVE, admp->info->move);
830 admp->info->delete =
831 free_and_strdup_from_window(hwnd, AD_DELETE, admp->info->delete);
832 admp->info->test =
833 free_and_strdup_from_window(hwnd, AD_TEST, admp->info->test);
834 admp->info->extract =
835 free_and_strdup_from_window(hwnd, AD_EXTRACT, admp->info->extract);
836 admp->info->exwdirs =
837 free_and_strdup_from_window(hwnd, AD_WDIRS, admp->info->exwdirs);
838 admp->info->ext =
839 free_and_strdup_from_window(hwnd, AD_EXT, admp->info->ext);
840 admp->info->signature =
841 free_and_strdup_from_window(hwnd, AD_SIG, admp->info->signature);
842 admp->info->siglen = literal(admp->info->signature);
843 admp->info->list = free_and_strdup_from_window(hwnd,
844 AD_LIST,
845 admp->info->list);
846 admp->info->file_offset = get_long_from_window(hwnd, AD_SIGPOS);
847 admp->info->osizepos = get_int_from_window(hwnd, AD_OLDSZ);
848 admp->info->nsizepos = get_int_from_window(hwnd, AD_NEWSZ);
849 admp->info->fdpos = get_int_from_window(hwnd, AD_DATEPOS);
850 admp->info->datetype = get_int2_from_window(hwnd, AD_DATEPOS);
851 admp->info->fdflds = get_int_from_window(hwnd, AD_NUMDATEFLDS);
852 admp->info->fnpos = get_int_from_window(hwnd, AD_FNAMEPOS);
853 admp->info->nameislast =
854 (get_int2_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
855 admp->info->nameisnext =
856 (get_int3_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
857 admp->info->nameisfirst =
858 (get_int4_from_window(hwnd, AD_FNAMEPOS)) ? TRUE : FALSE;
859 {
860 INT ok = check_archiver(hwnd, admp->info);
[2]861
[551]862 if (saymsg(MB_YESNO,
863 hwnd,
864 GetPString(IDS_ADCHANGESINMEMTEXT),
865 GetPString(IDS_ADREWRITETEXT),
866 !ok ? GetPString(IDS_NOTRECOMMENDTEXT) : NullStr) ==
867 MBID_YES) {
[2]868
[551]869 PSZ ab2;
[2]870
[551]871 ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without alerting
872 rewrite_archiverbb2(ab2);
873 }
874 }
875 WinDismissDlg(hwnd, TRUE);
876 return 0;
[2]877
[551]878 case IDM_HELP:
879 if (hwndHelp)
880 WinSendMsg(hwndHelp,
881 HM_DISPLAY_HELP,
882 MPFROM2SHORT(HELP_EDITARC, 0), MPFROMSHORT(HM_RESOURCEID));
883 break;
[2]884
[551]885 case DID_CANCEL:
886 WinDismissDlg(hwnd, FALSE);
887 return 0;
888
889 case AD_TOSTART:
890 if (!admp->listname)
891 Runtime_Error(pszSrcFile, __LINE__, "no listname");
892 else {
893 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
894 AD_LISTBOX,
895 LM_QUERYSELECTION,
896 MPVOID, MPVOID);
897 WinSendDlgItemMsg(hwnd,
898 AD_LISTBOX,
899 LM_QUERYITEMTEXT,
900 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
901 if (*s)
902 WinSetDlgItemText(hwnd, AD_STARTLIST, s);
903 else
904 BooBoo:
905 saymsg(MB_ENTER,
906 hwnd,
907 GetPString(IDS_OOPSTEXT),
908 GetPString(IDS_SELECTFROMLISTTEXT));
[2]909 }
910 return 0;
[551]911
912 case AD_TOEND:
913 if (!admp->listname)
914 Runtime_Error(pszSrcFile, __LINE__, "no listname");
915 else {
916 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
917 AD_LISTBOX,
918 LM_QUERYSELECTION,
919 MPVOID, MPVOID);
920 WinSendDlgItemMsg(hwnd,
921 AD_LISTBOX,
922 LM_QUERYITEMTEXT,
923 MPFROM2SHORT(sSelect, 255), MPFROMP(s));
924 if (*s)
925 WinSetDlgItemText(hwnd, AD_ENDLIST, s);
926 else
927 goto BooBoo;
928 }
929 return 0;
930 }
931 return 0;
[2]932 }
[551]933 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]934}
[793]935
936#pragma alloc_text(AVV,EditArchiverDefinition,free_and_strdup_from_window)
937#pragma alloc_text(AVV,get_int_from_window,get_int2_from_window)
938#pragma alloc_text(AVV,get_long_from_window,get_int3_from_window)
939#pragma alloc_text(AVV,get_int4_from_window)
Note: See TracBrowser for help on using the repository browser.