source: trunk/dll/avv.c@ 920

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

Cleanup of NormalizeCmdLine moved to pathutil.c

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