/* Copyright 1996 Acorn Computers Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
        Chain manipulation routines.
*/

#include <stdio.h>
#include "debug.h"

#include "chains.h"

void chain_remove_link( chain_link *link )
{
        link->forwards->backwards = link->backwards;
        link->backwards->forwards = link->forwards;
}

void chain_insert_before_link( chain_link *link, void *wrapper, chain_link *before_this )
{
        link->backwards = before_this->backwards;
        link->forwards = before_this;
        before_this->backwards->forwards = link;
        before_this->backwards = link;
        link->wrapper = (char *)wrapper - (char *)link;
}

void chain_insert_after_link( chain_link *link, void *wrapper, chain_link *after_this )
{
        link->backwards = after_this;
        link->forwards = after_this->forwards;
        after_this->forwards->backwards = link;
        after_this->forwards = link;
        link->wrapper = (char *)wrapper - (char *)link;
}

/*
NOT USED
void chain_insert_after_header( chain_link *link, void *wrapper, chain_header *header )
{
        chain_insert_after_link( link, wrapper, (chain_link *)(&header->forwards) );
}
*/

void chain_insert_before_header( chain_link *link, void *wrapper, chain_header *header )
{
        chain_insert_before_link( link, wrapper, (chain_link *)(&header->header_indicator) );
}

void chain_initialise_header( chain_header *header )
{
        header->forwards = (chain_link *)(&header->header_indicator);
        header->header_indicator = NULL;
        header->backwards = (chain_link *)(&header->forwards );
}