#ifndef _DOHINT_H
#define _DOHINT_H
#include "doh.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <stdarg.h>
typedef struct {
DOH *(*doh_getattr) (DOH *obj, DOH *name);
int (*doh_setattr) (DOH *obj, DOH *name, DOH *value);
int (*doh_delattr) (DOH *obj, DOH *name);
DOH *(*doh_keys) (DOH *obj);
} DohHashMethods;
typedef struct {
DOH *(*doh_getitem) (DOH *obj, int index);
int (*doh_setitem) (DOH *obj, int index, DOH *value);
int (*doh_delitem) (DOH *obj, int index);
int (*doh_insitem) (DOH *obj, int index, DOH *value);
int (*doh_delslice) (DOH *obj, int sindex, int eindex);
} DohListMethods;
typedef struct {
int (*doh_read) (DOH *obj, void *buffer, int nbytes);
int (*doh_write) (DOH *obj, void *buffer, int nbytes);
int (*doh_putc) (DOH *obj, int ch);
int (*doh_getc) (DOH *obj);
int (*doh_ungetc) (DOH *obj, int ch);
int (*doh_seek) (DOH *obj, long offset, int whence);
long (*doh_tell) (DOH *obj);
int (*doh_close) (DOH *obj);
} DohFileMethods;
typedef struct {
int (*doh_replace) (DOH *obj, DOH *old, DOH *rep, int flags);
void (*doh_chop) (DOH *obj);
} DohStringMethods;
typedef struct DohObjInfo {
char *objname;
void (*doh_del) (DOH *obj);
DOH *(*doh_copy) (DOH *obj);
void (*doh_clear) (DOH *obj);
DOH *(*doh_str) (DOH *obj);
void *(*doh_data) (DOH *obj);
int (*doh_dump) (DOH *obj, DOH *out);
int (*doh_len) (DOH *obj);
int (*doh_hashval) (DOH *obj);
int (*doh_cmp) (DOH *obj1, DOH *obj2);
int (*doh_equal) (DOH *obj1, DOH *obj2);
DohIterator (*doh_first) (DOH *obj);
DohIterator (*doh_next) (DohIterator);
void (*doh_setfile) (DOH *obj, DOHString_or_char *file);
DOH *(*doh_getfile) (DOH *obj);
void (*doh_setline) (DOH *obj, int line);
int (*doh_getline) (DOH *obj);
DohHashMethods *doh_hash;
DohListMethods *doh_list;
DohFileMethods *doh_file;
DohStringMethods *doh_string;
void *doh_reserved;
void *clientdata;
} DohObjInfo;
typedef struct {
void *data;
DohObjInfo *type;
void *meta;
unsigned int flag_intern:1;
unsigned int flag_marked:1;
unsigned int flag_user:1;
unsigned int flag_usermark:1;
unsigned int refcount:28;
} DohBase;
#define Decref(a) if (a) ((DohBase *) a)->refcount--
#define Incref(a) if (a) ((DohBase *) a)->refcount++
#define Refcount(a) ((DohBase *) a)->refcount
#define ObjData(a) ((DohBase *)a)->data
#define ObjSetMark(a,x) ((DohBase *)a)->flag_marked = x
#define ObjGetMark(a) ((DohBase *)a)->flag_marked
#define ObjType(a) ((DohBase *)a)->type
extern DOH *DohObjMalloc(DohObjInfo *type, void *data);
extern void DohObjFree(DOH *ptr);
#endif