summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-objects.h
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-objects.h')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-objects.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-objects.h b/pigeonhole/src/lib-sieve/sieve-objects.h
new file mode 100644
index 0000000..e3f300f
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/sieve-objects.h
@@ -0,0 +1,67 @@
+#ifndef SIEVE_OBJECTS_H
+#define SIEVE_OBJECTS_H
+
+/*
+ * Object definition
+ */
+
+struct sieve_object_def {
+ const char *identifier;
+ const struct sieve_operand_def *operand;
+ unsigned int code;
+};
+
+#define SIEVE_OBJECT(_identifier, _operand, _code) \
+ .obj_def = { \
+ .identifier = (_identifier), \
+ .operand = (_operand), \
+ .code = (_code) \
+ }
+
+/*
+ * Object instance
+ */
+
+struct sieve_object {
+ const struct sieve_object_def *def;
+ const struct sieve_extension *ext;
+};
+
+#define SIEVE_OBJECT_DEFAULT(_obj) \
+ { &((_obj).obj_def), NULL }
+
+#define SIEVE_OBJECT_EXTENSION(_obj) \
+ (_obj->object.ext)
+
+#define SIEVE_OBJECT_SET_DEF(_obj, def_value) \
+ STMT_START { \
+ (_obj)->def = def_value; \
+ (_obj)->object.def = &(_obj)->def->obj_def; \
+ } STMT_END
+
+
+/*
+ * Object coding
+ */
+
+void sieve_opr_object_emit
+ (struct sieve_binary_block *sblock, const struct sieve_extension *ext,
+ const struct sieve_object_def *obj_def);
+
+bool sieve_opr_object_read_data
+ (struct sieve_binary_block *sblock, const struct sieve_operand *operand,
+ const struct sieve_operand_class *opclass, sieve_size_t *address,
+ struct sieve_object *obj);
+
+bool sieve_opr_object_read
+ (const struct sieve_runtime_env *renv,
+ const struct sieve_operand_class *opclass, sieve_size_t *address,
+ struct sieve_object *obj);
+
+bool sieve_opr_object_dump
+ (const struct sieve_dumptime_env *denv,
+ const struct sieve_operand_class *opclass, sieve_size_t *address,
+ struct sieve_object *obj);
+
+
+#endif