home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 568b.lha / PowerSource_v3.0 / source.lzh / source / mem.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  4KB  |  135 lines

  1. /*----------------------------------------------------------------------*
  2.   mem.c Version 3.0 -  © Copyright 1990-91 Jaba Development
  3.  
  4.   Author : Jan van den Baard
  5.   Purpose: Freeing the alocated memory the gadgets take up
  6.  *----------------------------------------------------------------------*/
  7.  
  8. extern struct Window      *MainWindow;
  9. extern struct GadgetList   Gadgets;
  10. extern struct BorderList   SBorders;
  11. extern struct MemoryChain  Memory;
  12. extern struct Gadget       TextGadget;
  13. extern USHORT              GadgetCount, id;
  14. extern BOOL                Saved;
  15.  
  16. /*
  17.  * Free the memory of any type off gadget rendering attached to the gadget.
  18.  */
  19. void FreeRender( struct MyGadget *gd )
  20. {
  21.     struct Image  *image;
  22.     struct Border *border, *border1;
  23.     struct Gadget *gadget;
  24.     ULONG         ps;
  25.  
  26.     gadget = &gd->Gadget;
  27.  
  28.     if(TestBits((ULONG)gadget->GadgetType,PROPGADGET)) {
  29.         image = (struct Image *)gadget->GadgetRender;
  30.         if(TestBits((ULONG)gadget->Flags,GADGIMAGE))
  31.             rem_user(image);
  32.         else
  33.             FreeItem(&Memory,image,(long)sizeof(struct Image));
  34.     } else if(TestBits((ULONG)gadget->Flags,GADGIMAGE)) {
  35.         image = (struct Image *)gadget->GadgetRender;
  36.         rem_user(image);
  37.     } else {
  38.         border = (struct Border *)gadget->GadgetRender;
  39.         if((TestBits((ULONG)gd->SpecialFlags,BORDERONLY)) OR
  40.            (TestBits((ULONG)gd->SpecialFlags,NOBORDER))) {
  41.             FreeItem(&Memory,border->XY,(long)(border->Count << 2));
  42.             FreeItem(&Memory,border,(long)sizeof(struct Border));
  43.         } else
  44.             RemUser(border);
  45.         if(TestBits((ULONG)gd->SpecialFlags,OS20HIGHBORDER)) {
  46.             border = (struct Border *)gadget->SelectRender;
  47.             RemUser(border);
  48.         }
  49.     }
  50.  
  51.     if((TestBits((ULONG)gadget->Flags,GADGHIMAGE)) AND
  52.        (NOT TestBits((ULONG)gadget->Flags,GADGHBOX)) AND
  53.        (NOT TestBits((ULONG)gd->SpecialFlags,OS20HIGHBORDER))) {
  54.         image = (struct Image *)gadget->SelectRender;
  55.         rem_user(image);
  56.     }
  57. }
  58.  
  59. /*
  60.  * Free the memory a gadget takes up.
  61.  */
  62. void FreeGadget( struct MyGadget *gadget )
  63. {
  64.     struct IntuiText  *itext,*tmp;
  65.     struct StringInfo *sinfo;
  66.  
  67.     if(TestBits((ULONG)gadget->Gadget.GadgetType,PROPGADGET)) {
  68.         if(gadget->Gadget.SpecialInfo)
  69.             FreeItem(&Memory,gadget->Gadget.SpecialInfo,(long)sizeof(struct PropInfo));
  70.     }
  71.  
  72.     FreeRender(gadget);
  73.  
  74.     itext = gadget->Gadget.GadgetText;
  75.  
  76.     if(itext) {
  77.         while(1) {
  78.             tmp = itext->NextText;
  79.             if(itext->IText) FreeItem(&Memory,itext->IText,80L);
  80.             FreeItem(&Memory,itext,(long)sizeof(struct IntuiText));
  81.             if(!tmp) break;
  82.             itext = tmp;
  83.         }
  84.     }
  85.  
  86.     if(TestBits((ULONG)gadget->Gadget.GadgetType,STRGADGET)) {
  87.         sinfo = (struct StringInfo *)gadget->Gadget.SpecialInfo;
  88.         if(sinfo->Buffer) {
  89.             FreeItem(&Memory,sinfo->Buffer,sinfo->MaxChars);
  90.         }
  91.         if(sinfo->UndoBuffer) {
  92.             FreeItem(&Memory,sinfo->UndoBuffer,sinfo->MaxChars);
  93.         }
  94.         FreeItem(&Memory,sinfo,(long)sizeof(struct StringInfo));
  95.     }
  96.     FreeItem(&Memory,gadget,(long)sizeof(struct MyGadget));
  97. }
  98.  
  99. /*
  100.  * Free the complete list of gadgets.
  101.  */
  102.  
  103. void FreeGList( void )
  104. {
  105.    struct MyGadget  *gadget, *tmp;
  106.    struct IntuiText *t, *t1;
  107.  
  108.    add_bo();
  109.  
  110.    while(gadget = (struct MyGadget *)RemHead((void *)&Gadgets)) {
  111.          un_grel(MainWindow,&gadget->Gadget);
  112.          RemoveGadget(MainWindow,&gadget->Gadget);
  113.          FreeGadget(gadget);
  114.    }
  115.  
  116.    NewList((void *)&Gadgets);
  117.  
  118.    GadgetCount = id = 0;
  119.  
  120.    if((t = TextGadget.GadgetText)) {
  121.        while(1) {
  122.            t1 = t->NextText;
  123.            if(t->IText) FreeItem(&Memory,t->IText,80L);
  124.            FreeItem(&Memory,t,(long)sizeof(struct IntuiText));
  125.            if(NOT t1) break;
  126.            t = t1;
  127.        }
  128.        TextGadget.GadgetText = NULL;
  129.    }
  130.  
  131.    Saved = TRUE;
  132.  
  133.    NewList((void *)&SBorders);
  134. }
  135.