/
Genesis-1.0p36-DEV/
Genesis-1.0p36-DEV/bin/
Genesis-1.0p36-DEV/doc/
Genesis-1.0p36-DEV/etc/
Genesis-1.0p36-DEV/src/data/
#include "defs.h"

#include <string.h>
#include "cdc_pcode.h"
#include "operators.h"
#include "execute.h"
#include "lookup.h"
#include "util.h"
#include "data.h"
#include "dbpack.h"

#include "handled_frob.h"

INSTANCE_PROTOTYPES(handled);

void pack_handled (cData *d, FILE *fp)
{
    HandledFrob *h = HANDLED_FROB(d);

    write_long (h->cclass, fp);
    pack_data (&h->rep, fp);
    write_ident(h->handler, fp);
}

void unpack_handled (cData *d, FILE *fp)
{
    HandledFrob *h=TMALLOC(HandledFrob, 1);

    h->cclass = read_long(fp);
    unpack_data (&h->rep, fp);
    h->handler = read_ident(fp);
    d->u.instance = (void*) h;
}

int size_handled (cData *d)
{
    HandledFrob *h = HANDLED_FROB(d);
    Int size = 0;

    size += size_long(h->cclass);
    size += size_data(&h->rep);
    size += size_ident(h->handler);
    return size;
}

int compare_handled (cData *d1, cData *d2)
{
    HandledFrob *h1 = HANDLED_FROB(d1),
                *h2 = HANDLED_FROB(d2);

    if (h1->cclass != h2->cclass ||
	h1->handler != h2->handler)
	return 1;

    return data_cmp(&h1->rep, &h2->rep);
}

int hash_handled (cData *d)
{
    HandledFrob *h = HANDLED_FROB(d);

    return h->cclass + h->handler + data_hash(&h->rep);
}

void dup_handled (cData *dest, cData *source)
{
    HandledFrob *s = HANDLED_FROB(source),
	        *d = TMALLOC(HandledFrob, 1);

    d->cclass = s->cclass;
    d->handler = ident_dup(s->handler);
    data_dup (&d->rep, &s->rep);
    dest->u.instance = d;
}

void discard_handled (cData *d)
{
    HandledFrob *h = HANDLED_FROB(d);

    data_discard(&h->rep);
    ident_discard(h->handler);
}

cStr *string_handled (cStr *str, cData *data, Bool objnames)
{
    HandledFrob *h = HANDLED_FROB(data);
    cData d;

    str = string_addc (str, '<');
    d.type = OBJNUM;
    d.u.objnum = h->cclass;
    str = data_add_literal_to_str(str, &d, objnames);
    str = string_add_chars(str, ", ", 2);
    str = data_add_literal_to_str(str, &h->rep, objnames);
    str = string_add_chars(str, ", ", 2);
    d.type = SYMBOL;
    d.u.symbol = h->handler;
    str = data_add_literal_to_str(str, &d, objnames);
    return string_addc(str, '>');
}