diff srogue/list.c @ 36:2128c7dc8a40

Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 25 Nov 2010 12:21:41 +0000
parents
children d6b7c3fb37ea
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srogue/list.c	Thu Nov 25 12:21:41 2010 +0000
@@ -0,0 +1,110 @@
+/*
+ * Functions for dealing with linked lists of goodies
+ *
+ * @(#)list.c	9.0	(rdk)	 7/17/84
+ *
+ * Super-Rogue
+ * Copyright (C) 1984 Robert D. Kindelberger
+ * All rights reserved.
+ *
+ * Based on "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 <stdlib.h>
+#include "rogue.h"
+#include "rogue.ext"
+
+/*
+ * detach:
+ *	Takes an item out of whatever linked list it might be in
+ */
+
+_detach(list, item)
+struct linked_list **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
+ */
+_attach(list, item)
+struct linked_list **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
+ */
+_free_list(ptr)
+struct linked_list **ptr;
+{
+	register struct linked_list *item;
+
+	while (*ptr != NULL) {
+		item = *ptr;
+		*ptr = next(item);
+		discard(item);
+	}
+}
+
+/*
+ * discard:  free up an item
+ */
+discard(item)
+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(size)
+int size;
+{
+	register struct linked_list *item;
+
+	item = (struct linked_list *) new(sizeof *item);
+	item->l_data = new(size);
+	item->l_next = item->l_prev = NULL;
+	return item;
+}
+
+char *
+new(size)
+int size;
+{
+	register char *space = ALLOC(size);
+
+	if (space == NULL) {
+		sprintf(prbuf,"Rogue ran out of memory (%d).",sbrk(0));
+		fatal(prbuf);
+	}
+	total++;
+	return space;
+}