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 / sbord.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  2KB  |  89 lines

  1. /*----------------------------------------------------------------------*
  2.     sbord.c version 3.0 - © Copyright 1991 Jaba Development
  3.  
  4.     Author : Jan van den Baard
  5.     Purpose: Shared Borders routines.
  6.  *----------------------------------------------------------------------*/
  7.  
  8. extern struct MemoryChain   Memory;
  9.  
  10. struct BorderList           SBorders;
  11.  
  12. struct SharedBorder *CreateSBorder( struct Border *brd )
  13. {
  14.     struct SharedBorder *sbrd;
  15.  
  16.     if(NOT(sbrd = (struct SharedBorder *)Alloc(&Memory,sizeof(struct SharedBorder))))
  17.         return NULL;
  18.  
  19.     sbrd->UseCount  = 1;
  20.     sbrd->Border    = brd;
  21.  
  22.     AddTail((void *)&SBorders,(void *)sbrd);
  23.     return(sbrd);
  24. }
  25.  
  26. struct SharedBorder *FindSBorder( register struct Border *brd )
  27. {
  28.     register struct SharedBorder *tmp;
  29.  
  30.     for(tmp = SBorders.Head; tmp->Border != brd; tmp = tmp->Succ) {
  31.         if(NOT tmp->Succ)
  32.             return(NULL);
  33.     }
  34.  
  35.     return(tmp);
  36. }
  37.  
  38. void AddUser( struct Border *brd )
  39. {
  40.     struct SharedBorder *tmp;
  41.  
  42.     if(NOT (tmp = FindSBorder(brd))) return;
  43.  
  44.     tmp->UseCount++;
  45. }
  46.  
  47. void RemUser( struct Border *brd )
  48. {
  49.     register struct Border  *b, *b1;
  50.     struct SharedBorder     *tmp;
  51.  
  52.     if(NOT (tmp = FindSBorder(brd))) return;
  53.  
  54.     tmp->UseCount--;
  55.  
  56.     if(NOT tmp->UseCount) {
  57.         b = tmp->Border;
  58.         while(1) {
  59.             b1 = b->NextBorder;
  60.             if(NOT TestBits((ULONG)tmp->SpecialFlags,SB_HIGHBORDER))
  61.                 FreeItem(&Memory,b->XY,(b->Count << 2));
  62.             FreeItem(&Memory,b,sizeof(struct Border));
  63.             if(NOT(b = b1)) break;
  64.         }
  65.         Remove((void *)tmp);
  66.         FreeItem(&Memory,tmp,sizeof(struct SharedBorder));
  67.     }
  68. }
  69.  
  70. ULONG Account( register struct Border *brd )
  71. {
  72.     register struct SharedBorder *tmp;
  73.     register ULONG                acc = 0L;
  74.  
  75.     for( tmp = SBorders.Head; tmp->Border != brd; tmp = tmp->Succ, acc++);
  76.  
  77.     return(acc);
  78. }
  79.  
  80. struct Border *GetBorder( ULONG acc )
  81. {
  82.     register struct SharedBorder    *tmp;
  83.     register ULONG                   num = 0L;
  84.  
  85.     for(tmp = SBorders.Head; num != acc; tmp = tmp->Succ, num++);
  86.  
  87.     return(tmp->Border);
  88. }
  89.