/*--------------------------------------------------------------------------
              .88b  d88. db    db d8888b.   .d888b. db   dD
              88'YbdP`88 88    88 88  `8D   VP  `8D 88 ,8P'
              88  88  88 88    88 88   88      odD' 88,8P
              88  88  88 88    88 88   88    .88'   88`8b
              88  88  88 88b  d88 88  .8D   j88.    88 `88.
              YP  YP  YP ~Y8888P' Y8888D'   888888D YP   YD
This material is copyrighted (c) 1999 - 2002 by Thomas J Whiting 
(twhiting@xanth.2y.net). Usage of this material  means that you have read
and agree to all of the licenses in the ../licenses directory. None of these
licenses may ever be removed.
----------------------------------------------------------------------------
A LOT of time has gone into this code by a LOT of people. Not just on
this individual code, but on all of the codebases this even takes a piece
of. I hope that you find this code in some way useful and you decide to
contribute a small bit to it. There's still a lot of work yet to do.
---------------------------------------------------------------------------*/

char    membuf[MSL];
void pager_printf args((CHAR_DATA *ch, char *fmt, ...));
void write_memlog_line args(( char *log ));
char *       is_hiscore_obj  args( ( OBJ_DATA *obj ) );
void         show_hiscore    args( ( char *keyword, CHAR_DATA*ch ));
void         adjust_hiscore  args( ( char *keyword, CHAR_DATA *ch, int score));
void         save_hiscores   args( ( void ) );
void         load_hiscores   args( ( void ) );

#define MEMLOG_FILE   DATA_DIR"/memory.txt"
#define LINK(link, first, last, next, prev)                     \
do                                                              \
{                                                               \
    if ( !(first) )                                             \
      (first)                   = (link);                       \
    else                                                        \
      (last)->next              = (link);                       \
    (link)->next                = NULL;                         \
    (link)->prev                = (last);                       \
    (last)                      = (link);                       \
} while(0)
#define INSERT(link, insert, first, next, prev)                 \
do                                                              \
{                                                               \
    (link)->prev                = (insert)->prev;               \
    if ( !(insert)->prev )                                      \
      (first)                   = (link);                       \
    else                                                        \
      (insert)->prev->next      = (link);                       \
    (insert)->prev              = (link);                       \
    (link)->next                = (insert);                     \
} while(0)
#define UNLINK(link, first, last, next, prev)                   \
do                                                              \
{                                                               \
    if ( !(link)->prev )                                        \
      (first)                   = (link)->next;                 \
    else                                                        \
      (link)->prev->next        = (link)->next;                 \
    if ( !(link)->next )                                        \
      (last)                    = (link)->prev;                 \
    else                                                        \
      (link)->next->prev        = (link)->prev;                 \
} while(0)

#define DISPOSE(point)                                          \
do                                                              \
{                                                               \
  sprintf(membuf,"DISPOSING: %s: %d\n",__FILE__,__LINE__);      \
  write_memlog_line(membuf);                                    \
  if (!(point))                                                 \
  {                                                             \
        bug( "Freeing null pointer",0 ); \
fprintf( stderr, "DISPOSEing NULL in %s, line %d\n", __FILE__, __LINE__); \
  }                                                             \
  else free(point);                                             \
  point = NULL;                                         \
} while(0)

#define CREATE(result, type, number)                            \
do                                                              \
{                                                               \
   if (!((result) = (type *) calloc ((number), sizeof(type))))  \
        { perror("malloc failure"); abort(); }                  \
} while(0)


typedef struct hiscore_entry HISCORE_ENTRY;
typedef struct hiscore HISCORE;
struct hiscore_entry
{
        char *name;
        int score;

        HISCORE_ENTRY *next;
        HISCORE_ENTRY *prev;
};
struct hiscore
{
        char *keyword;
        char *desc;
        int vnum;
        sh_int max_length;
        sh_int length;
        HISCORE_ENTRY *first_entry;
        HISCORE_ENTRY *last_entry;

        HISCORE           *next;
        HISCORE           *prev;
};
HISCORE *first_table;
HISCORE *last_table;