macunzip.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. /*
  2. Copyright (c) 1990-2006 Info-ZIP. All rights reserved.
  3. See the accompanying file LICENSE, version 2000-Apr-09 or later
  4. (the contents of which are also included in unzip.h) for terms of use.
  5. If, for some reason, all these files are missing, the Info-ZIP license
  6. also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
  7. */
  8. /*---------------------------------------------------------------------------
  9. macunzip.c
  10. Main-function for use with the standalone Unzip App.
  11. ---------------------------------------------------------------------------*/
  12. /*****************************************************************************/
  13. /* Includes */
  14. /*****************************************************************************/
  15. #define UNZIP_INTERNAL
  16. #include "unzip.h"
  17. #include "unzvers.h"
  18. #include "pathname.h"
  19. #include "helpers.h"
  20. #include <Traps.h>
  21. /*****************************************************************************/
  22. /* Macros, typedefs */
  23. /*****************************************************************************/
  24. #define aboutAlert 128
  25. #define selectDialog 129
  26. #define okItem 1
  27. #define cancelItem 2
  28. #define editItem 3
  29. #define staticItem 4
  30. #define unzipMenuBar 128
  31. #define appleMenu 128
  32. #define aboutItem 1
  33. #define fileMenu 129
  34. #define extractItem 1
  35. #define infoItem 2
  36. #define listItem 3
  37. #define testItem 4
  38. #define commentItem 6
  39. #define freshenItem 8
  40. #define updateItem 9
  41. #define quitItem 11
  42. #define editMenu 130
  43. #define cutItem 1
  44. #define copyItem 2
  45. #define pasteItem 3
  46. #define modifierMenu 131
  47. #define excludeItem 1
  48. #define selectItem 2
  49. #define quietItem 9
  50. #define verboseItem 10
  51. #define screenMenu 132
  52. #define pauseItem 1
  53. #define scrollItem 2
  54. #define extractMenu 133
  55. #define screenItem 3
  56. #define junkItem 5
  57. #define caseMenu 134
  58. #define insensitiveItem 1
  59. #define lowercaseItem 2
  60. #define convertMenu 135
  61. #define autoItem 1
  62. #define binaryItem 2
  63. #define textItem 3
  64. #define overwriteMenu 136
  65. #define alwaysItem 1
  66. #define neverItem 2
  67. #define promptItem 3
  68. #define infoMenu 137
  69. #define prtCommentItem 2
  70. #define prtHeaderItem 3
  71. #define prtTotalsItem 4
  72. #define formatMenu 138
  73. #define filenameItem 1
  74. #define longItem 2
  75. #define mediumItem 3
  76. #define shortItem 4
  77. #define allFlags 0x000FFFFF
  78. #define quietFlag 0x00000001
  79. #define verboseFlag 0x00000002
  80. #define pauseFlag 0x00080000
  81. #define scrollFlag 0x00040000
  82. #define screenFlag 0x00000004
  83. #define junkFlag 0x00000008
  84. #define insensitiveFlag 0x00000010
  85. #define lowercaseFlag 0x00000020
  86. #define autoFlag 0x00000040
  87. #define textFlag 0x00000080
  88. #define neverFlag 0x00000100
  89. #define overwriteFlag 0x00000200
  90. #define prtCommentFlag 0x00000400
  91. #define prtHeaderFlag 0x00000800
  92. #define prtTotalsFlag 0x00001000
  93. #define filenameFlag 0x00002000
  94. #define longFlag 0x00004000
  95. #define mediumFlag 0x00008000
  96. #define shortFlag 0x00010000
  97. #define extractMask 0x000003FD
  98. #define infoMask 0x0001FE02
  99. #define listMask 0x00000001
  100. #define testMask 0x00000001
  101. #define commentMask 0x00000000
  102. #define freshenMask 0x000003FD
  103. #define updateMask 0x000003FD
  104. /*****************************************************************************/
  105. /* Global Vars */
  106. /*****************************************************************************/
  107. char UnzipVersion[32], ZipinfoVersion[32];
  108. long modifiers, modifierMask;
  109. EventRecord myevent;
  110. MenuHandle appleHandle, modifierHandle, screenHandle, extractHandle;
  111. MenuHandle caseHandle, convertHandle, overwriteHandle, infoHandle;
  112. MenuHandle formatHandle;
  113. Handle menubar, itemHandle;
  114. short itemType;
  115. Rect itemRect;
  116. char command;
  117. extern char fileList[256];
  118. Boolean stop;
  119. SysEnvRec sysRec;
  120. /*****************************************************************************/
  121. /* Prototypes */
  122. /*****************************************************************************/
  123. static void domousedown(EventRecord *myevent);
  124. /*****************************************************************************/
  125. /* Functions */
  126. /*****************************************************************************/
  127. static Boolean TrapAvailable(machineType, trapNumber, trapType)
  128. short machineType;
  129. short trapNumber;
  130. TrapType trapType;
  131. {
  132. if (machineType < 0)
  133. return (false);
  134. if ((trapType == ToolTrap) &&
  135. (machineType > envMachUnknown) &&
  136. (machineType < envMacII)) {
  137. if ((trapNumber &= 0x03FF) > 0x01FF)
  138. trapNumber = _Unimplemented;
  139. }
  140. return (NGetTrapAddress(trapNumber, trapType) !=
  141. #ifdef __MWERKS__
  142. NGetTrapAddress(_Unimplemented, trapType));
  143. #else
  144. GetTrapAddress(_Unimplemented));
  145. #endif
  146. }
  147. /*
  148. ** excute menu-command
  149. **
  150. */
  151. static void domenu(menucommand) long menucommand;
  152. {
  153. short themenu, theitem;
  154. DialogPtr thedialog;
  155. Str255 name;
  156. long check;
  157. themenu = HiWord(menucommand);
  158. theitem = LoWord(menucommand);
  159. switch (themenu) {
  160. case appleMenu:
  161. if (theitem == aboutItem) {
  162. ParamText((StringPtr)UnzipVersion, (StringPtr)ZipinfoVersion, nil, nil);
  163. Alert(aboutAlert, nil);
  164. } else {
  165. GetMenuItemText(appleHandle, theitem, name);
  166. theitem = OpenDeskAcc(name);
  167. }
  168. break;
  169. case fileMenu:
  170. switch (theitem) {
  171. case extractItem:
  172. if (modifiers & screenFlag)
  173. command = 'c';
  174. else
  175. command = 'x';
  176. modifierMask = extractMask;
  177. break;
  178. case infoItem:
  179. command = 'Z';
  180. modifierMask = infoMask;
  181. break;
  182. case listItem:
  183. if (modifiers & verboseFlag)
  184. command = 'v';
  185. else
  186. command = 'l';
  187. modifierMask = listMask;
  188. break;
  189. case testItem:
  190. command = 't';
  191. modifierMask = testMask;
  192. break;
  193. case commentItem:
  194. command = 'z';
  195. modifierMask = commentMask;
  196. break;
  197. case freshenItem:
  198. command = 'f';
  199. modifierMask = freshenMask;
  200. break;
  201. case updateItem:
  202. command = 'u';
  203. modifierMask = updateMask;
  204. break;
  205. case quitItem:
  206. stop = true;
  207. break;
  208. default:
  209. break;
  210. }
  211. break;
  212. case editMenu:
  213. break;
  214. case modifierMenu:
  215. switch (theitem) {
  216. case excludeItem:
  217. check = -1;
  218. break;
  219. case selectItem:
  220. thedialog = GetNewDialog(selectDialog, nil, (WindowPtr)(-1));
  221. SetPort(thedialog);
  222. do
  223. ModalDialog(nil, &theitem);
  224. while ((theitem != okItem) && (theitem != cancelItem));
  225. if (theitem == okItem) {
  226. GetDialogItem(thedialog, editItem, &itemType, &itemHandle,
  227. &itemRect);
  228. GetDialogItemText(itemHandle, (StringPtr)&fileList);
  229. p2cstr((StringPtr)fileList);
  230. }
  231. DisposeDialog(thedialog);
  232. check = -1;
  233. break;
  234. case quietItem:
  235. check = (modifiers ^= quietFlag) & quietFlag;
  236. break;
  237. case verboseItem:
  238. check = (modifiers ^= verboseFlag) & verboseFlag;
  239. break;
  240. default:
  241. break;
  242. }
  243. if (check == 0)
  244. CheckItem(modifierHandle, theitem, false);
  245. else if (check > 0)
  246. CheckItem(modifierHandle, theitem, true);
  247. break;
  248. case screenMenu:
  249. switch (theitem) {
  250. case pauseItem:
  251. check = (modifiers ^= pauseFlag) & pauseFlag;
  252. screenControl("p", check);
  253. break;
  254. case scrollItem:
  255. check = (modifiers ^= scrollFlag) & scrollFlag;
  256. screenControl("s", check);
  257. break;
  258. default:
  259. break;
  260. }
  261. if (check == 0)
  262. CheckItem(screenHandle, theitem, false);
  263. else if (check > 0)
  264. CheckItem(screenHandle, theitem, true);
  265. break;
  266. case extractMenu:
  267. switch (theitem) {
  268. case screenItem:
  269. check = (modifiers ^= screenFlag) & screenFlag;
  270. break;
  271. case junkItem:
  272. check = (modifiers ^= junkFlag) & junkFlag;
  273. break;
  274. default:
  275. break;
  276. }
  277. if (check == 0)
  278. CheckItem(extractHandle, theitem, false);
  279. else if (check > 0)
  280. CheckItem(extractHandle, theitem, true);
  281. break;
  282. case caseMenu:
  283. switch (theitem) {
  284. case insensitiveItem:
  285. check = (modifiers ^= insensitiveFlag) & insensitiveFlag;
  286. break;
  287. case lowercaseItem:
  288. check = (modifiers ^= lowercaseFlag) & lowercaseFlag;
  289. break;
  290. default:
  291. break;
  292. }
  293. if (check == 0)
  294. CheckItem(caseHandle, theitem, false);
  295. else if (check > 0)
  296. CheckItem(caseHandle, theitem, true);
  297. break;
  298. case convertMenu:
  299. switch (theitem) {
  300. case autoItem:
  301. CheckItem(convertHandle, autoItem, true);
  302. CheckItem(convertHandle, binaryItem, false);
  303. CheckItem(convertHandle, textItem, false);
  304. modifiers &= (allFlags ^ textFlag);
  305. modifiers |= autoFlag;
  306. break;
  307. case binaryItem:
  308. CheckItem(convertHandle, autoItem, false);
  309. CheckItem(convertHandle, binaryItem, true);
  310. CheckItem(convertHandle, textItem, false);
  311. modifiers &= (allFlags ^ (autoFlag | textFlag));
  312. break;
  313. case textItem:
  314. CheckItem(convertHandle, autoItem, false);
  315. CheckItem(convertHandle, binaryItem, false);
  316. CheckItem(convertHandle, textItem, true);
  317. modifiers &= (allFlags ^ autoFlag);
  318. modifiers |= textFlag;
  319. break;
  320. default:
  321. break;
  322. }
  323. break;
  324. case overwriteMenu:
  325. switch (theitem) {
  326. case alwaysItem:
  327. CheckItem(overwriteHandle, alwaysItem, true);
  328. CheckItem(overwriteHandle, neverItem, false);
  329. CheckItem(overwriteHandle, promptItem, false);
  330. modifiers &= (allFlags ^ neverFlag);
  331. modifiers |= overwriteFlag;
  332. break;
  333. case neverItem:
  334. CheckItem(overwriteHandle, alwaysItem, false);
  335. CheckItem(overwriteHandle, neverItem, true);
  336. CheckItem(overwriteHandle, promptItem, false);
  337. modifiers &= (allFlags ^ overwriteFlag);
  338. modifiers |= neverFlag;
  339. break;
  340. case promptItem:
  341. CheckItem(overwriteHandle, alwaysItem, false);
  342. CheckItem(overwriteHandle, neverItem, false);
  343. CheckItem(overwriteHandle, promptItem, true);
  344. modifiers &= (allFlags ^ (neverFlag | overwriteFlag));
  345. break;
  346. default:
  347. break;
  348. }
  349. break;
  350. case infoMenu:
  351. switch (theitem) {
  352. case prtCommentItem:
  353. check = (modifiers ^= prtCommentFlag) & prtCommentFlag;
  354. break;
  355. case prtHeaderItem:
  356. check = (modifiers ^= prtHeaderFlag) & prtHeaderFlag;
  357. break;
  358. case prtTotalsItem:
  359. check = (modifiers ^= prtTotalsFlag) & prtTotalsFlag;
  360. break;
  361. default:
  362. break;
  363. }
  364. if (check == 0)
  365. CheckItem(infoHandle, theitem, false);
  366. else if (check > 0)
  367. CheckItem(infoHandle, theitem, true);
  368. break;
  369. case formatMenu:
  370. switch (theitem) {
  371. case filenameItem:
  372. CheckItem(formatHandle, filenameItem, true);
  373. CheckItem(formatHandle, longItem, false);
  374. CheckItem(formatHandle, mediumItem, false);
  375. CheckItem(formatHandle, shortItem, false);
  376. modifiers &= (allFlags ^ (longFlag | mediumFlag | shortFlag));
  377. modifiers |= filenameFlag;
  378. break;
  379. case longItem:
  380. CheckItem(formatHandle, filenameItem, false);
  381. CheckItem(formatHandle, longItem, true);
  382. CheckItem(formatHandle, mediumItem, false);
  383. CheckItem(formatHandle, shortItem, false);
  384. modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag));
  385. modifiers |= longFlag;
  386. break;
  387. case mediumItem:
  388. CheckItem(formatHandle, filenameItem, false);
  389. CheckItem(formatHandle, longItem, false);
  390. CheckItem(formatHandle, mediumItem, true);
  391. CheckItem(formatHandle, shortItem, false);
  392. modifiers &= (allFlags ^ (filenameFlag | longFlag | shortFlag));
  393. modifiers |= mediumFlag;
  394. break;
  395. case shortItem:
  396. CheckItem(formatHandle, filenameItem, false);
  397. CheckItem(formatHandle, longItem, false);
  398. CheckItem(formatHandle, mediumItem, false);
  399. CheckItem(formatHandle, shortItem, true);
  400. modifiers &= (allFlags ^ (filenameFlag | longFlag | mediumFlag));
  401. modifiers |= shortFlag;
  402. break;
  403. default:
  404. break;
  405. }
  406. break;
  407. default:
  408. break;
  409. }
  410. HiliteMenu(0);
  411. return;
  412. }
  413. /*
  414. ** work with shortcuts
  415. **
  416. */
  417. static void dokey(myevent) EventRecord *myevent;
  418. {
  419. char code;
  420. code = (char)(myevent->message & charCodeMask);
  421. if (myevent->modifiers & cmdKey) {
  422. if (myevent->what != autoKey) {
  423. domenu(MenuKey(code));
  424. }
  425. }
  426. return;
  427. }
  428. /*
  429. ** work with mouse-events
  430. **
  431. */
  432. static void domousedown(EventRecord *myevent)
  433. {
  434. WindowPtr whichwindow;
  435. long code;
  436. code = FindWindow(myevent->where, &whichwindow);
  437. switch (code) {
  438. case inSysWindow:
  439. SystemClick(myevent, whichwindow);
  440. break;
  441. case inMenuBar:
  442. domenu(MenuSelect(myevent->where));
  443. break;
  444. }
  445. return;
  446. }
  447. /*
  448. ** Do a little event-handling and let the user stop
  449. ** th current action
  450. */
  451. void UserStop(void)
  452. {
  453. EventRecord theEvent;
  454. if ( WaitNextEvent( everyEvent, &theEvent, 0, nil )) {
  455. switch (theEvent.what) {
  456. case mouseDown:
  457. domousedown( &theEvent );
  458. break;
  459. case autoKey:
  460. case keyDown:
  461. if ((theEvent.modifiers & cmdKey) &&
  462. ((theEvent.message & charCodeMask) == '.'))
  463. {
  464. printf("\n\n <- User Canceled -> \n");
  465. exit(1); /* setjmp() must be already called */
  466. }
  467. return;
  468. } /* switch (theEvent.what) */
  469. } /* if ( WaitNextEvent(... */
  470. }
  471. /*
  472. ** The Standalone Unzip starts here
  473. **
  474. */
  475. int main(argc, argv) int argc; char *argv[];
  476. {
  477. Uz_Globs saveGlobals;
  478. Boolean haveEvent, useWNE;
  479. short markChar;
  480. char *ArchivePath, *ExtractPath;
  481. OSErr err;
  482. FlushEvents(everyEvent, 0);
  483. InitGraf(&qd.thePort);
  484. InitFonts();
  485. InitWindows();
  486. InitMenus();
  487. TEInit();
  488. InitDialogs(nil);
  489. InitCursor();
  490. CONSTRUCTGLOBALS();
  491. sprintf(UnzipVersion, "%d.%d%d%s of %s", UZ_MAJORVER, UZ_MINORVER,
  492. UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE);
  493. sprintf(ZipinfoVersion, "%d.%d%d%s of %s", ZI_MAJORVER, ZI_MINORVER,
  494. UZ_PATCHLEVEL, UZ_BETALEVEL, UZ_VERSION_DATE);
  495. c2pstr(UnzipVersion);
  496. c2pstr(ZipinfoVersion);
  497. SysEnvirons(1, &sysRec);
  498. useWNE = TrapAvailable(sysRec.machineType, _WaitNextEvent, ToolTrap);
  499. SetMenuBar(menubar = GetNewMBar(unzipMenuBar));
  500. DisposeHandle(menubar);
  501. InsertMenu(GetMenu(screenMenu), -1);
  502. InsertMenu(GetMenu(extractMenu), -1);
  503. InsertMenu(GetMenu(caseMenu), -1);
  504. InsertMenu(GetMenu(convertMenu), -1);
  505. InsertMenu(GetMenu(overwriteMenu), -1);
  506. InsertMenu(GetMenu(infoMenu), -1);
  507. InsertMenu(GetMenu(formatMenu), -1);
  508. AppendResMenu(appleHandle = GetMenuHandle(appleMenu), 'DRVR');
  509. modifierHandle = GetMenuHandle(modifierMenu);
  510. screenHandle = GetMenuHandle(screenMenu);
  511. extractHandle = GetMenuHandle(extractMenu);
  512. caseHandle = GetMenuHandle(caseMenu);
  513. convertHandle = GetMenuHandle(convertMenu);
  514. overwriteHandle = GetMenuHandle(overwriteMenu);
  515. infoHandle = GetMenuHandle(infoMenu);
  516. formatHandle = GetMenuHandle(formatMenu);
  517. DrawMenuBar();
  518. screenOpen("Unzip");
  519. modifiers = 0;
  520. GetItemMark(modifierHandle, quietItem, &markChar);
  521. if (markChar) modifiers ^= quietFlag;
  522. GetItemMark(modifierHandle, verboseItem, &markChar);
  523. if (markChar) modifiers ^= verboseFlag;
  524. GetItemMark(screenHandle, pauseItem, &markChar);
  525. if (markChar) modifiers ^= pauseFlag;
  526. screenControl("p", markChar);
  527. GetItemMark(screenHandle, scrollItem, &markChar);
  528. if (markChar) modifiers ^= scrollFlag;
  529. screenControl("s", markChar);
  530. GetItemMark(extractHandle, screenItem, &markChar);
  531. if (markChar) modifiers ^= screenFlag;
  532. GetItemMark(extractHandle, junkItem, &markChar);
  533. if (markChar) modifiers ^= junkFlag;
  534. GetItemMark(caseHandle, insensitiveItem, &markChar);
  535. if (markChar) modifiers ^= insensitiveFlag;
  536. GetItemMark(caseHandle, lowercaseItem, &markChar);
  537. if (markChar) modifiers ^= lowercaseFlag;
  538. GetItemMark(convertHandle, autoItem, &markChar);
  539. if (markChar) modifiers ^= autoFlag;
  540. GetItemMark(convertHandle, textItem, &markChar);
  541. if (markChar) modifiers ^= textFlag;
  542. if ((modifiers & (autoFlag | textFlag)) == (autoFlag | textFlag)) {
  543. CheckItem(convertHandle, textItem, false);
  544. modifiers &= (allFlags ^ textFlag);
  545. } else if (modifiers & (autoFlag | textFlag))
  546. CheckItem(convertHandle, binaryItem, false);
  547. else
  548. CheckItem(convertHandle, binaryItem, true);
  549. GetItemMark(overwriteHandle, alwaysItem, &markChar);
  550. if (markChar) modifiers ^= overwriteFlag;
  551. GetItemMark(overwriteHandle, neverItem, &markChar);
  552. if (markChar) modifiers ^= neverFlag;
  553. if ((modifiers & (neverFlag | overwriteFlag)) == (neverFlag | overwriteFlag)) {
  554. CheckItem(overwriteHandle, alwaysItem, false);
  555. CheckItem(overwriteHandle, neverItem, false);
  556. CheckItem(overwriteHandle, promptItem, true);
  557. modifiers &= (allFlags ^ (neverFlag | overwriteFlag));
  558. } else if (modifiers & (neverFlag | overwriteFlag))
  559. CheckItem(overwriteHandle, promptItem, false);
  560. else
  561. CheckItem(overwriteHandle, promptItem, true);
  562. GetItemMark(infoHandle, prtCommentItem, &markChar);
  563. if (markChar) modifiers ^= prtCommentFlag;
  564. GetItemMark(infoHandle, prtHeaderItem, &markChar);
  565. if (markChar) modifiers ^= prtHeaderFlag;
  566. GetItemMark(infoHandle, prtTotalsItem, &markChar);
  567. if (markChar) modifiers ^= prtTotalsFlag;
  568. GetItemMark(formatHandle, filenameItem, &markChar);
  569. if (markChar) modifiers ^= filenameFlag;
  570. GetItemMark(formatHandle, longItem, &markChar);
  571. if (markChar) modifiers ^= longFlag;
  572. GetItemMark(formatHandle, mediumItem, &markChar);
  573. if (markChar) modifiers ^= mediumFlag;
  574. GetItemMark(formatHandle, shortItem, &markChar);
  575. if (markChar) modifiers ^= shortFlag;
  576. if (modifiers & longFlag) {
  577. CheckItem(formatHandle, filenameItem, false);
  578. CheckItem(formatHandle, mediumItem, false);
  579. CheckItem(formatHandle, shortItem, false);
  580. modifiers &= (allFlags ^ (filenameFlag | mediumFlag | shortFlag));
  581. } else if (modifiers & mediumFlag) {
  582. CheckItem(formatHandle, filenameItem, false);
  583. CheckItem(formatHandle, shortItem, false);
  584. modifiers &= (allFlags ^ (filenameFlag | shortFlag));
  585. } else if (modifiers & shortFlag) {
  586. CheckItem(formatHandle, filenameItem, false);
  587. modifiers &= (allFlags ^ filenameFlag);
  588. }
  589. command = ' ';
  590. stop = false;
  591. while (!stop) {
  592. SetCursor(&qd.arrow);
  593. if (useWNE) {
  594. haveEvent = WaitNextEvent(everyEvent, &myevent, LONG_MAX, NULL);
  595. } else {
  596. SystemTask();
  597. haveEvent = GetNextEvent(everyEvent, &myevent);
  598. }
  599. if (haveEvent) {
  600. switch (myevent.what) {
  601. case activateEvt:
  602. break;
  603. case keyDown:
  604. case autoKey:
  605. dokey(&myevent);
  606. break;
  607. case mouseDown:
  608. domousedown(&myevent);
  609. break;
  610. case updateEvt:
  611. screenUpdate((WindowPtr)myevent.message);
  612. break;
  613. case mouseUp:
  614. case keyUp:
  615. break;
  616. default:
  617. break;
  618. }
  619. }
  620. if (command != ' ') {
  621. char *s, **v, modifierString[32];
  622. Point p;
  623. int m, n;
  624. SFTypeList myTypes = {'TEXT', 'ZIP '};
  625. StandardFileReply myReply;
  626. SetPt(&p, 40, 40);
  627. StandardGetFile(nil, 2, myTypes, &myReply);
  628. ArchivePath = StrCalloc(512);
  629. ExtractPath = StrCalloc(512);
  630. GetFullPathFromSpec(ArchivePath, &myReply.sfFile, &err);
  631. strcpy(ExtractPath,ArchivePath);
  632. FindNewExtractFolder(ExtractPath, false);
  633. if (myReply.sfGood && (CheckMountedVolumes(ArchivePath) == 1)) {
  634. modifierMask &= modifiers;
  635. s = modifierString;
  636. *s++ = '-';
  637. if ((command != 'x') && (command != 'Z')) *s++ = command;
  638. if (modifierMask) {
  639. if (modifierMask & (autoFlag | textFlag)) *s++ = 'a';
  640. if (modifierMask & textFlag) *s++ = 'a';
  641. if (modifierMask & insensitiveFlag) *s++ = 'C';
  642. if (modifierMask & junkFlag) *s++ = 'j';
  643. if (modifierMask & lowercaseFlag) *s++ = 'L';
  644. if (modifierMask & neverFlag) *s++ = 'n';
  645. if (modifierMask & overwriteFlag) *s++ = 'o';
  646. if (modifierMask & quietFlag) *s++ = 'q';
  647. if (modifierMask & verboseFlag) *s++ = 'v';
  648. if (modifierMask & prtCommentFlag) *s++ = 'z';
  649. if (modifierMask & prtHeaderFlag) *s++ = 'h';
  650. if (modifierMask & prtTotalsFlag) *s++ = 't';
  651. if (modifierMask & filenameFlag) *s++ = '2';
  652. if (modifierMask & longFlag) *s++ = 'l';
  653. if (modifierMask & mediumFlag) *s++ = 'm';
  654. if (modifierMask & shortFlag) *s++ = 's';
  655. }
  656. if (*(s - 1) == '-') s -= 1;
  657. *s++ = 'd';
  658. *s = '\0';
  659. v = (char **)malloc(sizeof(char *));
  660. *v = "unzip";
  661. argc = 1;
  662. envargs(&argc, &v, NULL, NULL);
  663. argv = (char **)malloc((argc + 3) * sizeof(char *));
  664. argv[m = 0] = (command == 'Z') ? "zipinfo" : "unzip";
  665. if (*modifierString) argv[++m] = modifierString;
  666. argv[++m] = ExtractPath;
  667. argv[++m] = ArchivePath;
  668. for (n = 1; n < argc; n++) argv[n + m] = v[n];
  669. argv[argc += m] = NULL;
  670. free(v);
  671. for (n = 0; argv[n] != NULL; n++) printf("%s ", argv[n]);
  672. printf("...\n\n");
  673. memcpy(&saveGlobals, &G, sizeof(Uz_Globs));
  674. unzip(__G__ argc, argv);
  675. memcpy(&G, &saveGlobals, sizeof(Uz_Globs));
  676. ArchivePath = StrFree(ArchivePath);
  677. ExtractPath = StrFree(ExtractPath);
  678. printf("\nDone\n");
  679. }
  680. fileList[0] = '\0';
  681. command = ' ';
  682. }
  683. }
  684. screenClose();
  685. DESTROYGLOBALS();
  686. ExitToShell();
  687. return 0;
  688. }