home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / POPCLIIV.LHA / popcliIV / sources / popcliIV.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-13  |  18.3 KB  |  650 lines

  1. /* PopCli IV V1.01
  2. ** Copyright (c) 1993 Max Favilli
  3. **
  4. **
  5. **    Massimiliano Favilli
  6. **    Via Livornese Est  N.9
  7. **    Perignano (Pisa) 56030
  8. **    Italy
  9. **
  10. **    Email: mc6254@mclink.it
  11. **
  12. **
  13. ** Developed with:
  14. **    SAS/C 5.10b
  15. **    TurboText 1.03
  16. **    GadToolsBox v1.3
  17. **
  18. **
  19. ** Some Note:
  20. **
  21. **    No, nothing... :)
  22. **
  23. */
  24.  
  25. #include "psdata.h"
  26. #include "pchelp.h"
  27.  
  28. #ifdef LATTICE
  29. int CXBRK(void) { return(0); }  /* Disable Lattice CTRL/C handling */
  30. void chkabort(void) { return; }
  31. #endif
  32.  
  33. #define EVT_HELPME   1L
  34. #define EVT_POPCLI   2L
  35. #define EVT_LOOKFOR  3L
  36. #define EVT_QUIT     7L
  37.  
  38. #define STDquit      "lcommand ctrl esc"
  39. #define STDpopcli    "lcommand esc"
  40. #define STDhelpme    "lcommand alt help"
  41. #define STDlookfor   "rcommand esc"
  42.  
  43. #define MAXSTRLEN    256
  44.  
  45. #define PORT_SIG     1L << PROSET.mp->mp_SigBit
  46. #define WND_SIG      1L << PopCliIVWnd->UserPort->mp_SigBit
  47.  
  48. extern int   strfnd(     char *,  char *   );
  49. //           ^^^^^^ from mylib.o
  50.  
  51. UBYTE *vers = "\0$VER: PopCLI IV v1.01";
  52.  
  53. struct Library       *GadToolsBase,
  54.                      *CxBase,
  55.                      *IconBase;
  56. struct IntuitionBase *IntuitionBase;
  57. struct GfxBase       *GfxBase;
  58. struct LayersBase    *LayersBase;
  59.  
  60. void  main(             int,  char **  );
  61. BOOL  AddAll(           void  );
  62. BOOL  AddQuit(          void  );
  63. BOOL  AddPopCli(        void  );
  64. BOOL  AddHelpMe(        void  );
  65. BOOL  AddLookFor(       void  );
  66. LONG  ProcessMsg(       void  );
  67. LONG  HandleCxMsg(      void  );
  68. LONG  HandleWndMsg(     void  );
  69. void  Help(             void  );
  70. void  LookFor(          void  );
  71. BOOL  SetUpAll(         void  );
  72. void  CleanAll(         void  );
  73.  
  74. GLOBAL_DATA PROSET;
  75.  
  76. CxObj *quit_filter,     *quit_sender,     *quit_translate,
  77.       *popcli_filter,   *popcli_sender,   *popcli_translate,
  78.       *helpme_filter,   *helpme_sender,   *helpme_translate,
  79.       *lookfor_filter,  *lookfor_sender,  *lookfor_translate;
  80.  
  81. struct NewBroker proset_newbroker = {
  82.     NB_VERSION,
  83.     "PopCliIV",           /* string to identify this broker */
  84.     "run a NewShell with a shortcut",
  85.     "Show help window for more info",
  86.     NBU_UNIQUE | NBU_NOTIFY,      /* Don't want any new commodities
  87.                                    * starting with this name.  If someone
  88.                                    * tries it, let me know */
  89.     COF_SHOW_HIDE,
  90.     0,
  91.     0,
  92.     0
  93. };
  94.  
  95.  
  96.  
  97. /*
  98. long _BackGroundIO = 0;
  99. long _stack = 4000;
  100. char *_procname = "PopCliIV";
  101. long _priority = 0;
  102. */
  103.  
  104. void main(int argc, char **argv)
  105. {
  106.    struct WBStartup  *WBenchMsg;
  107.    struct WBArg      *wbarg;
  108.    struct DiskObject *dobj;
  109.    char              **toolarray;
  110.    char              *s;
  111.    BOOL               popupflag;
  112.  
  113.    if( SetUpAll() )
  114.    {
  115.       if( IconBase = OpenLibrary("icon.library", 36L) )
  116.       {
  117.          proset_newbroker.nb_Pri = 0;
  118.          strcpy( PROSET.quit,       STDquit );
  119.          strcpy( PROSET.popcli,     STDpopcli );
  120.          strcpy( PROSET.popclicmd,  "newshell con:0/11/640/200/AmigaShell/close" );
  121.          PROSET.popcliflag    = TRUE;
  122.          strcpy( PROSET.helpme,     STDhelpme );
  123.          strcpy( PROSET.lookfor,    STDlookfor );
  124.          if( argc==0 )
  125.          {
  126.             WBenchMsg = (struct WBStartup *)argv;
  127.             wbarg     = WBenchMsg->sm_ArgList;
  128.  
  129.             if( (*wbarg->wa_Name) && (dobj=GetDiskObject(wbarg->wa_Name)) )
  130.             {
  131.                toolarray= (char **)dobj->do_ToolTypes;
  132.                if( s = (char *)FindToolType(toolarray,"CX_PRIORITY") )
  133.                   proset_newbroker.nb_Pri = atoi(s);
  134.                if( s = (char *)FindToolType(toolarray,"CX_QUIT") )
  135.                   strcpy(PROSET.quit,s);
  136.                if( s = (char *)FindToolType(toolarray,"POPCLI") )
  137.                   strcpy(PROSET.popcli,s);
  138.                if( s = (char *)FindToolType(toolarray,"POPCLICMD") )
  139.                   strcpy(PROSET.popclicmd,s);
  140.                if( s = (char *)FindToolType(toolarray,"CX_POPKEY") )
  141.                   strcpy(PROSET.helpme,s);
  142.                if( s = (char *)FindToolType(toolarray,"CX_POPUP") )
  143.                {
  144.                   if( MatchToolValue(s,"YES") )
  145.                      popupflag = TRUE;
  146.                   if( MatchToolValue(s,"NO") )
  147.                      popupflag = FALSE;
  148.                }
  149.                if( s = (char *)FindToolType(toolarray,"LOOKFORCLI") )
  150.                   strcpy(PROSET.lookfor,s);
  151.  
  152.                FreeDiskObject(dobj);
  153.             }
  154.          }
  155.  
  156.          proset_newbroker.nb_Port = PROSET.mp;
  157.  
  158.          if( PROSET.broker = CxBroker(&proset_newbroker, NULL) )
  159.          {
  160.             if( AddAll() )
  161.             {
  162.                ActivateCxObj(PROSET.broker, 1L);
  163.                if( popupflag )
  164.                   Help();
  165.                while( ProcessMsg() )
  166.                   ;
  167.             }
  168.          }
  169.          CloseLibrary(IconBase);
  170.       }
  171.    }
  172.    CleanAll();
  173. }
  174.  
  175. BOOL AddAll(   void )
  176. {
  177.    return( AddQuit() && AddPopCli() && AddHelpMe() && AddLookFor() );
  178. }
  179.  
  180. BOOL AddQuit( void )
  181. {
  182.    if( !(quit_filter = CxFilter(PROSET.quit)) ){
  183.       strcpy( PROSET.quit, STDquit );
  184.       quit_filter = CxFilter(PROSET.quit);
  185.    }
  186.    AttachCxObj(PROSET.broker, quit_filter);
  187.    if( quit_sender = CxSender(PROSET.mp, EVT_QUIT) )
  188.    {
  189.       AttachCxObj(quit_filter, quit_sender);
  190.       if( quit_translate = (CxTranslate(NULL)) )
  191.       {
  192.          AttachCxObj(quit_filter, quit_translate);
  193.          if( !CxObjError(quit_filter))
  194.             return(TRUE);
  195.       }
  196.    }
  197.    return(FALSE);
  198. }
  199.  
  200. BOOL AddPopCli( void )
  201. {
  202.    if( popcli_filter = CxFilter(PROSET.popcli) )
  203.       PROSET.popcliflag = TRUE;
  204.    else{
  205.       PROSET.popcliflag = FALSE;
  206.       strcpy( PROSET.popcli, STDpopcli );
  207.       popcli_filter = CxFilter(PROSET.popcli);
  208.    }
  209.    AttachCxObj(PROSET.broker, popcli_filter);
  210.    if( popcli_sender = CxSender(PROSET.mp, EVT_POPCLI) )
  211.    {
  212.       AttachCxObj(popcli_filter, popcli_sender);
  213.       if( popcli_translate = (CxTranslate(NULL)) )
  214.       {
  215.          AttachCxObj(popcli_filter, popcli_translate);
  216.          if( !CxObjError(popcli_filter))
  217.             return(TRUE);
  218.       }
  219.    }
  220.  
  221.    return(FALSE);
  222. }
  223.  
  224. BOOL AddHelpMe( void )
  225. {
  226.    if( !(helpme_filter = CxFilter(PROSET.helpme)) )
  227.    {
  228.       strcpy( PROSET.helpme, STDhelpme );
  229.       helpme_filter = CxFilter(PROSET.helpme);
  230.    }
  231.    AttachCxObj(PROSET.broker, helpme_filter);
  232.    if( helpme_sender = CxSender(PROSET.mp, EVT_HELPME) )
  233.    {
  234.       AttachCxObj(helpme_filter, helpme_sender);
  235.       if( helpme_translate = (CxTranslate(NULL)) )
  236.       {
  237.          AttachCxObj(helpme_filter, helpme_translate);
  238.          if( !CxObjError(helpme_filter))
  239.             return(TRUE);
  240.       }
  241.    }
  242.    return(FALSE);
  243. }
  244.  
  245. BOOL AddLookFor( void )
  246. {
  247.    if( !(lookfor_filter = CxFilter(PROSET.lookfor)) )
  248.    {
  249.       strcpy( PROSET.lookfor, STDlookfor );
  250.       lookfor_filter = CxFilter(PROSET.lookfor);
  251.    }
  252.    AttachCxObj(PROSET.broker, lookfor_filter);
  253.    if( lookfor_sender = CxSender(PROSET.mp, EVT_LOOKFOR) )
  254.    {
  255.       AttachCxObj(lookfor_filter, lookfor_sender);
  256.       if( lookfor_translate = (CxTranslate(NULL)) )
  257.       {
  258.          AttachCxObj(lookfor_filter, lookfor_translate);
  259.          if( !CxObjError(lookfor_filter))
  260.             return(TRUE);
  261.       }
  262.    }
  263.    return(FALSE);
  264. }
  265.  
  266. LONG ProcessMsg(void)
  267. {
  268.    ULONG cxsigflag = PORT_SIG;
  269.    ULONG sigrcvd;
  270.    LONG returnvalue = 1L;
  271.  
  272.    if(PopCliIVWnd)
  273.       sigrcvd = Wait( SIGBREAKF_CTRL_C | cxsigflag | WND_SIG );
  274.    else
  275.       sigrcvd = Wait( SIGBREAKF_CTRL_C | cxsigflag );
  276.  
  277.    if( sigrcvd & cxsigflag )
  278.       returnvalue = HandleCxMsg();
  279.  
  280.    if( PopCliIVWnd && (sigrcvd & WND_SIG) )
  281.       returnvalue = HandleWndMsg();
  282.  
  283.    if (sigrcvd & SIGBREAKF_CTRL_C)
  284.        returnvalue = 0L;
  285.  
  286.    return( returnvalue );
  287. }
  288.  
  289. LONG HandleCxMsg( void )
  290. {
  291.    struct InputEvent *L_IEvent;
  292.    CxMsg *msg;
  293.    ULONG msgid, msgtype;
  294.    LONG returnvalue = 1L;
  295.  
  296.    while(msg = (CxMsg *)GetMsg(PROSET.mp))
  297.    {
  298.       msgtype  = CxMsgType(msg);
  299.       L_IEvent = (struct InputEvent *)CxMsgData(msg);
  300.       msgid    = CxMsgID(msg);
  301.       ReplyMsg((struct Message *)msg);
  302.  
  303.       switch(msgtype)
  304.       {
  305.          case CXM_IEVENT:
  306.             switch(msgid)
  307.             {
  308.                case EVT_QUIT:
  309.                   returnvalue = 0L;
  310.                   break;
  311.                case EVT_HELPME:
  312.                   if( !PopCliIVWnd )
  313.                      Help();
  314.                   break;
  315.                case EVT_LOOKFOR:
  316.                   LookFor();
  317.                   break;
  318.                case EVT_POPCLI:
  319.                {
  320.                   BPTR  nullfh;
  321.  
  322.                   if( nullfh = Open("NIL:", MODE_NEWFILE) )
  323.                   {
  324.                      WBenchToFront();
  325.                      (void)Execute(PROSET.popclicmd,nullfh,nullfh);
  326.                      Close(nullfh);
  327.                   }
  328.  
  329.                   break;
  330.                }
  331.  
  332.                default:
  333.                   /* unknown. */
  334.                   break;
  335.             }
  336.             break;
  337.  
  338.          case CXM_COMMAND:
  339.             switch(msgid)
  340.             {
  341.                case CXCMD_DISABLE:
  342.                   ActivateCxObj(PROSET.broker, 0L);
  343.                   break;
  344.                case CXCMD_ENABLE:
  345.                   ActivateCxObj(PROSET.broker, 1L);
  346.                   break;
  347.                case CXCMD_KILL:
  348.                   returnvalue = 0L;
  349.                   break;
  350.                case CXCMD_APPEAR:
  351.                   if( !PopCliIVWnd )
  352.                   {
  353.                      Help();
  354.                   }
  355.                   break;
  356.                case CXCMD_DISAPPEAR:
  357.                   if( PopCliIVWnd )
  358.                   {
  359.                      ClosePopCliIVWindow();
  360.                      CloseDownScreen();
  361.                   }
  362.                   break;
  363.                case CXCMD_UNIQUE:
  364.                   returnvalue = 0L;
  365.                   break;
  366.  
  367.                default:
  368.                   /* Unknown msgid */
  369.                   break;
  370.             }
  371.             break;
  372.          default:
  373.             /* Unknown msgtype */
  374.             break;
  375.       }
  376.    }
  377.  
  378.    return( returnvalue );
  379. }
  380.  
  381. LONG HandleWndMsg( void )
  382. {
  383.    struct IntuiMessage  *imsg;
  384.    struct IntuiMessage  *Hmsg;
  385.    struct Gadget        *gad;
  386.    LONG returnvalue = 1L;
  387.  
  388.    if( !(Hmsg = (struct IntuiMessage *)AllocMem(sizeof(struct IntuiMessage),MEMF_CLEAR)) )
  389.    {
  390.       if( PopCliIVWnd )
  391.       {
  392.          ClosePopCliIVWindow();
  393.          CloseDownScreen();
  394.       }
  395.       return(0L);
  396.    }
  397.  
  398.    while( PopCliIVWnd && (imsg = GT_GetIMsg(PopCliIVWnd->UserPort)) )
  399.    {
  400.       CopyMem( (char *)imsg, (char *)Hmsg, sizeof(struct IntuiMessage) );
  401.       GT_ReplyIMsg(imsg);
  402.       switch( Hmsg->Class )
  403.       {
  404.          case IDCMP_GADGETUP:
  405.             gad = (struct Gadget *)Hmsg->IAddress;
  406.             switch( gad->GadgetID )
  407.             {
  408.                case GD_popcli_sc:
  409.                {
  410.                   LONG  error;
  411.                   IX    popcli_ix;
  412.  
  413.                   if( !(error=ParseIX( ((struct StringInfo *)gad->SpecialInfo)->Buffer,
  414.                                        &popcli_ix)) )
  415.                   {
  416.                      strcpy( PROSET.popcli,
  417.                              ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  418.                      if( PROSET.broker )
  419.                      {
  420.                         DeleteCxObjAll(PROSET.broker);
  421.                         if( PROSET.broker = CxBroker(&proset_newbroker, NULL) )
  422.                         {
  423.                            if( AddAll() )
  424.                            {
  425.                               ActivateCxObj(PROSET.broker, 1L);
  426.                            }
  427.                         }
  428.                      }
  429.                   }else{
  430.                      GT_SetGadgetAttrs( PopCliIVGadgets[GDX_popcli_sc],
  431.                                         PopCliIVWnd, NULL,
  432.                                         GTST_String, PROSET.popcli,
  433.                                         TAG_END );
  434.                   }
  435.                   break;
  436.                }
  437.                case GD_popcli_cmd:
  438.                   strcpy( PROSET.popclicmd,
  439.                           ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  440.                   break;
  441.                case GD_help_sc:
  442.                {
  443.                   LONG  error;
  444.                   IX    helpme_ix;
  445.  
  446.                   if( !(error=ParseIX( ((struct StringInfo *)gad->SpecialInfo)->Buffer,
  447.                                        &helpme_ix)) )
  448.                   {
  449.                      strcpy( PROSET.helpme,
  450.                              ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  451.                      if( PROSET.broker )
  452.                      {
  453.                         DeleteCxObjAll(PROSET.broker);
  454.                         if( PROSET.broker = CxBroker(&proset_newbroker, NULL) )
  455.                         {
  456.                            if( AddAll() )
  457.                            {
  458.                               ActivateCxObj(PROSET.broker, 1L);
  459.                            }
  460.                         }
  461.                      }
  462.                   }else{
  463.                      GT_SetGadgetAttrs( PopCliIVGadgets[GDX_help_sc],
  464.                                         PopCliIVWnd, NULL,
  465.                                         GTST_String, PROSET.helpme,
  466.                                         TAG_END );
  467.                   }
  468.  
  469.                   break;
  470.                }
  471.                case GD_lookfor_sc:
  472.                {
  473.                   LONG  error;
  474.                   IX    lookfor_ix;
  475.  
  476.                   if( !(error=ParseIX( ((struct StringInfo *)gad->SpecialInfo)->Buffer,
  477.                                        &lookfor_ix)) )
  478.                   {
  479.                      strcpy( PROSET.lookfor,
  480.                              ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  481.                      if( PROSET.broker )
  482.                      {
  483.                         DeleteCxObjAll(PROSET.broker);
  484.                         if( PROSET.broker = CxBroker(&proset_newbroker, NULL) )
  485.                         {
  486.                            if( AddAll() )
  487.                            {
  488.                               ActivateCxObj(PROSET.broker, 1L);
  489.                            }
  490.                         }
  491.                      }
  492.                   }else{
  493.                      GT_SetGadgetAttrs( PopCliIVGadgets[GDX_lookfor_sc],
  494.                                         PopCliIVWnd, NULL,
  495.                                         GTST_String, PROSET.lookfor,
  496.                                         TAG_END );
  497.                   }
  498.                   break;
  499.                }
  500.                case GD_quit:
  501.                   ClosePopCliIVWindow();
  502.                   CloseDownScreen();
  503.                   returnvalue = FALSE;
  504.                   break;
  505.                case GD_hide:
  506.                   ClosePopCliIVWindow();
  507.                   CloseDownScreen();
  508.                   break;
  509.  
  510.                default:
  511.                   break;
  512.             }
  513.             break;
  514.          case IDCMP_CLOSEWINDOW:
  515.             ClosePopCliIVWindow();
  516.             CloseDownScreen();
  517.             break;
  518.          case IDCMP_REFRESHWINDOW:
  519.             GT_BeginRefresh( PopCliIVWnd );
  520.             GT_EndRefresh( PopCliIVWnd, TRUE );
  521.             break;
  522.  
  523.          default:
  524.             break;
  525.       }
  526.    }
  527.  
  528.    FreeMem( Hmsg, sizeof(struct IntuiMessage) );
  529.    return( returnvalue );
  530. }
  531.  
  532.  
  533. void Help( void )
  534. {
  535.    if( !SetUpScreen() )
  536.       if( !OpenPopCliIVWindow() )
  537.       ;
  538. }
  539.  
  540. void LookFor( void )
  541. {
  542.    ULONG iblock;
  543.    struct Screen *scr;
  544.    struct Window *win;
  545.    struct Layer  *layer;
  546.  
  547.    iblock=LockIBase(0L);
  548.  
  549.    for( scr = IntuitionBase->FirstScreen;
  550.         scr;
  551.         scr = scr->NextScreen )
  552.    {
  553.       if( !strcmp(scr->DefaultTitle,"Workbench Screen") )
  554.       {
  555.          if( scr != IntuitionBase->FirstScreen )
  556.          {
  557.             win = scr->FirstWindow->WLayer->LayerInfo->top_layer->Window;
  558.             if( strfnd(win->Title,"shell")==strlen("shell"))
  559.             {
  560.                ScreenToFront(scr);
  561.                if( win != IntuitionBase->ActiveWindow )
  562.                   ActivateWindow(win);
  563.                break;
  564.             }
  565.          }
  566.          for( layer = scr->FirstWindow->WLayer;
  567.               layer && layer->Window;
  568.               layer = layer->back )
  569.             win=layer->Window;
  570.          for( layer = win->WLayer;
  571.               layer && layer->Window;
  572.               layer = layer->front )
  573.          {
  574.             win=layer->Window;
  575.             if( strfnd(win->Title,"shell")==strlen("shell"))
  576.             {
  577.                if( !(win->Flags & BACKDROP) )
  578.                   WindowToFront(win);
  579.                if( win != IntuitionBase->ActiveWindow )
  580.                   ActivateWindow(win);
  581.                if( scr != IntuitionBase->FirstScreen )
  582.                   ScreenToFront(scr);
  583.                break;
  584.             }
  585.          }
  586.  
  587.          break;
  588.       }
  589.    }
  590.  
  591.    UnlockIBase(iblock);
  592. }
  593.  
  594. BOOL SetUpAll( void )
  595. {
  596.    if( !(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 36L)) )
  597.       return( FALSE );
  598.    if( !(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 36L)) )
  599.       return( FALSE );
  600.    if( !(LayersBase = OpenLibrary("layers.library", 36)) )
  601.       return(FALSE);
  602.    if( !(CxBase = OpenLibrary("commodities.library", 37L)) )
  603.       return( FALSE );
  604.    if( !(GadToolsBase = (struct GadToolsBase *)OpenLibrary("gadtools.library", 37L)) )
  605.       return( FALSE );
  606.    if( !(PROSET.mp = CreateMsgPort()) )
  607.       return( FALSE );
  608.  
  609.    if( !(PROSET.quit       = AllocMem( MAXSTRLEN, MEMF_CLEAR )) )
  610.       return( FALSE );
  611.    if( !(PROSET.popcli     = AllocMem( MAXSTRLEN, MEMF_CLEAR )) )
  612.       return( FALSE );
  613.    if( !(PROSET.popclicmd  = AllocMem( MAXSTRLEN, MEMF_CLEAR )) )
  614.       return( FALSE );
  615.    if( !(PROSET.helpme     = AllocMem( MAXSTRLEN, MEMF_CLEAR )) )
  616.       return( FALSE );
  617.    if( !(PROSET.lookfor    = AllocMem( MAXSTRLEN, MEMF_CLEAR )) )
  618.       return( FALSE );
  619. }
  620.  
  621. void CleanAll( void )
  622. {
  623.    CxMsg *msg;
  624.  
  625.    if(PopCliIVWnd)
  626.    {
  627.       ClosePopCliIVWindow();
  628.       CloseDownScreen();
  629.    }
  630.  
  631.    if( PROSET.broker )     DeleteCxObjAll(PROSET.broker);
  632.    if( PROSET.quit )       FreeMem( PROSET.quit,      MAXSTRLEN );
  633.    if( PROSET.popcli )     FreeMem( PROSET.popcli,    MAXSTRLEN );
  634.    if( PROSET.popclicmd )  FreeMem( PROSET.popclicmd, MAXSTRLEN );
  635.    if( PROSET.helpme )     FreeMem( PROSET.helpme,    MAXSTRLEN );
  636.    if( PROSET.lookfor )    FreeMem( PROSET.lookfor,   MAXSTRLEN );
  637.    if( PROSET.mp )
  638.    {
  639.       while( msg = (CxMsg *)GetMsg(PROSET.mp))
  640.          ReplyMsg((struct Message *)msg);
  641.       DeletePort(PROSET.mp);
  642.    }
  643.  
  644.    if( GadToolsBase )      CloseLibrary((struct Library *)GadToolsBase);
  645.    if( CxBase )            CloseLibrary(CxBase);
  646.    if( LayersBase )        CloseLibrary(LayersBase);
  647.    if( GfxBase )           CloseLibrary((struct Library *)GfxBase);
  648.    if( IntuitionBase )     CloseLibrary((struct Library *)IntuitionBase);
  649. }
  650.