Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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