/* data.h: Declarations for C-- data. */ #ifndef DATA_H #define DATA_H #include "cmstring.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)) typedef struct substring Substring; typedef struct sublist Sublist; typedef struct frob Frob; typedef struct data Data; typedef struct list List; typedef struct dict Dict; typedef struct buffer Buffer; struct substring { String *str; int start; int span; }; struct sublist { List *list; int start; int span; }; struct frob { long class; int rep_type; union { Dict *dict; List *list; } rep; }; struct data { int type; union { long val, dbref, symbol, error; Substring substr; Sublist sublist; Frob frob; Dict *dict; Buffer *buffer; } u; }; struct list { int len; int size; int refs; Data el[1]; }; struct dict { List *keys; List *values; int *links; int *hashtab; int hashtab_size; int refs; }; struct buffer { int len; int refs; unsigned char s[1]; }; /* data.c */ 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); int sublist_search(Sublist *sublist, Data *data); void sublist_truncate(Sublist *sublist); void substring_truncate(Substring *substr); char *data_sptr(Data *data); Data *data_dptr(Data *data); void substr_set_to_full_string(Substring *target, String *str); void sublist_set_to_full_list(Sublist *target, List *list); /* list.h */ List *list_new(int len); List *list_dup(List *list); List *list_from_data(Data *data, int len); List *list_from_sublist(Sublist *sublist); int list_search(List *list, Data *data); int list_cmp(List *l1, List *l2); List *list_insert(List *list, int pos, Data *elem); List *list_add(List *list, Data *elem); List *list_replace(List *list, int pos, Data *elem); List *list_delete(List *list, int pos); List *list_delete_element(List *list, Data *elem); List *list_append(List *list, Data *d, int len); List *list_setadd(List *list, Data *elem); List *list_setremove(List *list, Data *elem); void list_discard(List *list); /* dict.h */ Dict *dict_new(List *keys, List *values); Dict *dict_new_empty(void); Dict *dict_from_slices(List *slices); Dict *dict_dup(Dict *dict); void dict_discard(Dict *dict); int dict_cmp(Dict *dict1, Dict *dict2); Dict *dict_add(Dict *dict, Data *key, Data *value); Dict *dict_del(Dict *dict, Data *key); long dict_find(Dict *dict, Data *key, Data *ret); int dict_contains(Dict *dict, Data *key); List *dict_keys(Dict *dict); List *dict_key_value_pair(Dict *mapping, int i); String *dict_add_literal_to_str(String *str, Dict *dict); /* buffer.h */ Buffer *buffer_new(int len); Buffer *buffer_dup(Buffer *buf); void buffer_discard(Buffer *buf); Buffer *buffer_append(Buffer *buf1, Buffer *buf2); int buffer_retrieve(Buffer *buf, int pos); Buffer *buffer_replace(Buffer *buf, int pos, unsigned int c); Buffer *buffer_add(Buffer *buf, unsigned int c); int buffer_len(Buffer *buf); Buffer *buffer_truncate(Buffer *buf, int len); List *buffer_to_strings(Buffer *buf, Buffer *sep); Buffer *buffer_from_strings(Data *d, int n, Buffer *sep); #endif