/*----------------------------------------------------------------------*
    sbord.c version 3.0 - © Copyright 1991 Jaba Development

    Author : Jan van den Baard
    Purpose: Shared Borders routines.
 *----------------------------------------------------------------------*/

extern struct MemoryChain   Memory;

struct BorderList           SBorders;

struct SharedBorder *CreateSBorder( struct Border *brd )
{
    struct SharedBorder *sbrd;

    if(NOT(sbrd = (struct SharedBorder *)Alloc(&Memory,sizeof(struct SharedBorder))))
        return NULL;

    sbrd->UseCount  = 1;
    sbrd->Border    = brd;

    AddTail((void *)&SBorders,(void *)sbrd);
    return(sbrd);
}

struct SharedBorder *FindSBorder( register struct Border *brd )
{
    register struct SharedBorder *tmp;

    for(tmp = SBorders.Head; tmp->Border != brd; tmp = tmp->Succ) {
        if(NOT tmp->Succ)
            return(NULL);
    }

    return(tmp);
}

void AddUser( struct Border *brd )
{
    struct SharedBorder *tmp;

    if(NOT (tmp = FindSBorder(brd))) return;

    tmp->UseCount++;
}

void RemUser( struct Border *brd )
{
    register struct Border  *b, *b1;
    struct SharedBorder     *tmp;

    if(NOT (tmp = FindSBorder(brd))) return;

    tmp->UseCount--;

    if(NOT tmp->UseCount) {
        b = tmp->Border;
        while(1) {
            b1 = b->NextBorder;
            if(NOT TestBits((ULONG)tmp->SpecialFlags,SB_HIGHBORDER))
                FreeItem(&Memory,b->XY,(b->Count << 2));
            FreeItem(&Memory,b,sizeof(struct Border));
            if(NOT(b = b1)) break;
        }
        Remove((void *)tmp);
        FreeItem(&Memory,tmp,sizeof(struct SharedBorder));
    }
}

ULONG Account( register struct Border *brd )
{
    register struct SharedBorder *tmp;
    register ULONG                acc = 0L;

    for( tmp = SBorders.Head; tmp->Border != brd; tmp = tmp->Succ, acc++);

    return(acc);
}

struct Border *GetBorder( ULONG acc )
{
    register struct SharedBorder    *tmp;
    register ULONG                   num = 0L;

    for(tmp = SBorders.Head; num != acc; tmp = tmp->Succ, num++);

    return(tmp->Border);
}
