/* utils.c */
#include "os.h"
#include "copyright.h"
#include "interface.h"
#include "externs.h"
#include "db.h"
dbref find_entrance (dbref door)
{
dbref room;
dbref thing;
for (room = 0; room < db_top; room++)
if (Typeof (room) == TYPE_ROOM) {
thing = db[room].exits;
while (thing != NOTHING) {
if (thing == door)
return room;
thing = db[thing].next;
}
}
return NOTHING;
}
/* remove the first occurence of what in list headed by first */
dbref remove_first (dbref first, dbref what)
{
dbref prev;
/* special case if it's the first one */
if (first == what) {
return db[first].next;
} else {
/* have to find it */
DOLIST (prev, first) {
if (db[prev].next == what) {
db[prev].next = db[what].next;
return first;
}
}
return first;
}
}
int member (dbref thing, dbref list)
{
DOLIST (list, list) {
if (list == thing)
return 1;
}
return 0;
}
int recursive_member (dbref disallow, dbref from, int count)
{
dbref contents = db[from].contents;
if (count > 50)
return 0;
DOLIST (contents, contents) {
count++;
return ((from == disallow) ||
(contents == disallow) || recursive_member (disallow, contents, count));
}
return 0;
}
dbref reverse (dbref list)
{
dbref newlist;
dbref rest;
newlist = NOTHING;
while (list != NOTHING) {
rest = db[list].next;
PUSH (list, newlist);
list = rest;
}
return newlist;
}
/* takes a dbref and returns a pointer to the head of a dblist */
struct dblist *listcreate (dbref ref)
{
struct dblist *ptr;
ptr = (struct dblist *) malloc ((unsigned) sizeof (struct dblist));
if (!ptr)
panic ("Out of memory.");
ptr->obj = ref;
ptr->next = NULL;
return (ptr);
}
/*
* takes a pointer to a dblist and a dbref and adds the dbref to the
* end of the list.
*/
void listadd (struct dblist *head, dbref ref)
{
struct dblist *ptr = head;
while (ptr->next)
ptr = ptr->next;
ptr->next = listcreate (ref);
}
/* takes a pointer to a dblist and recursively frees it */
void listfree (struct dblist *head)
{
struct dblist *ptra = head, *ptrb;
while (ptra->next) {
ptrb = ptra->next;
free (ptra);
ptra = ptrb;
}
}
static int my_random (int x)
{
int result;
result = (int) (((float) x * (float) OS_RAND ()) / 2147477000.0);
return result;
}
int getrandom (int x)
{
int temprandoms[20];
int i;
if (x < 1)
x = 1;
for (i = 0; i < 20; i++)
temprandoms[i] = my_random (x);
i = my_random (20);
return temprandoms[i];
}