macunzip.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:24k
源码类别:

压缩解压

开发平台:

MultiPlatform

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