home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / unzip511.zip / mac / macunzip.c < prev    next >
C/C++ Source or Header  |  1994-07-15  |  12KB  |  463 lines

  1. #include "unzip.h"
  2.  
  3. #include <Traps.h>
  4. #include <Values.h>
  5.  
  6. extern char UnzipVersion[], ZipinfoVersion[];
  7.  
  8. void MacFSTest (int);
  9. void ResolveMacVol (short, short *, long *, StringPtr);
  10.  
  11. #define aboutAlert      128
  12.  
  13. #define selectDialog    129
  14. #define okItem          1
  15. #define cancelItem      2
  16. #define editItem        3
  17. #define staticItem      4
  18.  
  19. #define unzipMenuBar    128
  20.  
  21. #define appleMenu       128
  22. #define aboutItem       1
  23.  
  24. #define fileMenu        129
  25. #define extractItem     1
  26. #define infoItem        2
  27. #define listItem        3
  28. #define testItem        4
  29. #define commentItem     6
  30. #define freshenItem     8
  31. #define updateItem      9
  32. #define quitItem        11
  33.  
  34. #define editMenu        130
  35. #define cutItem         1
  36. #define copyItem        2
  37. #define pasteItem       3
  38.  
  39. #define modifierMenu    131
  40. #define selectItem      1
  41. #define screenItem      3
  42. #define pauseItem       4
  43. #define scrollItem      5
  44. #define convertItem     7
  45. #define junkItem        8
  46. #define lowercaseItem   9
  47. #define neverItem       10
  48. #define promptItem      11
  49. #define quietItem       12
  50. #define verboseItem     13
  51.  
  52. short modifiers, modifierMask;
  53.  
  54. #define convertFlag     0x0001
  55. #define junkFlag        0x0002
  56. #define lowercaseFlag   0x0004
  57. #define neverFlag       0x0008
  58. #define promptFlag      0x0010
  59. #define quietFlag       0x0020
  60. #define screenFlag      0x0040
  61. #define scrollFlag      0x0200
  62. #define verboseFlag     0x0080
  63. #define allFlags        0x03FF
  64.  
  65. #define pauseFlag       0x0100
  66. #define scrollFlag      0x0200
  67.  
  68. #define extractMask     0x003F
  69. #define infoMask        0x0000
  70. #define listMask        0x0020
  71. #define testMask        0x0020
  72. #define commentMask     0x0000
  73. #define freshenMask     0x003F
  74. #define updateMask      0x003F
  75.  
  76. EventRecord myevent;
  77. MenuHandle appleHandle, modifierHandle;
  78. Handle menubar, itemHandle;
  79. short itemType;
  80. Rect itemRect;
  81.  
  82. char command, fileList[256];
  83.  
  84. Boolean stop;
  85.  
  86. SysEnvRec sysRec;
  87.  
  88. char *macgetenv(s) char *s; {
  89.     if (s == NULL) return(fileList);
  90.     return(NULL);
  91. }
  92.  
  93. Boolean TrapAvailable(machineType, trapNumber, trapType)
  94. short machineType;
  95. short trapNumber;
  96. TrapType trapType;
  97. {
  98.     if (machineType < 0)
  99.         return (false);
  100.  
  101.     if ((trapType == ToolTrap) &&
  102.         (machineType > envMachUnknown) &&
  103.         (machineType < envMacII)) {
  104.         if ((trapNumber &= 0x03FF) > 0x01FF)
  105.             trapNumber = _Unimplemented;
  106.     }
  107.     return (NGetTrapAddress(trapNumber, trapType) !=
  108.         GetTrapAddress(_Unimplemented));
  109. }
  110.  
  111. void domenu(menucommand) long menucommand;
  112. {
  113.     short check, themenu, theitem;
  114.     DialogPtr thedialog;
  115.     Str255 name;
  116.  
  117.     themenu = HiWord(menucommand);
  118.     theitem = LoWord(menucommand);
  119.  
  120.     switch (themenu) {
  121.  
  122.     case appleMenu:
  123.         if (theitem == aboutItem) {
  124.             ParamText(UnzipVersion, ZipinfoVersion, nil, nil);
  125.             Alert(aboutAlert, nil);
  126.         } else {
  127.             GetItem(appleHandle, theitem, name);
  128.             theitem = OpenDeskAcc(name);
  129.         }
  130.         break;
  131.  
  132.     case fileMenu:
  133.         switch (theitem) {
  134.         case extractItem:
  135.             if (modifiers & screenFlag)
  136.                 command = 'c';
  137.             else
  138.                 command = 'x';
  139.             modifierMask = extractMask;
  140.             break;
  141.         case infoItem:
  142.             command = 'Z';
  143.             modifierMask = infoMask;
  144.             break;
  145.         case listItem:
  146.             if (modifiers & verboseFlag)
  147.                 command = 'v';
  148.             else
  149.                 command = 'l';
  150.             modifierMask = listMask;
  151.             break;
  152.         case testItem:
  153.             command = 't';
  154.             modifierMask = testMask;
  155.             break;
  156.         case commentItem:
  157.             command = 'z';
  158.             modifierMask = commentMask;
  159.             break;
  160.         case freshenItem:
  161.             command = 'f';
  162.             modifierMask = freshenMask;
  163.             break;
  164.         case updateItem:
  165.             command = 'u';
  166.             modifierMask = updateMask;
  167.             break;
  168.         case quitItem:
  169.             stop = true;
  170.             break;
  171.         default:
  172.             break;
  173.         }
  174.         break;
  175.  
  176.     case editMenu:
  177.         break;
  178.  
  179.     case modifierMenu:
  180.         switch (theitem) {
  181.         case selectItem:
  182.             thedialog = GetNewDialog(selectDialog, nil, (WindowPtr)(-1));
  183.             SetPort(thedialog);
  184.             do
  185.                 ModalDialog(nil, &check);
  186.             while ((check != okItem) && (check != cancelItem));
  187.             if (check == okItem) {
  188.                 GetDItem(thedialog, editItem, &itemType, &itemHandle, &itemRect);
  189.                 GetIText(itemHandle, &fileList);
  190.                 p2cstr(fileList);
  191.             }
  192.             DisposDialog(thedialog);
  193.             check = -1;
  194.             break;
  195.         case screenItem:
  196.             check = (modifiers ^= screenFlag) & screenFlag;
  197.             break;
  198.         case pauseItem:
  199.             check = (modifiers ^= pauseFlag) & pauseFlag;
  200.             screenControl("p", check);
  201.             break;
  202.         case scrollItem:
  203.             check = (modifiers ^= scrollFlag) & scrollFlag;
  204.             screenControl("s", check);
  205.             break;
  206.         case convertItem:
  207.             check = (modifiers ^= convertFlag) & convertFlag;
  208.             break;
  209.         case junkItem:
  210.             check = (modifiers ^= junkFlag) & junkFlag;
  211.             break;
  212.         case lowercaseItem:
  213.             check = (modifiers ^= lowercaseFlag) & lowercaseFlag;
  214.             break;
  215.         case neverItem:
  216.             if (check = (modifiers ^= neverFlag) & neverFlag) {
  217.                 if (modifiers & promptFlag) {
  218.                     CheckItem(modifierHandle, promptItem, false);
  219.                     modifiers &= (allFlags ^ promptFlag);
  220.                 }
  221.             } else {
  222.                 CheckItem(modifierHandle, promptItem, true);
  223.                 modifiers |= promptFlag;
  224.             }
  225.             break;
  226.         case promptItem:
  227.             if (check = (modifiers ^= promptFlag) & promptFlag)
  228.                 if (modifiers & neverFlag) {
  229.                     CheckItem(modifierHandle, neverItem, false);
  230.                     modifiers &= (allFlags ^ neverFlag);
  231.                 }
  232.             break;
  233.         case quietItem:
  234.             check = (modifiers ^= quietFlag) & quietFlag;
  235.             break;
  236.         case verboseItem:
  237.             check = (modifiers ^= verboseFlag) & verboseFlag;
  238.             break;
  239.         default:
  240.             break;
  241.         }
  242.         if (check == 0)
  243.             CheckItem(modifierHandle, theitem, false);
  244.         else if (check > 0)
  245.             CheckItem(modifierHandle, theitem, true);
  246.         break;
  247.  
  248.     default:
  249.         break;
  250.  
  251.     }
  252.  
  253.     HiliteMenu(0);
  254.     return;
  255. }
  256.  
  257. void dokey(myevent) EventRecord *myevent;
  258. {
  259.     char code;
  260.  
  261.     code = (char)(myevent->message & charCodeMask);
  262.  
  263.     if (myevent->modifiers & cmdKey) {
  264.         if (myevent->what != autoKey) {
  265.             domenu(MenuKey(code));
  266.         }
  267.     }
  268.  
  269.     return;
  270. }
  271.  
  272. void domousedown(myevent) EventRecord *myevent;
  273. {
  274.     WindowPtr whichwindow;
  275.     long code;
  276.  
  277.     code = FindWindow(myevent->where, &whichwindow);
  278.  
  279.     switch (code) {
  280.  
  281.     case inSysWindow:
  282.         SystemClick(myevent, whichwindow);
  283.         break;
  284.  
  285.     case inMenuBar:
  286.         domenu(MenuSelect(myevent->where));
  287.         break;
  288.  
  289.     }
  290.  
  291.     return;
  292. }
  293.  
  294. int main(argc, argv) int argc; char *argv[];
  295. {
  296.     Boolean haveEvent, useWNE;
  297.     short markChar;
  298.     FILE *fp;
  299.  
  300.     FlushEvents(everyEvent, 0);
  301.     InitGraf(&qd.thePort);
  302.     InitFonts();
  303.     InitWindows();
  304.     InitMenus();
  305.     TEInit();
  306.     InitDialogs(nil);
  307.     InitCursor();
  308.  
  309.     c2pstr(UnzipVersion);
  310.     c2pstr(ZipinfoVersion);
  311.  
  312.     SysEnvirons(1, &sysRec);
  313.     useWNE = TrapAvailable(sysRec.machineType, _WaitNextEvent, ToolTrap);
  314.  
  315.     SetMenuBar(menubar = GetNewMBar(unzipMenuBar));
  316.     DisposeHandle(menubar);
  317.     AddResMenu(appleHandle = GetMHandle(appleMenu), 'DRVR');
  318.     modifierHandle = GetMHandle(modifierMenu);
  319.     DrawMenuBar();
  320.  
  321.     screenOpen("Unzip");
  322.  
  323.     modifiers = 0;
  324.  
  325.     GetItemMark(modifierHandle, pauseItem, &markChar);
  326.     if (markChar) modifiers ^= pauseFlag;
  327.     screenControl("p", markChar);
  328.     GetItemMark(modifierHandle, scrollItem, &markChar);
  329.     if (markChar) modifiers ^= scrollFlag;
  330.     screenControl("s", markChar);
  331.  
  332.     GetItemMark(modifierHandle, screenItem, &markChar);
  333.     if (markChar) modifiers ^= screenFlag;
  334.     GetItemMark(modifierHandle, convertItem, &markChar);
  335.     if (markChar) modifiers ^= convertFlag;
  336.     GetItemMark(modifierHandle, junkItem, &markChar);
  337.     if (markChar) modifiers ^= junkFlag;
  338.     GetItemMark(modifierHandle, lowercaseItem, &markChar);
  339.     if (markChar) modifiers ^= lowercaseFlag;
  340.     GetItemMark(modifierHandle, neverItem, &markChar);
  341.     if (markChar) modifiers ^= neverFlag;
  342.     GetItemMark(modifierHandle, promptItem, &markChar);
  343.     if (markChar) modifiers ^= promptFlag;
  344.     GetItemMark(modifierHandle, quietItem, &markChar);
  345.     if (markChar) modifiers ^= quietFlag;
  346.     GetItemMark(modifierHandle, verboseItem, &markChar);
  347.     if (markChar) modifiers ^= verboseFlag;
  348.  
  349.     if ((modifiers & (neverFlag | promptFlag)) == (neverFlag | promptFlag)) {
  350.         CheckItem(modifierHandle, promptItem, false);
  351.         modifiers &= (allFlags ^ promptFlag);
  352.     }
  353.  
  354.     command = ' ';
  355.  
  356.     stop = false;
  357.     while (!stop) {
  358.         SetCursor(&qd.arrow);
  359.  
  360.         if (useWNE) {
  361.             haveEvent = WaitNextEvent(everyEvent, &myevent, MAXLONG, NULL);
  362.         } else {
  363.             SystemTask();
  364.             haveEvent = GetNextEvent(everyEvent, &myevent);
  365.         }
  366.  
  367.         if (haveEvent) {
  368.             switch (myevent.what) {
  369.  
  370.             case activateEvt:
  371.                 break;
  372.  
  373.             case keyDown:
  374.             case autoKey:
  375.                 dokey(&myevent);
  376.                 break;
  377.  
  378.             case mouseDown:
  379.                 domousedown(&myevent);
  380.                 break;
  381.  
  382.             case updateEvt:
  383.                 screenUpdate(myevent.message);
  384.                 break;
  385.  
  386.             case mouseUp:
  387.             case keyUp:
  388.                 break;
  389.  
  390.             default:
  391.                 break;
  392.  
  393.             }
  394.         }
  395.  
  396.         if (command != ' ') {
  397.             char *s, **v, modifierString[16];
  398.             SFReply fileRep;
  399.             Point p;
  400.             int m, n;
  401.  
  402.             SetPt(&p, 40, 40);
  403.  
  404.             SFGetFile(p, "\pSpecify ZIP file:", 0L, -1, nil, 0L, &fileRep);
  405.             if (fileRep.good) {
  406.                 MacFSTest(fileRep.vRefNum);
  407.                 ResolveMacVol(fileRep.vRefNum, &gnVRefNum, &glDirID, NULL);
  408.  
  409.                 p2cstr(fileRep.fName);
  410.  
  411.                 modifierMask &= modifiers;
  412.  
  413.                 s = modifierString;
  414.  
  415.                 if ((command != 'Z') || modifierMask) {
  416.                     *s++ = '-';
  417.                     *s++ = command;
  418.  
  419.                     if (modifierMask & convertFlag) *s++ = 'a';
  420.                     if (!HFSFlag || (modifierMask & junkFlag)) *s++ = 'j';
  421.                     if (!modifierMask & lowercaseFlag) *s++ = 'U';
  422.                     if (modifierMask & neverFlag) *s++ = 'n';
  423.                     if (!modifierMask & promptFlag) *s++ = 'o';
  424.                     if (modifierMask & quietFlag) *s++ = 'q';
  425.                     if (modifierMask & verboseFlag) *s++ = 'v';
  426.                 }
  427.  
  428.                 *s = '\0';
  429.  
  430.                 v = (char **)malloc(sizeof(char *));
  431.                 *v = "unzip";
  432.                 argc = 1;
  433.  
  434.                 envargs(&argc, &v, NULL, NULL);
  435.  
  436.                 argv = (char **)malloc((argc + 3) * sizeof(char *));
  437.  
  438.                 argv[m = 0] = (command == 'Z') ? "zipinfo" : "unzip";
  439.                 if (*modifierString) argv[++m] = modifierString;
  440.                 argv[++m] = (char *)fileRep.fName;
  441.                 for (n = 1; n < argc; n++) argv[n + m] = v[n];
  442.                 argv[argc += m] = NULL;
  443.  
  444.                 free(v);
  445.  
  446.                 for (n = 0; argv[n] != NULL; n++) printf("%s ", argv[n]);
  447.                 printf("...\n\n");
  448.  
  449.                 unzip(argc, argv);
  450.  
  451.                 printf("\nDone\n");
  452.             }
  453.  
  454.             fileList[0] = '\0';
  455.             command = ' ';
  456.         }
  457.     }
  458.  
  459.     screenClose();
  460.  
  461.     ExitToShell();
  462. }
  463.