summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2024-05-21 14:12:15 +0200
committerdefault <nobody@localhost>2024-05-21 14:12:15 +0200
commit4777fc86cb962917a8f34afb3bfa40f26290815d (patch)
tree268c078531a018f07c1b6d029f14f87134805f7b /xs.h
parentb95fbe4e438a2ab8a8625875e2eedac38dae572f (diff)
Added const everywhere.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h110
1 files changed, 76 insertions, 34 deletions
diff --git a/xs.h b/xs.h
index f5c87ef..b46f0e1 100644
--- a/xs.h
+++ b/xs.h
@@ -21,8 +21,8 @@ typedef enum {
XSTYPE_FALSE = 0x15, /* Boolean */
XSTYPE_LIST = 0x1d, /* Sequence of LITEMs up to EOM (with size) */
XSTYPE_LITEM = 0x1f, /* Element of a list (any type) */
- XSTYPE_DICT = 0x1c, /* Sequence of DITEMs up to EOM (with size) */
- XSTYPE_DITEM = 0x1e, /* Element of a dict (STRING key + any type) */
+ XSTYPE_DICT = 0x1c, /* Sequence of KEYVALs up to EOM (with size) */
+ XSTYPE_KEYVAL = 0x1e, /* key + value (STRING key + any type) */
XSTYPE_EOM = 0x19, /* End of Multiple (LIST or DICT) */
XSTYPE_DATA = 0x10 /* A block of anonymous data */
} xstype;
@@ -32,6 +32,7 @@ typedef enum {
typedef char xs_val;
typedef char xs_str;
typedef char xs_list;
+typedef char xs_keyval;
typedef char xs_dict;
typedef char xs_number;
typedef char xs_data;
@@ -96,7 +97,7 @@ xs_list *_xs_list_append(xs_list *list, const xs_val *vals[]);
int xs_list_iter(xs_list **list, xs_val **value);
int xs_list_next(const xs_list *list, xs_val **value, int *ctxt);
int xs_list_len(const xs_list *list);
-xs_val *xs_list_get(const xs_list *list, int num);
+const xs_val *xs_list_get(const xs_list *list, int num);
xs_list *xs_list_del(xs_list *list, int num);
xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data);
xs_list *xs_list_set(xs_list *list, int num, const xs_val *data);
@@ -109,14 +110,20 @@ xs_list *xs_split_n(const char *str, const char *sep, int times);
#define xs_split(str, sep) xs_split_n(str, sep, XS_ALL)
xs_list *xs_list_cat(xs_list *l1, const xs_list *l2);
+int xs_keyval_size(const xs_str *key, const xs_val *value);
+xs_str *xs_keyval_key(const xs_keyval *keyval);
+xs_val *xs_keyval_value(const xs_keyval *keyval);
+xs_keyval *xs_keyval_make(xs_keyval *keyval, const xs_str *key, const xs_val *value);
+
xs_dict *xs_dict_new(void);
xs_dict *xs_dict_append(xs_dict *dict, const xs_str *key, const xs_val *value);
xs_dict *xs_dict_prepend(xs_dict *dict, const xs_str *key, const xs_val *value);
int xs_dict_next(const xs_dict *dict, xs_str **key, xs_val **value, int *ctxt);
-xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_val *def);
+const xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_val *def);
#define xs_dict_get(dict, key) xs_dict_get_def(dict, key, NULL)
xs_dict *xs_dict_del(xs_dict *dict, const xs_str *key);
xs_dict *xs_dict_set(xs_dict *dict, const xs_str *key, const xs_val *data);
+xs_dict *xs_dict_gc(xs_dict *dict);
xs_val *xs_val_new(xstype t);
xs_number *xs_number_new(double f);
@@ -244,7 +251,7 @@ xstype xs_type(const xs_val *data)
case XSTYPE_LIST:
case XSTYPE_LITEM:
case XSTYPE_DICT:
- case XSTYPE_DITEM:
+ case XSTYPE_KEYVAL:
case XSTYPE_NUMBER:
case XSTYPE_EOM:
case XSTYPE_DATA:
@@ -262,7 +269,7 @@ xstype xs_type(const xs_val *data)
void _xs_put_size(xs_val *ptr, int i)
/* must match _XS_TYPE_SIZE */
{
- memcpy(ptr, &i, sizeof(i));
+ memcpy(ptr + 1, &i, sizeof(i));
}
@@ -296,7 +303,7 @@ int xs_size(const xs_val *data)
break;
- case XSTYPE_DITEM:
+ case XSTYPE_KEYVAL:
/* calculate the size of the key and the value */
p = data + 1;
p += xs_size(p);
@@ -380,7 +387,7 @@ xs_val *xs_expand(xs_val *data, int offset, int size)
if (xs_type(data) == XSTYPE_LIST ||
xs_type(data) == XSTYPE_DICT ||
xs_type(data) == XSTYPE_DATA)
- _xs_put_size(data + 1, sz);
+ _xs_put_size(data, sz);
return data;
}
@@ -405,7 +412,7 @@ xs_val *xs_collapse(xs_val *data, int offset, int size)
if (xs_type(data) == XSTYPE_LIST ||
xs_type(data) == XSTYPE_DICT ||
xs_type(data) == XSTYPE_DATA)
- _xs_put_size(data + 1, sz);
+ _xs_put_size(data, sz);
return xs_realloc(data, _xs_blk_size(sz));
}
@@ -666,10 +673,10 @@ xs_list *xs_list_new(void)
{
int sz = 1 + _XS_TYPE_SIZE + 1;
xs_list *l = xs_realloc(NULL, sz);
- memset(l, '\0', sz);
+ memset(l, XSTYPE_EOM, sz);
l[0] = XSTYPE_LIST;
- _xs_put_size(&l[1], sz);
+ _xs_put_size(l, sz);
return l;
}
@@ -802,7 +809,7 @@ int xs_list_len(const xs_list *list)
}
-xs_val *xs_list_get(const xs_list *list, int num)
+const xs_val *xs_list_get(const xs_list *list, int num)
/* returns the element #num */
{
XS_ASSERT_TYPE(list, XSTYPE_LIST);
@@ -830,7 +837,7 @@ xs_list *xs_list_del(xs_list *list, int num)
{
XS_ASSERT_TYPE(list, XSTYPE_LIST);
- xs_val *v;
+ const xs_val *v;
if ((v = xs_list_get(list, num)) != NULL)
list = xs_collapse(list, v - 1 - list, xs_size(v - 1));
@@ -844,7 +851,7 @@ xs_list *xs_list_insert(xs_list *list, int num, const xs_val *data)
{
XS_ASSERT_TYPE(list, XSTYPE_LIST);
- xs_val *v;
+ const xs_val *v;
int offset;
if ((v = xs_list_get(list, num)) != NULL)
@@ -999,6 +1006,40 @@ xs_list *xs_list_cat(xs_list *l1, const xs_list *l2)
}
+/** keyvals **/
+
+int xs_keyval_size(const xs_str *key, const xs_val *value)
+/* returns the needed size for a keyval */
+{
+ return 1 + xs_size(key) + xs_size(value);
+}
+
+
+xs_str *xs_keyval_key(const xs_keyval *keyval)
+/* returns a pointer to the key of the keyval */
+{
+ return (xs_str *)&keyval[1];
+}
+
+
+xs_val *xs_keyval_value(const xs_keyval *keyval)
+/* returns a pointer to the value of the keyval */
+{
+ return (xs_val *)&keyval[1 + xs_size(xs_keyval_key(keyval))];
+}
+
+
+xs_keyval *xs_keyval_make(xs_keyval *keyval, const xs_str *key, const xs_val *value)
+/* builds a keyval into mem (should have enough size) */
+{
+ keyval[0] = XSTYPE_KEYVAL;
+ memcpy(xs_keyval_key(keyval), key, xs_size(key));
+ memcpy(xs_keyval_value(keyval), value, xs_size(value));
+
+ return keyval;
+}
+
+
/** dicts **/
xs_dict *xs_dict_new(void)
@@ -1006,34 +1047,27 @@ xs_dict *xs_dict_new(void)
{
int sz = 1 + _XS_TYPE_SIZE + 1;
xs_dict *d = xs_realloc(NULL, sz);
- memset(d, '\0', sz);
+ memset(d, XSTYPE_EOM, sz);
d[0] = XSTYPE_DICT;
- _xs_put_size(&d[1], sz);
+ _xs_put_size(d, sz);
return d;
}
-xs_dict *_xs_dict_write_ditem(xs_dict *dict, int offset, const xs_str *key,
- const xs_val *data, int dsz)
-/* inserts a memory block into the dict */
+xs_dict *_xs_dict_write_keyval(xs_dict *dict, int offset, const xs_str *key, const xs_val *value)
+/* adds a new keyval to the dict */
{
XS_ASSERT_TYPE(dict, XSTYPE_DICT);
XS_ASSERT_TYPE(key, XSTYPE_STRING);
- if (data == NULL) {
- data = xs_stock(XSTYPE_NULL);
- dsz = xs_size(data);
- }
-
- int ksz = xs_size(key);
+ if (value == NULL)
+ value = xs_stock(XSTYPE_NULL);
- dict = xs_expand(dict, offset, 1 + ksz + dsz);
+ dict = xs_expand(dict, offset, xs_keyval_size(key, value));
- dict[offset] = XSTYPE_DITEM;
- memcpy(&dict[offset + 1], key, ksz);
- memcpy(&dict[offset + 1 + ksz], data, dsz);
+ xs_keyval_make(&dict[offset], key, value);
return dict;
}
@@ -1042,14 +1076,14 @@ xs_dict *_xs_dict_write_ditem(xs_dict *dict, int offset, const xs_str *key,
xs_dict *xs_dict_append(xs_dict *dict, const xs_str *key, const xs_val *value)
/* appends a memory block to the dict */
{
- return _xs_dict_write_ditem(dict, xs_size(dict) - 1, key, value, xs_size(value));
+ return _xs_dict_write_keyval(dict, xs_size(dict) - 1, key, value);
}
xs_dict *xs_dict_prepend(xs_dict *dict, const xs_str *key, const xs_val *value)
/* prepends a memory block to the dict */
{
- return _xs_dict_write_ditem(dict, 1 + _XS_TYPE_SIZE, key, value, xs_size(value));
+ return _xs_dict_write_keyval(dict, 1 + _XS_TYPE_SIZE, key, value);
}
@@ -1070,7 +1104,7 @@ int xs_dict_next(const xs_dict *dict, xs_str **key, xs_val **value, int *ctxt)
p += *ctxt;
/* an element? */
- if (xs_type(p) == XSTYPE_DITEM) {
+ if (xs_type(p) == XSTYPE_KEYVAL) {
p++;
*key = p;
@@ -1091,7 +1125,7 @@ int xs_dict_next(const xs_dict *dict, xs_str **key, xs_val **value, int *ctxt)
}
-xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_val *def)
+const xs_val *xs_dict_get_def(const xs_dict *dict, const xs_str *key, const xs_val *def)
/* returns the value directed by key, or the default value */
{
XS_ASSERT_TYPE(dict, XSTYPE_DICT);
@@ -1150,6 +1184,14 @@ xs_dict *xs_dict_set(xs_dict *dict, const xs_str *key, const xs_val *data)
}
+xs_dict *xs_dict_gc(xs_dict *dict)
+/* collects garbage (leaked values) inside a dict */
+{
+ /* this kind of dicts does not get garbage */
+ return dict;
+}
+
+
/** other values **/
xs_val *xs_val_new(xstype t)
@@ -1235,7 +1277,7 @@ xs_data *xs_data_new(const void *data, int size)
v = xs_realloc(NULL, _xs_blk_size(total_size));
v[0] = XSTYPE_DATA;
- _xs_put_size(v + 1, total_size);
+ _xs_put_size(v, total_size);
memcpy(&v[1 + _XS_TYPE_SIZE], data, size);