/* utils.c */ #include "copyright.h" #include <stdio.h> #include "interface.h" #include "db.h" dbref find_entrance(door) 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(first, what) 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(thing, list) dbref thing; dbref list; { DOLIST(list, list) { if (list == thing) return 1; } return 0; } int recursive_member(disallow, from, count) 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(list) 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(ref) 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(head, ref) 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(head) struct dblist *head; { struct dblist *ptra = head, *ptrb; while (ptra->next) { ptrb = ptra->next; free(ptra); ptra = ptrb; } } int my_random(x) int x; { extern int rand(void); int result; result = (int) ( ((float)x * (float)rand())/2147477000.0); return result; } int getrandom(x) 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]; }