/* data.h: Declarations for C-- data. */

#ifndef DATA_H
#define DATA_H

typedef struct frob Frob;
typedef struct data Data;

#include "cmstring.h"
#include "list.h"
#include "dict.h"
#include "buffer.h"
#include "ident.h"
#include "object.h"

/* Buffer contents must be between 0 and 255 inclusive, even if an unsigned
 * char can hold other values. */
#define OCTET_VALUE(n) (((unsigned long) (n)) & ((1 << 8) - 1))

struct data {
    int type;
    union {
	long val;
	Dbref dbref;
	Ident symbol;
        Ident error;
	String *str;
	List *list;
	Frob *frob;
	Dict *dict;
	Buffer *buffer;
    } u;
};

struct frob {
    long cclass;
    Data rep;
};

int data_cmp(Data *d1, Data *d2);
int data_true(Data *data);
unsigned long data_hash(Data *d);
void data_dup(Data *dest, Data *src);
void data_discard(Data *data);
String *data_tostr(Data *data);
String *data_to_literal(Data *data);
String *data_add_literal_to_str(String *str, Data *data);
char *data_from_literal(Data *d, char *s);
long data_type_id(int type);

#define DATA_H_DONE
#include "list.h"
#include "object.h"

#endif