summaryrefslogtreecommitdiff
path: root/object/simple.c
diff options
context:
space:
mode:
Diffstat (limited to 'object/simple.c')
-rw-r--r--object/simple.c230
1 files changed, 230 insertions, 0 deletions
diff --git a/object/simple.c b/object/simple.c
new file mode 100644
index 00000000..02da3cec
--- /dev/null
+++ b/object/simple.c
@@ -0,0 +1,230 @@
+#include <fitz.h>
+
+#define NEWOBJ(KIND,SIZE) \
+ fz_obj *o; \
+ o = *op = fz_malloc(SIZE); \
+ if (!o) return fz_outofmem; \
+ o->kind = KIND; \
+ o->refcount = 1
+
+fz_error *
+fz_newnull(fz_obj **op)
+{
+ NEWOBJ(FZ_NULL, sizeof (fz_obj));
+ return nil;
+}
+
+fz_error *
+fz_newbool(fz_obj **op, int b)
+{
+ NEWOBJ(FZ_BOOL, sizeof (fz_obj));
+ o->u.b = b;
+ return nil;
+}
+
+fz_error *
+fz_newint(fz_obj **op, int i)
+{
+ NEWOBJ(FZ_INT, sizeof (fz_obj));
+ o->u.i = i;
+ return nil;
+}
+
+fz_error *
+fz_newreal(fz_obj **op, float f)
+{
+ NEWOBJ(FZ_REAL, sizeof (fz_obj));
+ o->u.f = f;
+ return nil;
+}
+
+fz_error *
+fz_newstring(fz_obj **op, char *str, int len)
+{
+ NEWOBJ(FZ_STRING, offsetof(fz_obj, u.s.buf) + len);
+ o->u.s.len = len;
+ memcpy(o->u.s.buf, str, len);
+ return nil;
+}
+
+fz_error *
+fz_newname(fz_obj **op, char *str)
+{
+ NEWOBJ(FZ_NAME, offsetof(fz_obj, u.n) + strlen(str) + 1);
+ strcpy(o->u.n, str);
+ return nil;
+}
+
+fz_error *
+fz_newindirect(fz_obj **op, int objid, int genid)
+{
+ NEWOBJ(FZ_INDIRECT, sizeof (fz_obj));
+ o->u.r.oid = objid;
+ o->u.r.gid = genid;
+ return nil;
+}
+
+fz_error *
+fz_newpointer(fz_obj **op, void *p)
+{
+ NEWOBJ(FZ_POINTER, sizeof (fz_obj));
+ o->u.p = p;
+ return nil;
+}
+
+fz_obj *
+fz_keepobj(fz_obj *o)
+{
+ o->refcount ++;
+ return o;
+}
+
+fz_obj *
+fz_dropobj(fz_obj *o)
+{
+ o->refcount --;
+ if (o->refcount == 0) {
+ if (o->kind == FZ_ARRAY)
+ fz_freearray(o);
+ else if (o->kind == FZ_DICT)
+ fz_freedict(o);
+ else
+ fz_free(o);
+ }
+ return nil;
+}
+
+int
+fz_isnull(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_NULL : 0;
+}
+
+int
+fz_isbool(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_BOOL : 0;
+}
+
+int
+fz_isint(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_INT : 0;
+}
+
+int
+fz_isreal(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_REAL : 0;
+}
+
+int
+fz_isstring(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_STRING : 0;
+}
+
+int
+fz_isname(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_NAME : 0;
+}
+
+int
+fz_isarray(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_ARRAY : 0;
+}
+
+int
+fz_isdict(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_DICT : 0;
+}
+
+int
+fz_isindirect(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_INDIRECT : 0;
+}
+
+int
+fz_ispointer(fz_obj *obj)
+{
+ return obj ? obj->kind == FZ_POINTER : 0;
+}
+
+int
+fz_tobool(fz_obj *obj)
+{
+ if (fz_isbool(obj))
+ return obj->u.b;
+ return 0;
+}
+
+int
+fz_toint(fz_obj *obj)
+{
+ if (fz_isint(obj))
+ return obj->u.i;
+ return 0;
+}
+
+float
+fz_toreal(fz_obj *obj)
+{
+ if (fz_isreal(obj))
+ return obj->u.f;
+ if (fz_isint(obj))
+ return obj->u.i;
+ return 0;
+}
+
+char *
+fz_toname(fz_obj *obj)
+{
+ if (fz_isname(obj))
+ return obj->u.n;
+ return "";
+}
+
+char *
+fz_tostringbuf(fz_obj *obj)
+{
+ if (fz_isstring(obj))
+ return obj->u.s.buf;
+ return "";
+}
+
+int
+fz_tostringlen(fz_obj *obj)
+{
+ if (fz_isstring(obj))
+ return obj->u.s.len;
+ return 0;
+}
+
+int
+fz_toobjid(fz_obj *obj)
+{
+ if (fz_isindirect(obj))
+ return obj->u.r.oid;
+ return 0;
+}
+
+int
+fz_togenid(fz_obj *obj)
+{
+ if (fz_isindirect(obj))
+ return obj->u.r.gid;
+ return 0;
+}
+
+void *
+fz_topointer(fz_obj *obj)
+{
+ if (fz_ispointer(obj))
+ return obj->u.p;
+ return nil;
+}
+