home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d812 / ppmc.lha / PPMC / Source / PPMC1.2b_source.lha / main.c < prev    next >
C/C++ Source or Header  |  1993-01-27  |  29KB  |  1,000 lines

  1. /*
  2.                             ----------------------
  3.                                     main.c
  4.  
  5.                              © 1992,1993 REELSOFT
  6.                             ----------------------
  7. */
  8.  
  9. #include    <proto/asl.h>
  10. #include    <proto/dos.h>
  11. #include    <proto/exec.h>
  12. #include    <proto/gadtools.h>
  13. #include    <proto/graphics.h>
  14. #include    <proto/icon.h>
  15. #include    <proto/intuition.h>
  16. #include    <proto/powerpacker.h>
  17. #include    <proto/reqtools.h>
  18. #include    <proto/utility.h>
  19. #include    <proto/wb.h>
  20.  
  21. #include    <libraries/dos.h>
  22. #include    <libraries/ppbase.h>
  23. #include    <libraries/reqtools.h>
  24.  
  25. #include    <dos/stdio.h>
  26. #include    <graphics/gfxmacros.h>
  27. #include    <intuition/gadgetclass.h>
  28. #include    <workbench/icon.h>
  29. #include    <workbench/startup.h>
  30.  
  31. #include    <dos.h>
  32. #include    <ctype.h>
  33. #include    <stdio.h>
  34. #include    <stdlib.h>
  35. #include    <string.h>
  36.  
  37. #include    "protos.h"
  38. #include    "macros.h"
  39. #include    "debug.h"
  40.  
  41. #include    "ppmc.h"
  42. #include    "main.h"
  43. #include    "locale.h"
  44.  
  45. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  46. VOID    main (int argc, char *argv[])
  47. {
  48.     switch (argc) {
  49.         case 0 :    //    started from the Workbench..
  50.         case 1 :    //    started from the CLI with no argument..
  51.                     sup.cli  = sup.font = sup.asl = pac.pass = FALSE ;
  52.                     sup.verb = sup.fill = TRUE ;
  53.                     sup.apen = 3 ;
  54.                     if (NOT argc)
  55.                         ReadWBArgs() ;
  56.                     break ;
  57.  
  58.         default :    //    started from CLI with one ore more arguments..
  59.                     ReadCLIArgs() ;
  60.                     break ;
  61.     }
  62.     Setup() ;
  63.     if (sup.cli)
  64.         CLIonly() ;
  65.     else
  66.         MainLoop() ;
  67.     Cleanup (RETURN_OK) ;
  68. }
  69. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  70. VOID    ReadCLIArgs (VOID)
  71. {
  72.     struct    RDArgs    *readargs ;
  73.  
  74.     memset ((UBYTE *)rargs,0,sizeof(rargs)) ;
  75.     readargs = ReadArgs(TEMPLATE,rargs,NULL) ;
  76.     FreeArgs (readargs) ;
  77.  
  78.     SetVBuf (Output(),NULL,BUF_NONE,-1) ;
  79.  
  80.     if (rargs[8]) {                    //    VER (show the PPMC version..)
  81.         Printf ("%s\n",&version[6]) ;
  82.         Cleanup (RETURN_OK) ;
  83.     }
  84.  
  85.     sup.cli = TRUE ;
  86.     if (rargs[9]) {                    //    HELP (show the help message and exit..)
  87.         Setup() ;    //    load locale.library..
  88.         Printf (    "\033[3m- EFF (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\t4 = %s\n\t5 = %s\n\033[3m- BUF (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\033[3m- DEC (%s):\n\t\033[0m1 = %s\n\t2 = %s\n\t3 = %s\n\t4 = %s\n\t5 = %s\n",
  89.                     LOC(MSG_PARAMETERS_EFFICIENCY),
  90.                     LOC(MSG_EFFICIENCY0_GAD),
  91.                     LOC(MSG_EFFICIENCY1_GAD),
  92.                     LOC(MSG_EFFICIENCY2_GAD),
  93.                     LOC(MSG_EFFICIENCY3_GAD),
  94.                     LOC(MSG_EFFICIENCY4_GAD),
  95.                     LOC(MSG_PARAMETERS_SUBUFFER),
  96.                     LOC(MSG_SUBUFFER0_GAD),
  97.                     LOC(MSG_SUBUFFER1_GAD),
  98.                     LOC(MSG_SUBUFFER2_GAD),
  99.                     LOC(MSG_PARAMETERS_DECEFFECT),
  100.                     LOC(MSG_DECEFFECT0_GAD),
  101.                     LOC(MSG_DECEFFECT1_GAD),
  102.                     LOC(MSG_DECEFFECT2_GAD),
  103.                     LOC(MSG_DECEFFECT3_GAD),
  104.                     LOC(MSG_DECEFFECT4_GAD)    ) ;
  105.         Cleanup (RETURN_OK) ;
  106.     }
  107.     if (NOT readargs) {
  108.         PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
  109.         Cleanup (RETURN_FAIL) ;
  110.     }
  111.  
  112.     strcpy (name.old,(UBYTE *)rargs[0]) ;
  113.     pac.eff     = (UBYTE)rargs[2] ;    //    EFFICIENCY
  114.     pac.buf     = (UBYTE)rargs[3] ;    //    BUFFER
  115.     pac.dec     = (UBYTE)rargs[4] ;    //    DECRUNCHING
  116.     pac.pass = (BOOL) rargs[5] ;    //    ENCRYPT
  117.     sup.verb = NOT (BOOL)rargs[7] ;    //    QUIET
  118. }
  119. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  120. VOID    ReadWBArgs (VOID)
  121. {
  122.     struct    Library        *IconBase ;
  123.     struct    DiskObject    *dobj ;
  124.  
  125.     if (WANAME && (IconBase = OpenLibrary (ICONNAME,37L))) {
  126.         if (dobj = GetDiskObject (_WBenchMsg->sm_ArgList->wa_Name)) {
  127.             char *s, **tt=dobj->do_ToolTypes ;
  128.  
  129.             if (s = FindToolType(tt,"PUBSCREEN"))
  130.                 sup.pubscreen = strdup(s) ;
  131.             if (s = FindToolType(tt,"LANGUAGE"))
  132.                 sup.language = strdup(s) ;
  133.             if (s = FindToolType(tt,"ENCRYPT"))
  134.                 pac.pass = MatchToolValue(s,"ON") ;
  135.             if (s = FindToolType(tt,"ASL"))
  136.                 sup.asl     = MatchToolValue(s,"ON") ;
  137.             if (s = FindToolType(tt,"VERBOSE"))
  138.                 sup.verb = MatchToolValue(s,"ON") ;
  139.             if (s = FindToolType(tt,"PATTERN"))
  140.                 sup.fill = MatchToolValue(s,"ON") ;
  141.             if (s = FindToolType(tt,"COLOR"))
  142.                 sup.apen = (UBYTE)atoi(s) ;
  143.  
  144.             pac.eff     = (UBYTE)atoi(FindToolType(tt,"EFFICIENCY")) ;
  145.             pac.buf     = (UBYTE)atoi(FindToolType(tt,"BUFFER")) ;
  146.             pac.dec     = (UBYTE)atoi(FindToolType(tt,"DECRUNCHING")) ;
  147.  
  148.             FreeDiskObject (dobj) ;
  149.         }
  150.         CloseLibrary (IconBase) ;
  151.     }
  152. }
  153. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  154. VOID    CLIonly    (VOID)
  155. {
  156.     Printf ("\033[7m\033[42m The Powerpacker Mini Clone v1.2b \033[0m\033[33m\n Copyright (c) 1992,1993 REELSOFT\033[31m\n") ;
  157.     switch (AnalyseFile()) {
  158.         case 1 :    //    unable to open the file !..
  159.                     PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
  160.                     return ;
  161.         case 2 :    //    file is empty !..
  162. //                    Printf ("\033[32mPPMC:\033[31m %s %s !\n",FilePart(name.old),LOC(MSG_EMPTY_FILE)) ;
  163.                     return ;
  164.         case 3 :    //    user doesn't want to pack an executable file..
  165.                     return ;
  166.         case 4 :    //    file is powerpacked and encrypted..
  167.                     crypted = TRUE ;
  168.         case 5 :    //    file is powerpacked..
  169.                     Decrunch() ;
  170.                     break ;
  171.         case 0 :    //    file seems OK..
  172.                     if (NOT Crunch())
  173.                         return ;
  174.                     break ;
  175.     }
  176.     Save (FALSE) ;
  177. }
  178. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  179. VOID    About (VOID)    //    `About PPMC' requester..
  180. {
  181.     REQTITLE = (ULONG)LOC(MSG_ABOUT) ;
  182.     rtEZRequest (    "%s\n"COPYRIGHT"\n\n"
  183.                     "%s "AUTHOR"\n%s\n\n"
  184.                     TOOL1"\n\n"TOOL2"\n\n"TOOL3"\n\n%s",
  185.                     LOC(MSG_OK_CONTINUE), NULL, rttags,
  186.                     &version[6],
  187.                     LOC(MSG_WRITTEN),
  188.                     LOC(MSG_USING),
  189.                     LOC(MSG_FREEWARE) ) ;
  190. }
  191. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  192. BOOL    Load (BOOL choose)    //    selecting a file (Intuition interface only)..
  193. {
  194.     if (choose) {
  195.         if (sup.asl) {
  196.             struct    FileRequester    *aslfreq = AllocAslRequest(ASL_FileRequest,NULL) ;
  197.  
  198.             if (NOT aslfreq) {
  199.                 REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  200.                 rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
  201.                 return FALSE ;
  202.             }
  203.             if (NOT AslRequestTags( aslfreq,
  204.                                     ASLFR_Window,        Wnd,
  205.                                     ASLFR_SleepWindow,    TRUE,
  206.                                     ASLFR_TitleText,    LOC(MSG_TITLE_LOAD),
  207.                                     ASLFR_PositiveText,    LOC(MSG_OK_LOAD),
  208.                                     ASLFR_RejectIcons,    TRUE,
  209.                                     TAG_END    ) || NOT strlen(aslfreq->fr_File))
  210.             {
  211.                 FreeAslRequest (aslfreq) ;
  212.                 return FALSE ;
  213.             }
  214.             strcpy (name.old,aslfreq->fr_Drawer) ;
  215.             AddPart (name.old,aslfreq->fr_File,256L) ;
  216.             FreeAslRequest (aslfreq) ;
  217.         }
  218.         else {
  219.             struct    rtFileRequester    *rtfreq = rtAllocRequestA(RT_FILEREQ,NULL) ;
  220.             UBYTE    filename[108] ;
  221.  
  222.             if (NOT rtfreq) {
  223.                 REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  224.                 rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
  225.                 return FALSE ;
  226.             }
  227.             filename[0] = '\0' ;
  228.             if (NOT rtFileRequest (    rtfreq,
  229.                                     filename,
  230.                                     LOC(MSG_TITLE_LOAD),
  231.                                     RT_ReqPos,        REQPOS_CENTERWIN,
  232.                                     RT_LockWindow,    TRUE,
  233.                                     RT_ShareIDCMP,    TRUE,
  234.                                     RTFI_OkText,    LOC(MSG_OK_LOAD),
  235.                                     TAG_END ))
  236.             {
  237.                 rtFreeRequest (rtfreq) ;
  238.                 return FALSE ;
  239.             }
  240.             strcpy (name.old,rtfreq->Dir) ;
  241.             AddPart (name.old,filename,256L) ;
  242.             rtFreeRequest (rtfreq) ;
  243.         }
  244.     }
  245.  
  246.     switch (AnalyseFile()) {
  247.         case 1 :    //    unable to open the file !..
  248.                 {
  249.                     UBYTE    errmsg[81] ;
  250.                     REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  251.                     Fault (IoErr(),NULL,errmsg,80) ;
  252.                     rtEZRequest ("%s \"%s\" !\n\n%s",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OPEN),FilePart(name.old),errmsg) ;
  253.                 }
  254. //                    return FALSE ;
  255.         case 2 :    //    file is empty !..
  256. //                    REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  257. //                    rtEZRequest ("%s\n%s !",LOC(MSG_OK_ABORT),NULL,rttags,FilePart(name.old),LOC(MSG_EMPTY_FILE)) ;
  258. //                    return FALSE ;
  259.         case 3 :    //    user doesn't want to pack an executable file..
  260.                     return FALSE ;
  261.         case 4 :    //    file is powerpacked and encrypted..
  262.         case 5 :    //    file is powerpacked..
  263.         case 0 :    //    file seems OK..
  264.                     break ;
  265.     }
  266.  
  267.     SETGA (Gadgets[GDX_Status],     Wnd,NULL,GTTX_Text,tocrunch?LOC(MSG_STATUS_START_PACK):LOC(MSG_STATUS_START_UNPACK),TAG_DONE) ;
  268.     SETGA (Gadgets[GDX_FileName],Wnd,NULL,GTTX_Text,  FilePart(name.new),TAG_DONE) ;
  269.     SETGA (Gadgets[GDX_Gained],     Wnd,NULL,GTNM_Number,0L,            TAG_DONE) ;
  270.     SETGA (Gadgets[GDX_Packed],     Wnd,NULL,GTNM_Number,0L,            TAG_DONE) ;
  271.     SETGA (Gadgets[GDX_Save],     Wnd,NULL,GA_Disabled,TRUE,            TAG_DONE) ;
  272.     SETGA (Gadgets[GDX_Pack],     Wnd,NULL,GA_Disabled,NOT tocrunch,    TAG_DONE) ;
  273.     SETGA (Gadgets[GDX_UnPack],     Wnd,NULL,GA_Disabled,tocrunch,        TAG_DONE) ;
  274.  
  275.     NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = NM_ITEMDISABLED ;
  276.     NMFLAG(NM_Crunching_Pack)    = tocrunch?0:NM_ITEMDISABLED ;
  277.     NMFLAG(NM_Crunching_UnPack)    = tocrunch?NM_ITEMDISABLED:0 ;
  278.     ClearMenus() ;
  279.     SetupMenus() ;
  280.  
  281.     FillGauge (0,0) ;
  282.     FreeCrMem() ;
  283.  
  284.     return TRUE ;
  285. }
  286. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  287. UBYTE    exeofs[8] = { 0x00,0x00,0x03,0xf3,0x00,0x00,0x00,0x00 } ;
  288. UBYTE    AnalyseFile (VOID)    //    analyse the loaded file..
  289. {
  290.     struct    FileInfoBlock    fib ;
  291.     BPTR    flock ;
  292.     UBYTE    offset[8] ;
  293.  
  294.     if ((flock = Open (name.old,MODE_OLDFILE)) == NULL)
  295.         return (1) ;
  296.     if (NOT Read (flock,offset,8)) {
  297.         Close (flock) ;
  298.         return (2) ;
  299.     }
  300.     ExamineFH (flock,&fib) ;
  301.     Close (flock) ;
  302.  
  303.     //    is the loaded file executable ?..
  304.     if (NOT strncmp (offset,exeofs,8)) {
  305.         if (NOT sup.cli) {
  306.             REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
  307.             if (NOT rtEZRequest ("\"%s\"\n%s",LOC(MSG_OK_OKCANCEL),NULL,rttags,FilePart(name.old),LOC(MSG_EXECUTABLE)))
  308.                 return (3) ;
  309.         }
  310.         else if (NOT rargs[6]) {
  311.             Printf ("\033[32mPPMC:\033[31m %s %s\n",FilePart(name.old),LOC(MSG_CLI_EXECUTABLE)) ;
  312.             Flush (Output()) ;
  313.             {
  314.                 UBYTE    ret = getch() ;
  315.                 if (ret != ToLower(LOC(MSG_CLI_YES)[0])
  316.                  && ret != ToUpper(LOC(MSG_CLI_YES)[0]))
  317.                     return (3) ;
  318.             }
  319.         }
  320.     }
  321.  
  322.     strcpy (name.new,name.old) ;
  323.     fsize = fib.fib_Size ;
  324.  
  325.     if (sup.cli)
  326.         Printf ("\033[32mPPMC:\033[31m \033[1m%s\033[0m - %s (%ld %s)\n",LOC(MSG_CLI_ORIGINAL_FILE),FilePart(name.new),fib.fib_Size,LOC(MSG_CLI_BYTES)) ;
  327.     else
  328.         SETGA (Gadgets[GDX_Size],Wnd,NULL,GTNM_Number,fsize,TAG_DONE) ;
  329.  
  330.     //    is the file packed and encrypted ?..
  331.     if (NOT strncmp (offset,"PX20",4)) {
  332.         tocrunch = FALSE ;
  333.         return (4) ;
  334.     }
  335.  
  336.     //    so, maybe it's only packed ?..
  337.     if (NOT strncmp (offset,"PP20",4)) {
  338.         tocrunch = FALSE ;
  339.         return (5) ;
  340.     }
  341.  
  342.     //    file seems OK..
  343.     tocrunch = TRUE ;
  344.     return (0) ;
  345. }
  346. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  347. BOOL    ChooseSaveFile (VOID)
  348. {
  349.     if (sup.asl) {
  350.         struct    FileRequester    *aslfreq = AllocAslRequest(ASL_FileRequest,NULL) ;
  351.         UBYTE    path[256] ;
  352.  
  353.         if (NOT aslfreq) {
  354.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  355.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
  356.             return FALSE ;
  357.         }
  358.         stcgfp (path,name.new) ;
  359.         if (NOT AslRequestTags(    aslfreq,
  360.                                 ASLFR_Window,            Wnd,
  361.                                 ASLFR_SleepWindow,        TRUE,
  362.                                 ASLFR_TitleText,        LOC(MSG_TITLE_SAVE),
  363.                                 ASLFR_PositiveText,        LOC(MSG_OK_SAVE),
  364.                                 ASLFR_InitialFile,        FilePart(name.new),
  365.                                 ASLFR_InitialDrawer,    path,
  366.                                 ASLFR_DoSaveMode,        TRUE,
  367.                                 ASLFR_RejectIcons,        TRUE,
  368.                                 TAG_END    ) || NOT strlen(aslfreq->fr_File))
  369.         {
  370.             FreeAslRequest (aslfreq) ;
  371.             return FALSE ;
  372.         }
  373.         strcpy (name.new,aslfreq->fr_Drawer) ;
  374.         AddPart (name.new,aslfreq->fr_File,256L) ;
  375.         FreeAslRequest (aslfreq) ;
  376.     }
  377.     else {
  378.         struct    rtFileRequester    *rtfreq = rtAllocRequestA(RT_FILEREQ,NULL) ;
  379.         UBYTE    filename[108] ;
  380.  
  381.         if (NOT rtfreq) {
  382.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  383.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
  384.             return FALSE ;
  385.         }
  386.         strcpy (filename,FilePart(name.new)) ;
  387.         if (NOT rtFileRequest (    rtfreq,
  388.                                 filename,
  389.                                 LOC(MSG_TITLE_SAVE),
  390.                                 RT_ReqPos,        REQPOS_CENTERWIN,
  391.                                 RT_LockWindow,    TRUE,
  392.                                 RT_ShareIDCMP,    TRUE,
  393.                                 RTFI_Flags,        FREQF_SAVE,
  394.                                 RTFI_OkText,    LOC(MSG_OK_SAVE),
  395.                                 TAG_END    ) )
  396.         {
  397.             rtFreeRequest (rtfreq) ;
  398.             return FALSE ;
  399.         }
  400.         strcpy (name.new,rtfreq->Dir) ;
  401.         AddPart (name.new,filename,256L) ;
  402.         rtFreeRequest (rtfreq) ;
  403.     }
  404.     return TRUE ;
  405. }
  406. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  407. BOOL    Save (BOOL choose)    //    selecting a file to Save to..
  408. {
  409.     BPTR    flock ;
  410.  
  411.     //    destination file name..
  412.     if (rargs[1])
  413.         strcpy (name.new,(UBYTE *)rargs[1]) ;
  414.     else {
  415.         if (tocrunch)
  416.             strcat (name.new,".pp") ;
  417.         else if (NOT strcmp(&name.new[strlen(name.new)-3],".pp"))
  418.             name.new[strlen(name.new)-3] = '\0' ;
  419.     }
  420.  
  421.     if (choose && NOT ChooseSaveFile()) {
  422.         strcpy (name.new,name.old) ;
  423.         return FALSE ;
  424.     }
  425.  
  426.     //    checking if the destination file already exists..
  427.     if(NOT access (name.new,0)) {
  428.         if (sup.cli) {
  429.             Printf ("\n\033[32mPPMC:\033[31m %s %s",FilePart(name.new),LOC(MSG_CLI_FILE_EXISTS)) ;
  430.             Flush (Output()) ;
  431.             {
  432.                 UBYTE    ret = getch() ;
  433.                 if (ret != ToLower(LOC(MSG_CLI_YES)[0])
  434.                  && ret != ToUpper(LOC(MSG_CLI_YES)[0]))
  435.                     _CXBRK() ;
  436.             }
  437.         }
  438.         else {
  439.             REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
  440.             switch (rtEZRequest ("%s\n%s",LOC(MSG_OK_OVERWRITE),NULL,rttags,FilePart(name.new),LOC(MSG_FILE_EXISTS))) {
  441.                 case 1 :
  442.                             if (ChooseSaveFile())
  443.                                 break ;
  444.                 case 0 :
  445.                             strcpy (name.new,name.old) ;
  446.                             return FALSE ;
  447.                 case 2 :
  448.                             break ;
  449.             }
  450.         }
  451.     }
  452.  
  453.     //    creating the Save file..
  454.     flock = Open (name.new,MODE_NEWFILE) ;
  455.     if (NOT flock) {
  456.         if (sup.cli)
  457.             PrintFault (IoErr(),"\033[32mPPMC\033[31m") ;
  458.         else {
  459.             UBYTE    errmsg[81] ;
  460.             Fault (IoErr(),NULL,errmsg,80) ;
  461.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  462.             rtEZRequest ("%s \"%s\" !\n\n%s",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OPEN),FilePart(name.new),errmsg) ;
  463.             strcpy (name.new,name.old) ;
  464.         }
  465.         return FALSE ;
  466.     }
  467.  
  468.     //    writing the Crunch Data Header if file is packed..
  469.     if (tocrunch && NOT ppWriteDataHeader (flock,(ULONG)pac.eff,crypted,checksum)) {
  470.         if (sup.cli)
  471.             Printf ("\n\033[32mPPMC:\033[31m %s %s\n",LOC(MSG_CLI_ERROR_SAVE),FilePart(name.new)) ;
  472.         else {
  473.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  474.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_HEADER)) ;
  475.             strcpy (name.new,name.old) ;
  476.         }
  477.         Close (flock) ;
  478.         return FALSE ;
  479.     }
  480.  
  481.     //    writing the Packed/UnPacked file..
  482.     if (Write (flock,cdata,clen) != clen) {
  483.         if (sup.cli)
  484.             Printf ("\n\033[32mPPMC:\033[31m %s %s\n",LOC(MSG_CLI_ERROR_SAVE),FilePart(name.new)) ;
  485.         else {
  486.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  487.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_SAVE)) ;
  488.         }
  489.         Close (flock) ;
  490.         return FALSE ;
  491.     }
  492.  
  493.     Close (flock) ;
  494.  
  495.     if (sup.cli)
  496.         Printf ("\n\033[32mPPMC:\033[31m \033[1m%s\033[0m - %s (%ld %s)\n",tocrunch?LOC(MSG_CLI_PACKED_FILE):LOC(MSG_CLI_UNPACKED_FILE),FilePart(name.new),tocrunch?clen+8L:csize,LOC(MSG_CLI_BYTES)) ;
  497.     else {
  498.         SETGA (Gadgets[GDX_Status],   Wnd, NULL, GTTX_Text,    LOC(MSG_STATUS_SAVED),    TAG_DONE) ;
  499.         SETGA (Gadgets[GDX_FileName], Wnd, NULL, GTTX_Text,    FilePart(name.new),        TAG_DONE) ;
  500.         SETGA (Gadgets[GDX_Save],      Wnd, NULL, GA_Disabled, TRUE,                    TAG_DONE) ;
  501.         SETGA (Gadgets[tocrunch?GDX_Pack:GDX_UnPack], Wnd, NULL, GA_Disabled, TRUE,    TAG_DONE) ;
  502.  
  503.         NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = NM_ITEMDISABLED ;
  504.         NMFLAG(tocrunch?NM_Crunching_Pack:NM_Crunching_UnPack) = NM_ITEMDISABLED ;
  505.         ClearMenus() ;
  506.         SetupMenus() ;
  507.         FreeCrMem() ;
  508.     }
  509.     return TRUE ;
  510. }
  511. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  512. BOOL    Crunch (VOID)        //    main crunch function..
  513. {
  514.     WORD    err ;
  515.  
  516.     if (pac.pass) {
  517.         if (NOT EnterPassword())
  518.             return FALSE ;
  519.         checksum = ppCalcChecksum (password) ;
  520.         crypted = TRUE ;
  521.     }
  522.     else
  523.         crypted = FALSE ;
  524.  
  525.     if (NOT sup.cli) {
  526.         SetPointer (Wnd,waitPointer,22L,15L,0L,0L) ;
  527.         SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_LOADING),TAG_DONE) ;
  528.         SETGA (Gadgets[GDX_Save],  Wnd,NULL,GA_Disabled,TRUE,TAG_DONE) ;
  529.         FillGauge (0,0) ;
  530.         FreeCrMem() ;
  531.     }
  532.     else if (sup.verb) {
  533.         Printf ("\033[32mPPMC:\033[31m %s...",LOC(MSG_CLI_LOADING_FILE)) ;
  534.         Flush (Output()) ;
  535.     }
  536.  
  537.     //    allocating the Crunching Informations..
  538.     crin = ppAllocCrunchInfo ((ULONG)pac.eff,(ULONG)pac.buf,sup.verb?CrStatus:NULL,NULL) ;
  539.     if (NOT crin) {
  540.         if (sup.cli)
  541.             Printf ("\n\033[32mPPMC:\033[31m %s\n",LOC(MSG_ERROR_MEMORY)) ;
  542.         else {
  543.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  544.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_MEMORY)) ;
  545.             crypted  = FALSE ;
  546.         }
  547.         return (FALSE) ;
  548.     }
  549.  
  550.     //    loading the file to Pack..
  551.     err = ppLoadData (name.new,(ULONG)pac.dec,NULL,&cdata,&csize,FALSE) ;
  552.     if (err) {
  553.         //    note: ppErrorMessage() is not localized !..
  554.         if (sup.cli)
  555.             Printf ("\n\033[32mPPMC:\033[31m %s\n",ppErrorMessage(err)) ;
  556.         else {
  557.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  558.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,ppErrorMessage(err)) ;
  559.             SETGA (Gadgets[GDX_Status],   Wnd, NULL, GTTX_Text,   LOC(MSG_STATUS_ANOTHER), TAG_DONE) ;
  560.             SETGA (Gadgets[GDX_FileName], Wnd, NULL, GTTX_Text,   "", TAG_DONE) ;
  561.             SETGA (Gadgets[GDX_Size],      Wnd, NULL, GTNM_Number, 0L, TAG_DONE) ;
  562.             crypted = FALSE ;
  563.         }
  564.         ppFreeCrunchInfo (crin) ;
  565.         return (FALSE) ;
  566.     }
  567.     else
  568.         frpack = TRUE ;
  569.  
  570.     if (NOT sup.cli) {
  571.         SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_PACKING),TAG_DONE) ;
  572.         SETGA (Gadgets[GDX_Abort], Wnd,NULL,GA_Disabled,FALSE,TAG_DONE) ;
  573.         SetAPen (WRP,sup.apen) ;
  574.         SetBPen (WRP,1) ;
  575.     }
  576.  
  577.     //    crunching..
  578.     clen = ppCrunchBuffer (crin,cdata,csize) ;
  579.     if (sup.cli) {
  580.         switch (clen) {
  581.             case PP_CRUNCHABORTED :
  582.                 break ;
  583.  
  584.             case PP_BUFFEROVERFLOW :
  585.                 Printf ("\n\033[32mPPMC:\033[31m %s\n",LOC(MSG_ERROR_OVERFLOW)) ;
  586.                 break ;
  587.  
  588.             default :
  589.                 if (pac.pass)    //    checking wether or not to crypt the file..
  590.                     ppDecrypt (cdata,clen -4,ppCalcPasskey(password)) ;
  591.                 Printf ("\r\033[32mPPMC:\033[31m 100%% %s , %02ld%% %s",LOC(MSG_PER_PACKED),100L-(clen*100L+800L)/csize,LOC(MSG_PER_GAINED)) ;
  592.                 return TRUE ;
  593.         }
  594.     }
  595.     else {
  596.         SETGA (Gadgets[GDX_Abort],Wnd,NULL,GA_Disabled,TRUE,TAG_DONE) ;
  597.         switch (clen) {
  598.             case PP_CRUNCHABORTED :
  599.                 SETGA (Gadgets[GDX_Size],Wnd,NULL,GTNM_Number,csize,TAG_DONE) ;
  600.                 break ;
  601.  
  602.             case PP_BUFFEROVERFLOW :
  603.                 REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  604.                 rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,LOC(MSG_ERROR_OVERFLOW)) ;
  605.                 break ;
  606.  
  607.             default :
  608.                 if (pac.pass)    //    checking wether or not to crypt the file..
  609.                     ppDecrypt (cdata,clen-4,ppCalcPasskey(password)) ;
  610.  
  611.                 DisplayBeep (Scr) ;
  612.  
  613.                 SETGA (Gadgets[GDX_Status],    Wnd, NULL, GTTX_Text,    LOC(MSG_STATUS_PACKED),         TAG_DONE) ;
  614.                 SETGA (Gadgets[GDX_Size],    Wnd, NULL, GTNM_Number,    clen+8L,                     TAG_DONE) ;
  615.                 SETGA (Gadgets[GDX_Gained],    Wnd, NULL, GTNM_Number,    100L-(clen*100L+800L)/csize, TAG_DONE) ;
  616.                 SETGA (Gadgets[GDX_Packed],    Wnd, NULL, GTNM_Number,    100L,                         TAG_DONE) ;
  617.                 SETGA (Gadgets[GDX_Save],    Wnd, NULL, GA_Disabled,    FALSE,                         TAG_DONE) ;
  618.                 FillGauge (sup.apen,1) ;
  619.  
  620.                 NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = 0 ;
  621.                 ClearMenus() ;
  622.                 SetupMenus() ;
  623.  
  624.                 return TRUE ;
  625.         }
  626.         SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_START_PACK),TAG_DONE) ;
  627.         FillGauge (0,0) ;
  628.         FreeCrMem() ;
  629.         crypted = FALSE ;
  630.     }
  631.     return (FALSE) ;
  632. }
  633. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  634. //    this is the callback function called during the crunching..
  635. BOOL    __stdargs __saveds CrStatus (ULONG sofar, ULONG crunlen, ULONG totlen, APTR userdata)
  636. {
  637.     struct    IntuiMessage    *imsg ;
  638.  
  639.     if (sofar) {
  640.         REGISTER ULONG    packed = (sofar*100L)/totlen,
  641.                         gained = 100-(crunlen*100L)/sofar ;
  642.         if (sup.cli)
  643.             Printf ("\r\033[32mPPMC:\033[31m  %02ld%% %s , %02ld%% %s ",packed,LOC(MSG_PER_PACKED),gained,LOC(MSG_PER_GAINED)) ;
  644.         else {
  645.             SETGA (Gadgets[GDX_Size],    Wnd, NULL, GTNM_Number, crunlen, TAG_DONE) ;
  646.             SETGA (Gadgets[GDX_Gained],    Wnd, NULL, GTNM_Number, gained,  TAG_DONE) ;
  647.             SETGA (Gadgets[GDX_Packed],    Wnd, NULL, GTNM_Number, packed,  TAG_DONE) ;
  648.             RectFill (WRP,27,WBT+72,27+216*sofar/totlen,WBT+85) ;
  649.         }
  650.     }
  651.     if (sup.cli)
  652.         chkabort() ;
  653.     else if (imsg = GT_GetIMsg (Wnd->UserPort)) {
  654.         if ((imsg->Class == IDCMP_VANILLAKEY && imsg->Code == 0x1b) ||
  655.             (imsg->Class == IDCMP_GADGETUP   && ((struct Gadget *)(imsg->IAddress))->GadgetID == GDX_Abort))
  656.         {
  657.             REQTITLE = (ULONG)LOC(MSG_TITLE_WARNING) ;
  658.             return (BOOL)(NOT rtEZRequest ("%s",LOC(MSG_OK_RESUME),NULL,rttags,LOC(MSG_CRUNCH_ABORTED))) ;
  659.         }
  660.         else
  661.             GT_ReplyIMsg (imsg) ;
  662.     }
  663.     return TRUE ;
  664. }
  665. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  666. BOOL    Decrunch (VOID)        //    decrunch function..
  667. {
  668.     WORD    err ;
  669.  
  670.     if (NOT sup.cli) {
  671.         SetPointer (Wnd,waitPointer,22L,15L,0L,0L) ;
  672.         SETGA (Gadgets[GDX_Status],Wnd,NULL,GTTX_Text,LOC(MSG_STATUS_UNPACKING),TAG_DONE) ;
  673.     }
  674.     else if (NOT crypted) {
  675.         Printf ("\033[32mPPMC:\033[31m%s",LOC(MSG_STATUS_UNPACKING)) ;
  676.         Flush (Output()) ;
  677.     }
  678.  
  679.     err = ppLoadData (name.new,(ULONG)pac.dec,NULL,&cdata,&csize,AskPassword) ;
  680.     if (err) {
  681.         if (sup.cli)
  682.             _CXBRK() ;
  683.         else {
  684.             REQTITLE = (ULONG)LOC(MSG_TITLE_ERROR) ;
  685.             rtEZRequest ("%s !",LOC(MSG_OK_ABORT),NULL,rttags,ppErrorMessage(err)) ;
  686.             if (err != PP_PASSERR) {
  687.                 SETGA (Gadgets[GDX_Status],     Wnd,NULL,GTTX_Text,  LOC(MSG_STATUS_ANOTHER),TAG_DONE) ;
  688.                 SETGA (Gadgets[GDX_FileName],Wnd,NULL,GTTX_Text,  "",TAG_DONE) ;
  689.                 SETGA (Gadgets[GDX_Size],     Wnd,NULL,GTNM_Number,0L,TAG_DONE) ;
  690.             }
  691.             return FALSE ;
  692.         }
  693.     }
  694.     else
  695.         frunpack = TRUE ;
  696.  
  697.     if (NOT sup.cli) {
  698.         DisplayBeep (Scr) ;
  699.  
  700.         SETGA (Gadgets[GDX_Status],    Wnd, NULL, GTTX_Text,    LOC(MSG_STATUS_UNPACKED), TAG_DONE) ;
  701.         SETGA (Gadgets[GDX_Size],    Wnd, NULL, GTNM_Number,    csize,                      TAG_DONE) ;
  702.         SETGA (Gadgets[GDX_Gained],    Wnd, NULL, GTNM_Number,    100L-(100L*csize/fsize),  TAG_DONE) ;
  703.         SETGA (Gadgets[GDX_Packed],    Wnd, NULL, GTNM_Number,    100L,                      TAG_DONE) ;
  704.         SETGA (Gadgets[GDX_Save],    Wnd, NULL, GA_Disabled,    FALSE,                      TAG_DONE) ;
  705.         FillGauge (sup.apen,1) ;
  706.  
  707.         NMFLAG(NM_Project_Save) = NMFLAG(NM_Project_SaveAs) = 0 ;
  708.         ClearMenus() ;
  709.         SetupMenus() ;
  710.     }
  711.  
  712.     clen = csize ;
  713.     return TRUE ;
  714. }
  715. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  716. //    custom password prompting functions..
  717. BOOL    EnterPassword (VOID)
  718. {
  719.     char    pass[17], verify[17],
  720.             l, n ;
  721.     BOOL    again = TRUE ;
  722.  
  723.     pass[0] = verify[0] = '\0' ;
  724.     FOREVER {
  725.         if (sup.cli) {
  726.             Printf ("\033[32mPPMC:\033[31m %s : ",again?LOC(MSG_ENTER_PASSWORD):LOC(MSG_REENTER_PASSWORD)) ;
  727.             Flush (Output()) ;
  728.             n = 0 ;
  729.             FOREVER {
  730.                 l = n<16?getch():'\r' ;
  731.                 if (l==0x1b||(l=='\r'&&!n))
  732.                     _CXBRK() ;
  733.                 if (l=='\r') {
  734.                     if (again)
  735.                         pass[n] = '\0' ;
  736.                     else
  737.                         verify[n] = '\0' ;
  738.                     break ;
  739.                 }
  740.                 if (again)
  741.                     pass[n++] = l ;
  742.                 else
  743.                     verify[n++] = l ;
  744.                 Printf("\033[1m·\033[0m") ;
  745.                 Flush (Output()) ;
  746.             }
  747.             WriteChar('\n') ;
  748.         }
  749.         else if (NOT rtGetString(again?pass:verify,16L,again?"PPMC":LOC(MSG_VERIFICATION),NULL,RTGS_Invisible,TRUE,RTGS_TextFmt,again?LOC(MSG_ENTER_PASSWORD):LOC(MSG_REENTER_PASSWORD),TAG_MORE,rttags))
  750.             return FALSE ;
  751.  
  752.         if (NOT again) {
  753.             if (NOT strcmp(pass,verify)) {
  754.                 strcpy (password,pass) ;
  755.                 return TRUE ;
  756.             }
  757.             else if (NOT sup.cli)
  758.                 DisplayBeep (Scr) ;
  759.             pass[0] = verify[0] = '\0' ;
  760.         }
  761.         again = NOT again ;
  762.     }
  763. }
  764. BOOL    __stdargs __saveds AskPassword (UBYTE *password, ULONG checksum)
  765. {
  766.     char    pass[17] ;
  767.     UBYTE    try,l,n ;
  768.  
  769.     for (try=1 ; try<4 ; try++) {
  770.         if (sup.cli) {
  771.             Printf ("%s\033[32m[%ld]PPMC:\033[31m %s : ",(try>1?"\n":""),try,LOC(MSG_ENTER_PASSWORD)) ;
  772.             Flush (Output()) ;
  773.             n = 0 ;
  774.             FOREVER {
  775.                 l = n<16?getch():'\r' ;
  776.                 if (l==0x1b)
  777.                     return FALSE ;
  778.                 if (l=='\r') {
  779.                     pass[n] = '\0' ;
  780.                     break ;
  781.                 }
  782.                 pass[n++] = l ;
  783.                 Printf("\033[1m·\033[0m") ;
  784.                 Flush (Output()) ;
  785.             }
  786.         }
  787.         else {
  788.             pass[0] = '\0' ;
  789.             if (NOT rtGetString (pass,16L,"PPMC",NULL,RTGS_Invisible,TRUE,RTGS_TextFmt,LOC(MSG_ENTER_PASSWORD),TAG_MORE,rttags))
  790.                 break ;
  791.         }
  792.  
  793.         if (ppCalcChecksum(pass) == checksum) {
  794.             strcpy (password,pass) ;
  795.             if (sup.cli) {
  796.                 Printf ("\n\033[32mPPMC:\033[31m%s",LOC(MSG_STATUS_UNPACKING)) ;
  797.                 Flush (Output()) ;
  798.             }
  799.             return TRUE ;
  800.         }
  801.     }
  802.     return FALSE ;
  803. }
  804. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  805. VOID    FillGauge (UBYTE apen, UBYTE bpen)
  806. {
  807.     SetAPen (WRP,apen) ;
  808.     SetBPen (WRP,bpen) ;
  809.     RectFill (WRP,27,WBT+72,243,WBT+85) ;
  810.     gauge = (apen?FULL:EMPTY) ;
  811. }
  812. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  813. VOID    FreeCrMem (VOID)
  814. {
  815.     if (frpack||frunpack) {
  816.         FreeMem (cdata,csize) ;
  817.         if (frpack)
  818.             ppFreeCrunchInfo (crin) ;
  819.         frpack = frunpack = FALSE ;
  820.     }
  821. }
  822. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  823. VOID    MainLoop (VOID)        //    intuition interface loop..
  824. {
  825.     ULONG    appwinsig    = 1L << MsgPort->mp_SigBit,
  826.             winsig        = 1L << Wnd->UserPort->mp_SigBit,
  827.             globalsig    = ((AppWin?appwinsig:0)|winsig) ;
  828.  
  829.     FOREVER {
  830.         if (Wait (globalsig)) {
  831.             if (MsgPort && appwinsig) {
  832.                 struct    AppMessage    *amsg ;
  833.  
  834.                 while (amsg = (struct AppMessage *)GetMsg (MsgPort)) {
  835.                     NameFromLock (amsg->am_ArgList->wa_Lock,name.old,256) ;
  836.                     AddPart (name.old,amsg->am_ArgList->wa_Name,256L) ;
  837.                     ReplyMsg ((struct Message *)amsg) ;
  838.                     ActivateWindow (Wnd) ;
  839.                     Load (FALSE) ;
  840.                 }
  841.             }
  842.             if (winsig) {
  843.                 struct    IntuiMessage    *imsg ;
  844.                 struct    Gadget            *object ;
  845.                 struct    MenuItem        *item ;
  846.                 UWORD    code ;
  847.                 BOOL    loop ;
  848.  
  849.                 while (imsg = GT_GetIMsg (Wnd->UserPort)) {
  850.                     object    = imsg->IAddress;
  851.                     code    = imsg->Code ;
  852.                     loop    = TRUE ;
  853.  
  854.                     switch (imsg->Class) {
  855.                         case IDCMP_REFRESHWINDOW :
  856.                             GT_BeginRefresh (Wnd) ;
  857.                             Render() ;
  858.                             if (sup.fill)
  859.                                 GT_RefreshWindow (Wnd,NULL) ;
  860.                             GT_EndRefresh (Wnd,TRUE) ;
  861.                             if (gauge == FULL)
  862.                                 FillGauge (sup.apen,1) ;
  863.                             break ;
  864.  
  865.                         case IDCMP_GADGETUP :
  866.                             switch (object->GadgetID) {
  867.                                 case GDX_About :
  868.                                     About() ;
  869.                                     break ;
  870.  
  871.                                 case GDX_Load :
  872.                                     Load (TRUE) ;
  873.                                     break ;
  874.  
  875.                                 case GDX_Save :
  876.                                     Save (TRUE) ;
  877.                                     break ;
  878.  
  879.                                 case GDX_Pack :
  880.                                     Crunch() ;
  881.                                     ClearPointer (Wnd) ;
  882.                                     break ;
  883.  
  884.                                 case GDX_UnPack :
  885.                                     Decrunch() ;
  886.                                     ClearPointer (Wnd) ;
  887.                                     break ;
  888.  
  889.                                 case GDX_Encrypt :
  890.                                     pac.pass = NOT pac.pass ;
  891.                                     NMFLAG(NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
  892.                                     ClearMenus() ;
  893.                                     SetupMenus() ;
  894.                                     break ;
  895.  
  896.                                 case GDX_CrunEff :
  897.                                     pac.eff = (UBYTE)code ;
  898.                                     break ;
  899.  
  900.                                 case GDX_SUBuffer :
  901.                                     pac.buf = (UBYTE)code ;
  902.                                     break ;
  903.  
  904.                                 case GDX_DecrEff :
  905.                                     pac.dec = (UBYTE)code ;
  906.                                     break ;
  907.                             }
  908.                             break ;
  909.  
  910.                         case IDCMP_MENUPICK :
  911.                             while (loop && code !=MENUNULL) {
  912.                                 item = ItemAddress (Menus,code) ;
  913.  
  914.                                 switch (MENUNUM (code)) {
  915.                                     case 0 :        //    `Project' menu
  916.                                         switch (ITEMNUM (code)) {
  917.                                             case 0 :    //    About...
  918.                                                 About() ;
  919.                                                 break ;
  920.  
  921.                                             case 2 :    //    Load...
  922.                                                 Load (TRUE) ;
  923.                                                 loop = FALSE ;
  924.                                                 break ;
  925.  
  926.                                             case 3 :    //    Save
  927.                                             case 4 :    //    Save As...
  928.                                                 loop = NOT Save ((BOOL)(ITEMNUM(code)-3)) ;
  929.                                                 break ;
  930.  
  931.                                             case 6 :    //    Quit
  932.                                                 return ;
  933.                                         }
  934.                                         break ;
  935.  
  936.                                     case 1 :        //    `Parameters' menu
  937.                                         switch (ITEMNUM (code)) {
  938.                                             case 0 :    //    Efficiency
  939.                                                 pac.eff = SUBNUM (code) ;
  940.                                                 SETGA (Gadgets[GDX_CrunEff],Wnd,NULL,GTCY_Active,(UWORD)pac.eff,TAG_DONE) ;
  941.                                                 break ;
  942.  
  943.                                             case 1 :    //    Speedup Buffer
  944.                                                 pac.buf = SUBNUM (code) ;
  945.                                                 SETGA (Gadgets[GDX_SUBuffer],Wnd,NULL,GTCY_Active,(UWORD)pac.buf,TAG_DONE) ;
  946.                                                 break ;
  947.  
  948.                                             case 2 :    //    Decrunching Effect
  949.                                                 pac.dec = SUBNUM (code) ;
  950.                                                 SETGA (Gadgets[GDX_DecrEff],Wnd,NULL,GTCY_Active,(UWORD)pac.dec,TAG_DONE) ;
  951.                                                 break ;
  952.  
  953.                                             case 3 :    //    Encrypt File
  954.                                                 pac.pass = NOT pac.pass ;
  955.                                                 SETGA (Gadgets[GDX_Encrypt],Wnd,NULL,GTCB_Checked,pac.pass,TAG_DONE) ;
  956.                                                 break ;
  957.                                         }
  958.                                         break ;
  959.  
  960.                                     case 2 :    //    `Crunching' menu
  961.                                         ITEMNUM(code)?Decrunch():Crunch() ;
  962.                                         ClearPointer (Wnd) ;
  963.                                         loop = FALSE ;
  964.                                         break ;
  965.                                 }
  966.                                 code = item->NextSelect ;
  967.                             }
  968.                             break ;
  969.  
  970.                         case IDCMP_CLOSEWINDOW :
  971.                             return ;
  972.  
  973.                         case IDCMP_VANILLAKEY :
  974.                             if ((code==key.encrypt||code==key.encrypt+32)) {
  975.                                 pac.pass = NOT pac.pass ;
  976.                                 SETGA (Gadgets[GDX_Encrypt],Wnd,NULL,GTCB_Checked,pac.pass,TAG_DONE) ;
  977.                                 NMFLAG(NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
  978.                                 ClearMenus() ;
  979.                                 SetupMenus() ;
  980.                             }
  981.                             else if ((code==key.pack||code==key.pack+32) && NOT NMFLAG(NM_Crunching_Pack)) {
  982.                                 Crunch() ;
  983.                                 ClearPointer (Wnd) ;
  984.                             }
  985.                             else if ((code==key.unpack||code==key.unpack+32) && NOT NMFLAG(NM_Crunching_UnPack)) {
  986.                                 Decrunch() ;
  987.                                 ClearPointer (Wnd) ;
  988.                             }
  989.                             else if ((code==key.save||code==key.save+32) && NOT NMFLAG(NM_Project_Save))
  990.                                 Save (TRUE) ;
  991.                             break ;
  992.                     }
  993.                     GT_ReplyIMsg (imsg) ;
  994.                 }
  995.             }
  996.         }
  997.     }
  998. }
  999.  
  1000. //    ...