/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* _/ _/_/_/ _/ _/ _/ ACK! MUD is modified *
* _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code *
* _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 *
* _/_/_/_/ _/ _/ _/ Version #: 4.3 *
* _/ _/ _/_/_/ _/ _/ _/ *
* *
* http://ackmud.nuc.net/ *
* zenithar@ackmud.nuc.net *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#define DEC_LISTS_H 1
#ifndef DEC_TYPEDEFS_H
#include "typedefs.h"
#endif
/*
* All of the global linked lists, in one clump. Declarations here,
* actual variables in lists.c
* -- Altrag
*/
extern AREA_DATA * first_area;
extern AREA_DATA * last_area;
extern BAN_DATA * first_ban;
extern BAN_DATA * last_ban;
extern CHAR_DATA * first_char;
extern CHAR_DATA * last_char;
extern BUILDING_DATA * first_building;
extern BUILDING_DATA * last_building;
extern BUILDING_DATA * first_active_building;
extern BUILDING_DATA * last_active_building;
extern VEHICLE_DATA * first_vehicle;
extern VEHICLE_DATA * last_vehicle;
extern DESCRIPTOR_DATA * first_desc;
extern DESCRIPTOR_DATA * last_desc;
extern HELP_DATA * first_help;
extern HELP_DATA * last_help;
extern OBJ_DATA * first_obj;
extern OBJ_DATA * last_obj;
extern OBJ_DATA * first_bomb;
extern OBJ_DATA * last_bomb;
extern CONTROL_LIST * first_control_list;
extern CONTROL_LIST * last_control_list;
extern QUEUED_INTERACT_LIST * first_queued_interact;
extern QUEUED_INTERACT_LIST * first_queued_interact;
extern INFLUENCE_LIST * first_influence_list;
extern INFLUENCE_LIST * last_influence_list;
extern DL_LIST * first_brand;
extern DL_LIST * last_brand;
extern BOARD_DATA * first_board;
extern BOARD_DATA * last_board;
extern BUF_DATA_STRUCT * first_buf;
extern BUF_DATA_STRUCT * last_buf;
extern AREA_DATA * area_free;
extern BAN_DATA * ban_free;
extern CHAR_DATA * char_free;
extern DESCRIPTOR_DATA * desc_free;
extern HELP_DATA * help_free;
extern OBJ_DATA * obj_free;
extern OBJ_INDEX_DATA * oid_free;
extern ROOM_INDEX_DATA * rid_free;
extern PC_DATA * pcd_free;
extern BUILD_DATA_LIST * build_free;
extern INTERACT_DATA * interact_free;
extern INFLUENCE_DATA * influence_free;
extern CONTROL_DATA * control_data_free;
extern CONTROL_LIST * control_list_free;
extern QUEUED_INTERACT_LIST * queued_interact_free;
extern INFLUENCE_LIST * influence_list_free;
extern DL_LIST * dl_list_free;
extern BRAND_DATA * brand_data_free;
extern BOARD_DATA * board_free;
extern MESSAGE_DATA * message_free;
extern BUF_DATA_STRUCT * buf_free;
extern HASH_ENTRY * hash_free;
extern BUILDING_DATA * building_free;
extern VEHICLE_DATA * vehicle_free;
extern QUEUE_DATA * queue_free;
extern BOMB_DATA * bomb_free;
extern void (*area_free_destructor ) ( AREA_DATA * adat );
extern void (*desc_free_destructor ) ( DESCRIPTOR_DATA * ddat );
//extern void (*help_free_destructor ) ( HELP_DATA * hdat );
extern void (*build_free_destructor ) ( BUILD_DATA_LIST * bddat );
extern void (*interact_free_destructor ) ( INTERACT_DATA * idat );
extern void (*influence_free_destructor) ( INFLUENCE_DATA * idat );
extern void (*control_data_free_destructor ) ( CONTROL_DATA * cdat );
extern void (*control_list_free_destructor ) ( CONTROL_LIST * cldat );
extern void (*queued_interact_free_destructor ) ( QUEUED_INTERACT_LIST * qildat );
extern void (*influence_list_free_destructor ) ( INFLUENCE_LIST * ildat );
extern void (*dl_list_free_destructor ) ( DL_LIST * dldat );
extern void (*board_free_destructor ) ( BOARD_DATA * bdat );
extern void (*buf_free_destructor ) ( BUF_DATA_STRUCT * bdat );
extern void (*hash_free_destructor ) ( HASH_ENTRY * hdat );
void help_free_destructor (HELP_DATA *hdat );
void bomb_free_destructor ( BOMB_DATA * bdat );
void queue_free_destructor ( QUEUE_DATA * qdat );
void message_free_destructor ( MESSAGE_DATA * mdat );
void ban_free_destructor( BAN_DATA * bdat );
void oid_free_destructor( OBJ_INDEX_DATA * oidat );
void brand_data_free_destructor( BRAND_DATA * bdat );
void pcd_free_destructor( PC_DATA * pcdat );
void char_free_destructor( CHAR_DATA * cdat );
void obj_free_destructor( OBJ_DATA * odat );
void building_free_destructor( BUILDING_DATA * bdat );
void vehicle_free_destructor( VEHICLE_DATA * vdat );
#define GET_FREE(item, freelist) \
do { \
if ( !(freelist) ) \
(item) = getmem(sizeof(*(item))); \
else { \
if ( !(freelist)->is_free ) { \
bug("GET_FREE: freelist head is NOT FREE! Hanging...", 0); \
for (;;); \
} \
(item) = (freelist); \
(freelist) = (item)->next; \
memset((item), 0, sizeof(*(item))); /* This clears is_free flag */ \
} \
} while(0)
#define PUT_FREE(item, freelist) \
do { \
if ( (item)->is_free ) { \
bug("PUT_FREE: item is ALREADY FREE! Hanging...", 0); \
for (;;); \
} \
(item)->next = (freelist); \
(item)->is_free = TRUE; /* This sets is_free flag */ \
(freelist) = (item); \
if (freelist##_destructor) freelist##_destructor(item); \
} while(0)