summaryrefslogtreecommitdiff
path: root/object/dict.c
diff options
context:
space:
mode:
Diffstat (limited to 'object/dict.c')
-rw-r--r--object/dict.c355
1 files changed, 0 insertions, 355 deletions
diff --git a/object/dict.c b/object/dict.c
deleted file mode 100644
index a0fb6d25..00000000
--- a/object/dict.c
+++ /dev/null
@@ -1,355 +0,0 @@
-#include <fitz.h>
-
-/* keep either names or strings in the dict. don't mix & match. */
-
-static int keyvalcmp(const void *ap, const void *bp)
-{
- const fz_keyval *a = ap;
- const fz_keyval *b = bp;
- if (fz_isname(a->k))
- return strcmp(fz_toname(a->k), fz_toname(b->k));
- if (fz_isstring(a->k))
- return strcmp(fz_tostrbuf(a->k), fz_tostrbuf(b->k));
- return -1;
-}
-
-static inline int keystrcmp(fz_obj *key, char *s)
-{
- if (fz_isname(key))
- return strcmp(fz_toname(key), s);
- if (fz_isstring(key))
- return strcmp(fz_tostrbuf(key), s);
- return -1;
-}
-
-fz_error *
-fz_newdict(fz_obj **op, int initialcap)
-{
- fz_obj *obj;
- int i;
-
- obj = *op = fz_malloc(sizeof (fz_obj));
- if (!obj) return fz_outofmem;
-
- obj->refs = 1;
- obj->kind = FZ_DICT;
-
- obj->u.d.sorted = 1;
- obj->u.d.len = 0;
- obj->u.d.cap = initialcap > 0 ? initialcap : 10;
-
- obj->u.d.items = fz_malloc(sizeof(fz_keyval) * obj->u.d.cap);
- if (!obj->u.d.items) { fz_free(obj); return fz_outofmem; }
-
- for (i = 0; i < obj->u.d.cap; i++) {
- obj->u.d.items[i].k = nil;
- obj->u.d.items[i].v = nil;
- }
-
- return nil;
-}
-
-fz_error *
-fz_copydict(fz_obj **op, fz_obj *obj)
-{
- fz_error *error;
- fz_obj *new;
- int i;
-
- if (!fz_isdict(obj))
- return fz_throw("typecheck in copydict");
-
- error = fz_newdict(&new, obj->u.d.cap);
- if (error) return error;
- *op = new;
-
- for (i = 0; i < fz_dictlen(obj); i++) {
- error = fz_dictput(new, fz_dictgetkey(obj, i), fz_dictgetval(obj, i));
- if (error) { fz_dropobj(new); return error; }
- }
-
- return nil;
-}
-
-fz_error *
-fz_deepcopydict(fz_obj **op, fz_obj *obj)
-{
- fz_error *error;
- fz_obj *new;
- fz_obj *val;
- int i;
-
- if (!fz_isdict(obj))
- return fz_throw("typecheck in deepcopydict");
-
- error = fz_newdict(&new, obj->u.d.cap);
- if (error) return error;
- *op = new;
-
- for (i = 0; i < fz_dictlen(obj); i++)
- {
- val = fz_dictgetval(obj, i);
-
- if (fz_isarray(val)) {
- error = fz_deepcopyarray(&val, val);
- if (error) { fz_dropobj(new); return error; }
- error = fz_dictput(new, fz_dictgetkey(obj, i), val);
- if (error) { fz_dropobj(val); fz_dropobj(new); return error; }
- fz_dropobj(val);
- }
-
- else if (fz_isdict(val)) {
- error = fz_deepcopydict(&val, val);
- if (error) { fz_dropobj(new); return error; }
- error = fz_dictput(new, fz_dictgetkey(obj, i), val);
- if (error) { fz_dropobj(val); fz_dropobj(new); return error; }
- fz_dropobj(val);
- }
-
- else {
- error = fz_dictput(new, fz_dictgetkey(obj, i), val);
- if (error) { fz_dropobj(new); return error; }
- }
- }
-
- return nil;
-}
-
-static fz_error *
-growdict(fz_obj *obj)
-{
- fz_keyval *newitems;
- int newcap;
- int i;
-
- newcap = obj->u.d.cap * 2;
-
- newitems = fz_realloc(obj->u.d.items, sizeof(fz_keyval) * newcap);
- if (!newitems) return fz_outofmem;
-
- obj->u.d.items = newitems;
- for (i = obj->u.d.cap; i < newcap; i++) {
- obj->u.d.items[i].k = nil;
- obj->u.d.items[i].v = nil;
- }
- obj->u.d.cap = newcap;
-
- return nil;
-}
-
-int
-fz_dictlen(fz_obj *obj)
-{
- if (!fz_isdict(obj))
- return 0;
- return obj->u.d.len;
-}
-
-fz_obj *
-fz_dictgetkey(fz_obj *obj, int i)
-{
- if (!fz_isdict(obj))
- return nil;
-
- if (i < 0 || i >= obj->u.d.len)
- return nil;
-
- return obj->u.d.items[i].k;
-}
-
-fz_obj *
-fz_dictgetval(fz_obj *obj, int i)
-{
- if (!fz_isdict(obj))
- return nil;
-
- if (i < 0 || i >= obj->u.d.len)
- return nil;
-
- return obj->u.d.items[i].v;
-}
-
-static inline int dictfinds(fz_obj *obj, char *key)
-{
- if (obj->u.d.sorted)
- {
- int l = 0;
- int r = obj->u.d.len - 1;
- while (l <= r)
- {
- int m = (l + r) >> 1;
- int c = -keystrcmp(obj->u.d.items[m].k, key);
- if (c < 0)
- r = m - 1;
- else if (c > 0)
- l = m + 1;
- else
- return m;
- }
- }
-
- else
- {
- int i;
- for (i = 0; i < obj->u.d.len; i++)
- if (keystrcmp(obj->u.d.items[i].k, key) == 0)
- return i;
- }
-
- return -1;
-}
-
-fz_obj *
-fz_dictgets(fz_obj *obj, char *key)
-{
- int i;
-
- if (!fz_isdict(obj))
- return nil;
-
- i = dictfinds(obj, key);
- if (i >= 0)
- return obj->u.d.items[i].v;
-
- return nil;
-}
-
-fz_obj *
-fz_dictget(fz_obj *obj, fz_obj *key)
-{
- if (fz_isname(key))
- return fz_dictgets(obj, fz_toname(key));
- if (fz_isstring(key))
- return fz_dictgets(obj, fz_tostrbuf(key));
- return nil;
-}
-
-fz_obj *
-fz_dictgetsa(fz_obj *obj, char *key, char *abbrev)
-{
- fz_obj *v;
- v = fz_dictgets(obj, key);
- if (v)
- return v;
- return fz_dictgets(obj, abbrev);
-}
-
-fz_error *
-fz_dictput(fz_obj *obj, fz_obj *key, fz_obj *val)
-{
- fz_error *error;
- char *s;
- int i;
-
- if (!fz_isdict(obj))
- return fz_throw("typecheck in dictput");
-
- if (fz_isname(key))
- s = fz_toname(key);
- else if (fz_isstring(key))
- s = fz_tostrbuf(key);
- else
- return fz_throw("typecheck in dictput");
-
- i = dictfinds(obj, s);
- if (i >= 0)
- {
- fz_dropobj(obj->u.d.items[i].v);
- obj->u.d.items[i].v = fz_keepobj(val);
- return nil;
- }
-
- if (obj->u.d.len + 1 > obj->u.d.cap)
- {
- error = growdict(obj);
- if (error)
- return error;
- }
-
- /* borked! */
- if (obj->u.d.len)
- if (keystrcmp(obj->u.d.items[obj->u.d.len - 1].k, s) > 0)
- obj->u.d.sorted = 0;
-
- obj->u.d.items[obj->u.d.len].k = fz_keepobj(key);
- obj->u.d.items[obj->u.d.len].v = fz_keepobj(val);
- obj->u.d.len ++;
-
- return nil;
-}
-
-fz_error *
-fz_dictputs(fz_obj *obj, char *key, fz_obj *val)
-{
- fz_error *error;
- fz_obj *keyobj;
- error = fz_newname(&keyobj, key);
- if (error) return error;
- error = fz_dictput(obj, keyobj, val);
- fz_dropobj(keyobj);
- return error;
-}
-
-fz_error *
-fz_dictdels(fz_obj *obj, char *key)
-{
- int i;
-
- if (!fz_isdict(obj))
- return fz_throw("typecheck in dictdel");
-
- i = dictfinds(obj, key);
- if (i >= 0)
- {
- fz_dropobj(obj->u.d.items[i].k);
- fz_dropobj(obj->u.d.items[i].v);
- obj->u.d.sorted = 0;
- obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
- obj->u.d.len --;
- }
-
- return nil;
-}
-
-fz_error *
-fz_dictdel(fz_obj *obj, fz_obj *key)
-{
- if (fz_isname(key))
- return fz_dictdels(obj, fz_toname(key));
- else if (fz_isstring(key))
- return fz_dictdels(obj, fz_tostrbuf(key));
- else
- return fz_throw("typecheck in dictdel");
-}
-
-void
-fz_dropdict(fz_obj *obj)
-{
- int i;
-
- if (!fz_isdict(obj))
- return;
-
- for (i = 0; i < obj->u.d.len; i++) {
- if (obj->u.d.items[i].k)
- fz_dropobj(obj->u.d.items[i].k);
- if (obj->u.d.items[i].v)
- fz_dropobj(obj->u.d.items[i].v);
- }
-
- fz_free(obj->u.d.items);
- fz_free(obj);
-}
-
-void
-fz_sortdict(fz_obj *obj)
-{
- if (!fz_isdict(obj))
- return;
- if (!obj->u.d.sorted)
- {
- qsort(obj->u.d.items, obj->u.d.len, sizeof(fz_keyval), keyvalcmp);
- obj->u.d.sorted = 1;
- }
-}
-