Mercurial > hg > early-roguelike
diff rogue3/list.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children | 0250220d8cdd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue3/list.c Tue Oct 13 13:33:34 2009 +0000 @@ -0,0 +1,129 @@ +/* + * Functions for dealing with linked lists of goodies + * + * @(#)list.c 3.3 (Berkeley) 6/15/81 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include "curses.h" +#include <stdlib.h> +#include <string.h> +#include "machdep.h" +#include "rogue.h" + +/* + * detach: + * Takes an item out of whatever linked list it might be in + */ + +void +_detach(struct linked_list **list, struct linked_list *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(struct linked_list **list, struct linked_list *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(struct linked_list **ptr) +{ + struct linked_list *item; + + while (*ptr != NULL) + { + item = *ptr; + *ptr = next(item); + discard(item); + } +} + +/* + * discard: + * free up an item + */ + +void +discard(struct linked_list *item) +{ + total -= 2; + FREE(item->l_data); + FREE(item); +} + +/* + * new_item + * get a new item with a specified size + */ + +struct linked_list * +new_item(int size) +{ + struct linked_list *item; + + if ((item = (struct linked_list *) _new(sizeof *item)) == NULL) + { + msg("Ran out of memory for header after %d items", total); + return NULL; + } + + if ((item->l_data = _new(size)) == NULL) + { + msg("Ran out of memory for data after %d items", total); + free(item); + return NULL; + } + + item->l_next = item->l_prev = NULL; + memset(item->l_data,0,size); + return item; +} + +char * +_new(size_t size) +{ + char *space = ALLOC(size); + + if (space == NULL) + { + sprintf(prbuf, "Rogue ran out of memory (%d). Fatal error!", md_memused()); + fatal(prbuf); + } + total++; + return space; +}