/* * Functions for dealing with linked lists of goodies * * @(#)list.c 4.12 (Berkeley) 02/05/99 * * Rogue: Exploring the Dungeons of Doom * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman * All rights reserved. * * See the file LICENSE.TXT for full copyright and licensing information. */#include <stdlib.h>#include <curses.h>#include "rogue.h"#ifdef MASTERint total = 0; /* total dynamic memory bytes */#endif/* * detach: * takes an item out of whatever linked list it might be in */void_detach(THING **list, THING *item){ if (*list == item) *list = next(item); if (prev(item) != NULL) item->l_prev->l_next = next(item); if (next(item) != NULL) item->l_next->l_prev = prev(item); item->l_next = NULL; item->l_prev = NULL;}/* * _attach: * add an item to the head of a list */void_attach(THING **list, THING *item){ if (*list != NULL) { item->l_next = *list; (*list)->l_prev = item; item->l_prev = NULL; } else { item->l_next = NULL; item->l_prev = NULL; } *list = item;}/* * _free_list: * Throw the whole blamed thing away */void_free_list(THING **ptr){ THING *item; while (*ptr != NULL) { item = *ptr; *ptr = next(item); discard(item); }}/* * discard: * Free up an item */voiddiscard(THING *item){#ifdef MASTER total--;#endif free(item);}/* * new_item * Get a new item with a specified size */THING *new_item(void){ THING *item; if ((item = calloc(1, sizeof *item)) == NULL) {#ifdef MASTER msg("ran out of memory after %d items", total);#endif return NULL; }#ifdef MASTER total++;#endif item->l_next = NULL; item->l_prev = NULL; return item;}