tmuck2.4/
tmuck2.4/admin/scripts/
tmuck2.4/docs/
tmuck2.4/minimal-db/
tmuck2.4/minimal-db/data/
tmuck2.4/minimal-db/logs/
tmuck2.4/minimal-db/muf/
tmuck2.4/old/
tmuck2.4/src/
tmuck2.4/src/compile/
tmuck2.4/src/editor/
tmuck2.4/src/game/
tmuck2.4/src/interface/
tmuck2.4/src/scripts/
tmuck2.4/src/utilprogs/
/* Copyright (c) 1992 by David Moore.  All rights reserved. */
/* frames.c,v 2.2 1993/12/15 00:41:26 dmoore Exp */
#include "config.h"

#include "db.h"
#include "params.h"
#include "externs.h"


struct frame_entry {
    dbref player;		/* Person running a player. */
    struct frame *interactive;	/* Interactive frame. */
    /* background field totally unused currently. */
    struct frame *background;	/* List of background frames. */
};


/* Hash table of players currently being edited. */
static hash_tab *frame_table = NULL;


/* Hash table routines.  Maps a player # -> frames. */
static unsigned long hash_frame_entry(const void *entry)
{
    const struct frame_entry *info = entry;

    return dbref2long(info->player);
}


static int compare_frame_entries(const void *entry1, const void *entry2)
{
    const struct frame_entry *info1 = entry1;
    const struct frame_entry *info2 = entry2;

    return (info1->player != info2->player);
}


static void delete_frame_entry(void *entry)
{
    struct frame_entry *info = entry;

    FREE(info);
}


void init_frame_table(void)
{
    if (frame_table) return;

    frame_table = init_hash_table("Frame table", compare_frame_entries,
			     hash_frame_entry, delete_frame_entry,
			     FRAME_HASH_SIZE);
}


void clear_frame_table(void)
{
    clear_hash_table(frame_table);
    frame_table = NULL;
}


struct frame *get_frame(const dbref player)
{
    struct frame_entry match;
    const struct frame_entry *result;

    match.player = player;
    result = find_hash_entry(frame_table, &match);
    
    if (!result) return NULL;

    return result->interactive;
}


int running_program(const dbref player)
{
    return (get_frame(player) != NULL);
}


void add_frame(const dbref player, struct frame *frame)
{
    struct frame_entry *info;
    
    MALLOC(info, struct frame_entry, 1);

    info->player = player;
    info->interactive = frame;
    info->background = NULL;
    add_hash_entry(frame_table, info);
}


void delete_frame(const dbref player)
{
    struct frame_entry match;

    match.player = player;
    clear_hash_entry(frame_table, &match);
}