[evolution-data-server] Add CamelSExp (copy of ESExp).



commit c656465e20b7d51c0df1be6236009964dd684218
Author: Matthew Barnes <mbarnes redhat com>
Date:   Mon Nov 14 21:53:02 2011 -0500

    Add CamelSExp (copy of ESExp).

 camel/Makefile.am                        |    2 +
 camel/camel-filter-driver.c              |  233 ++--
 camel/camel-filter-search.c              |  364 +++---
 camel/camel-folder-search.c              |  438 ++++----
 camel/camel-folder-search.h              |   60 +-
 camel/camel-search-private.c             |    4 +-
 camel/camel-search-private.h             |    4 +-
 camel/camel-search-sql-sexp.c            |  368 +++---
 camel/camel-sexp.c                       | 1861 ++++++++++++++++++++++++++++++
 camel/camel-sexp.h                       |  243 ++++
 camel/camel.h                            |    1 +
 camel/providers/imap/camel-imap-search.c |   32 +-
 docs/reference/camel/camel-docs.sgml     |    1 +
 docs/reference/camel/camel-sections.txt  |   43 +
 docs/reference/camel/camel.types         |    1 +
 15 files changed, 2901 insertions(+), 754 deletions(-)
---
diff --git a/camel/Makefile.am b/camel/Makefile.am
index 5d90f3a..79700c8 100644
--- a/camel/Makefile.am
+++ b/camel/Makefile.am
@@ -140,6 +140,7 @@ libcamel_1_2_la_SOURCES = 			\
 	camel-service.c				\
 	camel-session.c				\
 	camel-settings.c			\
+	camel-sexp.c				\
 	camel-smime-context.c			\
 	camel-store-settings.c			\
 	camel-store-summary.c			\
@@ -263,6 +264,7 @@ libcamelinclude_HEADERS =			\
 	camel-service.h				\
 	camel-session.h				\
 	camel-settings.h			\
+	camel-sexp.h				\
 	camel-smime-context.h			\
 	camel-store-settings.h			\
 	camel-store-summary.h			\
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index ea2da51..3b065e2 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -38,8 +38,6 @@
 #include <sys/wait.h>
 #endif
 
-#include <libedataserver/e-sexp.h>
-
 #include "camel-debug.h"
 #include "camel-file-utils.h"
 #include "camel-filter-driver.h"
@@ -48,6 +46,7 @@
 #include "camel-mime-message.h"
 #include "camel-service.h"
 #include "camel-session.h"
+#include "camel-sexp.h"
 #include "camel-store.h"
 #include "camel-stream-fs.h"
 #include "camel-stream-mem.h"
@@ -121,7 +120,7 @@ struct _CamelFilterDriverPrivate {
 	GError *error;
 
 	/* evaluator */
-	ESExp *eval;
+	CamelSExp *eval;
 };
 
 static void camel_filter_driver_log (CamelFilterDriver *driver, enum filter_log_t status, const gchar *desc, ...);
@@ -129,46 +128,46 @@ static void camel_filter_driver_log (CamelFilterDriver *driver, enum filter_log_
 static CamelFolder *open_folder (CamelFilterDriver *d, const gchar *folder_url);
 static gint close_folders (CamelFilterDriver *d);
 
-static ESExpResult *do_delete (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_forward_to (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_copy (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_move (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_stop (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_label (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_color (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_score (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_adjust_score (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *set_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *unset_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_shell (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_beep (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *play_sound (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *do_only_once (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
-static ESExpResult *pipe_message (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_delete (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_forward_to (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_copy (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_move (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_stop (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_label (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_color (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_score (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_adjust_score (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *set_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *unset_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_shell (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_beep (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *play_sound (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *do_only_once (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
+static CamelSExpResult *pipe_message (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFilterDriver *);
 
 /* these are our filter actions - each must have a callback */
 static struct {
 	const gchar *name;
-	ESExpFunc *func;
+	CamelSExpFunc func;
 	gint type;		/* set to 1 if a function can perform shortcut evaluation, or
 				   doesn't execute everything, 0 otherwise */
 } symbols[] = {
-	{ "delete",            (ESExpFunc *) do_delete,    0 },
-	{ "forward-to",        (ESExpFunc *) do_forward_to, 0 },
-	{ "copy-to",           (ESExpFunc *) do_copy,      0 },
-	{ "move-to",           (ESExpFunc *) do_move,      0 },
-	{ "stop",              (ESExpFunc *) do_stop,      0 },
-	{ "set-label",         (ESExpFunc *) do_label,     0 },
-	{ "set-color",        (ESExpFunc *) do_color,    0 },
-	{ "set-score",         (ESExpFunc *) do_score,     0 },
-	{ "adjust-score",      (ESExpFunc *) do_adjust_score, 0 },
-	{ "set-system-flag",   (ESExpFunc *) set_flag,     0 },
-	{ "unset-system-flag", (ESExpFunc *) unset_flag,   0 },
-	{ "pipe-message",      (ESExpFunc *) pipe_message, 0 },
-	{ "shell",             (ESExpFunc *) do_shell,     0 },
-	{ "beep",              (ESExpFunc *) do_beep,      0 },
-	{ "play-sound",        (ESExpFunc *) play_sound,   0 },
-	{ "only-once",         (ESExpFunc *) do_only_once, 0 }
+	{ "delete",            (CamelSExpFunc) do_delete,    0 },
+	{ "forward-to",        (CamelSExpFunc) do_forward_to, 0 },
+	{ "copy-to",           (CamelSExpFunc) do_copy,      0 },
+	{ "move-to",           (CamelSExpFunc) do_move,      0 },
+	{ "stop",              (CamelSExpFunc) do_stop,      0 },
+	{ "set-label",         (CamelSExpFunc) do_label,     0 },
+	{ "set-color",         (CamelSExpFunc) do_color,    0 },
+	{ "set-score",         (CamelSExpFunc) do_score,     0 },
+	{ "adjust-score",      (CamelSExpFunc) do_adjust_score, 0 },
+	{ "set-system-flag",   (CamelSExpFunc) set_flag,     0 },
+	{ "unset-system-flag", (CamelSExpFunc) unset_flag,   0 },
+	{ "pipe-message",      (CamelSExpFunc) pipe_message, 0 },
+	{ "shell",             (CamelSExpFunc) do_shell,     0 },
+	{ "beep",              (CamelSExpFunc) do_beep,      0 },
+	{ "play-sound",        (CamelSExpFunc) play_sound,   0 },
+	{ "only-once",         (CamelSExpFunc) do_only_once, 0 }
 };
 
 G_DEFINE_TYPE (CamelFilterDriver, camel_filter_driver, CAMEL_TYPE_OBJECT)
@@ -222,7 +221,7 @@ filter_driver_finalize (GObject *object)
 	g_hash_table_foreach (priv->only_once, free_hash_strings, object);
 	g_hash_table_destroy (priv->only_once);
 
-	e_sexp_unref (priv->eval);
+	g_object_unref (priv->eval);
 
 	while ((node = (struct _filter_rule *) camel_dlist_remhead (&priv->rules))) {
 		g_free (node->match);
@@ -258,17 +257,17 @@ camel_filter_driver_init (CamelFilterDriver *filter_driver)
 
 	camel_dlist_init (&filter_driver->priv->rules);
 
-	filter_driver->priv->eval = e_sexp_new ();
+	filter_driver->priv->eval = camel_sexp_new ();
 
 	/* Load in builtin symbols */
 	for (ii = 0; ii < G_N_ELEMENTS (symbols); ii++) {
 		if (symbols[ii].type == 1) {
-			e_sexp_add_ifunction (
+			camel_sexp_add_ifunction (
 				filter_driver->priv->eval, 0,
-				symbols[ii].name, (ESExpIFunc *)
+				symbols[ii].name, (CamelSExpIFunc)
 				symbols[ii].func, filter_driver);
 		} else {
-			e_sexp_add_function (
+			camel_sexp_add_function (
 				filter_driver->priv->eval, 0,
 				symbols[ii].name, symbols[ii].func,
 				filter_driver);
@@ -445,10 +444,10 @@ camel_filter_driver_set_global (CamelFilterDriver *d,
 }
 #endif
 
-static ESExpResult *
-do_delete (struct _ESExp *f,
+static CamelSExpResult *
+do_delete (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpResult **argv,
+           struct _CamelSExpResult **argv,
            CamelFilterDriver *driver)
 {
 	d(fprintf (stderr, "doing delete\n"));
@@ -458,10 +457,10 @@ do_delete (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_forward_to (struct _ESExp *f,
+static CamelSExpResult *
+do_forward_to (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -469,7 +468,7 @@ do_forward_to (struct _ESExp *f,
 	d(fprintf (stderr, "marking message for forwarding\n"));
 
 	/* requires one parameter, string with a destination address */
-	if (argc < 1 || argv[0]->type != ESEXP_RES_STRING)
+	if (argc < 1 || argv[0]->type != CAMEL_SEXP_RES_STRING)
 		return NULL;
 
 	/* make sure we have the message... */
@@ -487,10 +486,10 @@ do_forward_to (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_copy (struct _ESExp *f,
+static CamelSExpResult *
+do_copy (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpResult **argv,
+         struct _CamelSExpResult **argv,
          CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -499,7 +498,7 @@ do_copy (struct _ESExp *f,
 	d(fprintf (stderr, "copying message...\n"));
 
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING) {
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 			/* open folders we intent to copy to */
 			gchar *folder = argv[i]->value.string;
 			CamelFolder *outbox;
@@ -547,10 +546,10 @@ do_copy (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_move (struct _ESExp *f,
+static CamelSExpResult *
+do_move (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpResult **argv,
+         struct _CamelSExpResult **argv,
          CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -559,7 +558,7 @@ do_move (struct _ESExp *f,
 	d(fprintf (stderr, "moving message...\n"));
 
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING) {
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 			/* open folders we intent to move to */
 			gchar *folder = argv[i]->value.string;
 			CamelFolder *outbox;
@@ -629,10 +628,10 @@ do_move (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_stop (struct _ESExp *f,
+static CamelSExpResult *
+do_stop (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpResult **argv,
+         struct _CamelSExpResult **argv,
          CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -644,16 +643,16 @@ do_stop (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_label (struct _ESExp *f,
+static CamelSExpResult *
+do_label (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 
 	d(fprintf (stderr, "setting label tag\n"));
-	if (argc > 0 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc > 0 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		/* This is a list of new labels, we should used these in case of passing in old names.
 		 * This all is required only because backward compatibility. */
 		const gchar *new_labels[] = { "$Labelimportant", "$Labelwork", "$Labelpersonal", "$Labeltodo", "$Labellater", NULL};
@@ -679,16 +678,16 @@ do_label (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_color (struct _ESExp *f,
+static CamelSExpResult *
+do_color (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 
 	d(fprintf (stderr, "setting color tag\n"));
-	if (argc > 0 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc > 0 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		if (p->source && p->uid && camel_folder_has_summary_capability (p->source))
 			camel_folder_set_message_user_tag (p->source, p->uid, "color", argv[0]->value.string);
 		else
@@ -699,16 +698,16 @@ do_color (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_score (struct _ESExp *f,
+static CamelSExpResult *
+do_score (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 
 	d(fprintf (stderr, "setting score tag\n"));
-	if (argc > 0 && argv[0]->type == ESEXP_RES_INT) {
+	if (argc > 0 && argv[0]->type == CAMEL_SEXP_RES_INT) {
 		gchar *value;
 
 		value = g_strdup_printf ("%d", argv[0]->value.number);
@@ -720,16 +719,16 @@ do_score (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_adjust_score (struct _ESExp *f,
+static CamelSExpResult *
+do_adjust_score (struct _CamelSExp *f,
                  gint argc,
-                 struct _ESExpResult **argv,
+                 struct _CamelSExpResult **argv,
                  CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 
 	d(fprintf (stderr, "adjusting score tag\n"));
-	if (argc > 0 && argv[0]->type == ESEXP_RES_INT) {
+	if (argc > 0 && argv[0]->type == CAMEL_SEXP_RES_INT) {
 		gchar *value;
 		gint old;
 
@@ -744,17 +743,17 @@ do_adjust_score (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-set_flag (struct _ESExp *f,
+static CamelSExpResult *
+set_flag (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 	guint32 flags;
 
 	d(fprintf (stderr, "setting flag\n"));
-	if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc == 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		flags = camel_system_flag (argv[0]->value.string);
 		if (p->source && p->uid && camel_folder_has_summary_capability (p->source))
 			camel_folder_set_message_flags (
@@ -769,17 +768,17 @@ set_flag (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-unset_flag (struct _ESExp *f,
+static CamelSExpResult *
+unset_flag (struct _CamelSExp *f,
             gint argc,
-            struct _ESExpResult **argv,
+            struct _CamelSExpResult **argv,
             CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 	guint32 flags;
 
 	d(fprintf (stderr, "unsetting flag\n"));
-	if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc == 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		flags = camel_system_flag (argv[0]->value.string);
 		if (p->source && p->uid && camel_folder_has_summary_capability (p->source))
 			camel_folder_set_message_flags (
@@ -824,9 +823,9 @@ child_watch (GPid pid,
 }
 
 static gint
-pipe_to_system (struct _ESExp *f,
+pipe_to_system (struct _CamelSExp *f,
                 gint argc,
-                struct _ESExpResult **argv,
+                struct _CamelSExpResult **argv,
                 CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -958,17 +957,17 @@ pipe_to_system (struct _ESExp *f,
 #endif
 }
 
-static ESExpResult *
-pipe_message (struct _ESExp *f,
+static CamelSExpResult *
+pipe_message (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               CamelFilterDriver *driver)
 {
 	gint i;
 
 	/* make sure all args are strings */
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type != ESEXP_RES_STRING)
+		if (argv[i]->type != CAMEL_SEXP_RES_STRING)
 			return NULL;
 	}
 
@@ -978,10 +977,10 @@ pipe_message (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_shell (struct _ESExp *f,
+static CamelSExpResult *
+do_shell (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -997,7 +996,7 @@ do_shell (struct _ESExp *f,
 
 	/* make sure all args are strings */
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type != ESEXP_RES_STRING)
+		if (argv[i]->type != CAMEL_SEXP_RES_STRING)
 			goto done;
 
 		g_ptr_array_add (args, argv[i]->value.string);
@@ -1022,10 +1021,10 @@ do_shell (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_beep (struct _ESExp *f,
+static CamelSExpResult *
+do_beep (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpResult **argv,
+         struct _CamelSExpResult **argv,
          CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -1040,17 +1039,17 @@ do_beep (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-play_sound (struct _ESExp *f,
+static CamelSExpResult *
+play_sound (struct _CamelSExp *f,
             gint argc,
-            struct _ESExpResult **argv,
+            struct _CamelSExpResult **argv,
             CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
 
 	d(fprintf (stderr, "play sound\n"));
 
-	if (p->playfunc && argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (p->playfunc && argc == 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		p->playfunc (driver, argv[0]->value.string, p->playdata);
 		camel_filter_driver_log (driver, FILTER_LOG_ACTION, "Play sound");
 	}
@@ -1058,10 +1057,10 @@ play_sound (struct _ESExp *f,
 	return NULL;
 }
 
-static ESExpResult *
-do_only_once (struct _ESExp *f,
+static CamelSExpResult *
+do_only_once (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               CamelFilterDriver *driver)
 {
 	CamelFilterDriverPrivate *p = driver->priv;
@@ -1222,33 +1221,33 @@ run_only_once (gpointer key,
                struct _run_only_once *data)
 {
 	CamelFilterDriverPrivate *p = data->driver->priv;
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf ("evaluating: %s\n\n", action));
 
-	e_sexp_input_text (p->eval, action, strlen (action));
-	if (e_sexp_parse (p->eval) == -1) {
+	camel_sexp_input_text (p->eval, action, strlen (action));
+	if (camel_sexp_parse (p->eval) == -1) {
 		if (data->error == NULL)
 			g_set_error (
 				&data->error,
 				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Error parsing filter: %s: %s"),
-				e_sexp_error (p->eval), action);
+				camel_sexp_error (p->eval), action);
 		goto done;
 	}
 
-	r = e_sexp_eval (p->eval);
+	r = camel_sexp_eval (p->eval);
 	if (r == NULL) {
 		if (data->error == NULL)
 			g_set_error (
 				&data->error,
 				CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Error executing filter: %s: %s"),
-				e_sexp_error (p->eval), action);
+				camel_sexp_error (p->eval), action);
 		goto done;
 	}
 
-	e_sexp_result_free (p->eval, r);
+	camel_sexp_result_free (p->eval, r);
 
  done:
 
@@ -1599,7 +1598,7 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
 	struct _filter_rule *node;
 	gboolean freeinfo = FALSE;
 	gboolean filtered = FALSE;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint result;
 
 	/* FIXME: make me into a g_return_if_fail/g_assert or whatever... */
@@ -1674,15 +1673,15 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
 				       camel_message_info_subject(info)?camel_message_info_subject(info):"?no subject?", node->name);
 
 			/* perform necessary filtering actions */
-			e_sexp_input_text (p->eval, node->action, strlen (node->action));
-			if (e_sexp_parse (p->eval) == -1) {
+			camel_sexp_input_text (p->eval, node->action, strlen (node->action));
+			if (camel_sexp_parse (p->eval) == -1) {
 				g_set_error (
 					error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 					_("Error parsing filter: %s: %s"),
-					e_sexp_error (p->eval), node->action);
+					camel_sexp_error (p->eval), node->action);
 				goto error;
 			}
-			r = e_sexp_eval (p->eval);
+			r = camel_sexp_eval (p->eval);
 			if (p->error != NULL)
 				goto error;
 
@@ -1690,10 +1689,10 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
 				g_set_error (
 					error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 					_("Error executing filter: %s: %s"),
-					e_sexp_error (p->eval), node->action);
+					camel_sexp_error (p->eval), node->action);
 				goto error;
 			}
-			e_sexp_result_free (p->eval, r);
+			camel_sexp_result_free (p->eval, r);
 		default:
 			break;
 		}
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 856a67d..2cd3525 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -43,8 +43,6 @@
 #include <sys/wait.h>
 #endif
 
-#include <libedataserver/e-sexp.h>
-
 #include "camel-debug.h"
 #include "camel-filter-search.h"
 #include "camel-iconv.h"
@@ -70,64 +68,64 @@ typedef struct {
 	GError **error;
 } FilterMessageSearch;
 
-/* ESExp callbacks */
-static ESExpResult *header_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_matches (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_starts_with (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_ends_with (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_exists (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_soundex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_full_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *match_all (struct _ESExp *f, gint argc, struct _ESExpTerm **argv, FilterMessageSearch *fms);
-static ESExpResult *body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *body_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *user_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *user_tag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *system_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *get_sent_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *get_received_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *header_source (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *pipe_message (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
-static ESExpResult *junk_test (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
+/* CamelSExp callbacks */
+static CamelSExpResult *header_contains (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_matches (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_starts_with (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_ends_with (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_exists (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_soundex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_full_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *match_all (struct _CamelSExp *f, gint argc, struct _CamelSExpTerm **argv, FilterMessageSearch *fms);
+static CamelSExpResult *body_contains (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *body_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *user_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *user_tag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *system_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *get_sent_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *get_received_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *get_current_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *get_relative_months (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *header_source (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *get_size (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *pipe_message (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
+static CamelSExpResult *junk_test (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, FilterMessageSearch *fms);
 
 /* builtin functions */
 static struct {
 	const gchar *name;
-	ESExpFunc *func;
+	CamelSExpFunc func;
 	gint type;		/* set to 1 if a function can perform shortcut evaluation, or
 				   doesn't execute everything, 0 otherwise */
 } symbols[] = {
-	{ "match-all",          (ESExpFunc *) match_all,          1 },
-	{ "body-contains",      (ESExpFunc *) body_contains,      0 },
-	{ "body-regex",         (ESExpFunc *) body_regex,         0 },
-	{ "header-contains",    (ESExpFunc *) header_contains,    0 },
-	{ "header-matches",     (ESExpFunc *) header_matches,     0 },
-	{ "header-starts-with", (ESExpFunc *) header_starts_with, 0 },
-	{ "header-ends-with",   (ESExpFunc *) header_ends_with,   0 },
-	{ "header-exists",      (ESExpFunc *) header_exists,      0 },
-	{ "header-soundex",     (ESExpFunc *) header_soundex,     0 },
-	{ "header-regex",       (ESExpFunc *) header_regex,       0 },
-	{ "header-full-regex",  (ESExpFunc *) header_full_regex,  0 },
-	{ "user-tag",           (ESExpFunc *) user_tag,           0 },
-	{ "user-flag",          (ESExpFunc *) user_flag,          0 },
-	{ "system-flag",        (ESExpFunc *) system_flag,        0 },
-	{ "get-sent-date",      (ESExpFunc *) get_sent_date,      0 },
-	{ "get-received-date",  (ESExpFunc *) get_received_date,  0 },
-	{ "get-current-date",   (ESExpFunc *) get_current_date,   0 },
-	{ "get-relative-months",(ESExpFunc *) get_relative_months,0 },
-	{ "header-source",      (ESExpFunc *) header_source,      0 },
-	{ "get-size",           (ESExpFunc *) get_size,           0 },
-	{ "pipe-message",       (ESExpFunc *) pipe_message,       0 },
-	{ "junk-test",          (ESExpFunc *) junk_test,          0 },
+	{ "match-all",          (CamelSExpFunc) match_all,          1 },
+	{ "body-contains",      (CamelSExpFunc) body_contains,      0 },
+	{ "body-regex",         (CamelSExpFunc) body_regex,         0 },
+	{ "header-contains",    (CamelSExpFunc) header_contains,    0 },
+	{ "header-matches",     (CamelSExpFunc) header_matches,     0 },
+	{ "header-starts-with", (CamelSExpFunc) header_starts_with, 0 },
+	{ "header-ends-with",   (CamelSExpFunc) header_ends_with,   0 },
+	{ "header-exists",      (CamelSExpFunc) header_exists,      0 },
+	{ "header-soundex",     (CamelSExpFunc) header_soundex,     0 },
+	{ "header-regex",       (CamelSExpFunc) header_regex,       0 },
+	{ "header-full-regex",  (CamelSExpFunc) header_full_regex,  0 },
+	{ "user-tag",           (CamelSExpFunc) user_tag,           0 },
+	{ "user-flag",          (CamelSExpFunc) user_flag,          0 },
+	{ "system-flag",        (CamelSExpFunc) system_flag,        0 },
+	{ "get-sent-date",      (CamelSExpFunc) get_sent_date,      0 },
+	{ "get-received-date",  (CamelSExpFunc) get_received_date,  0 },
+	{ "get-current-date",   (CamelSExpFunc) get_current_date,   0 },
+	{ "get-relative-months",(CamelSExpFunc) get_relative_months,0 },
+	{ "header-source",      (CamelSExpFunc) header_source,      0 },
+	{ "get-size",           (CamelSExpFunc) get_size,           0 },
+	{ "pipe-message",       (CamelSExpFunc) pipe_message,       0 },
+	{ "junk-test",          (CamelSExpFunc) junk_test,          0 },
 };
 
 static CamelMimeMessage *
 camel_filter_search_get_message (FilterMessageSearch *fms,
-                                 struct _ESExp *sexp)
+                                 struct _CamelSExp *sexp)
 {
 	if (fms->message)
 		return fms->message;
@@ -135,35 +133,35 @@ camel_filter_search_get_message (FilterMessageSearch *fms,
 	fms->message = fms->get_message (fms->get_message_data, fms->error);
 
 	if (fms->message == NULL)
-		e_sexp_fatal_error (sexp, _("Failed to retrieve message"));
+		camel_sexp_fatal_error (sexp, _("Failed to retrieve message"));
 
 	return fms->message;
 }
 
-static ESExpResult *
-check_header (struct _ESExp *f,
+static CamelSExpResult *
+check_header (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               FilterMessageSearch *fms,
               camel_search_match_t how)
 {
 	gboolean matched = FALSE;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 
-	if (argc > 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc > 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		gchar *name = argv[0]->value.string;
 
 		/* shortcut: a match for "" against any header always matches */
 		for (i = 1; i < argc && !matched; i++)
-			matched = argv[i]->type == ESEXP_RES_STRING && argv[i]->value.string[0] == 0;
+			matched = argv[i]->type == CAMEL_SEXP_RES_STRING && argv[i]->value.string[0] == 0;
 
 		if (g_ascii_strcasecmp(name, "x-camel-mlist") == 0) {
 			const gchar *list = camel_message_info_mlist (fms->info);
 
 			if (list) {
 				for (i = 1; i < argc && !matched; i++) {
-					if (argv[i]->type == ESEXP_RES_STRING)
+					if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 						matched = camel_search_header_match (list, argv[i]->value.string, how, CAMEL_SEARCH_TYPE_MLIST, NULL);
 				}
 			}
@@ -192,7 +190,7 @@ check_header (struct _ESExp *f,
 			for (header = mime_part->headers; header && !matched; header = header->next) {
 				if (!g_ascii_strcasecmp (header->name, name)) {
 					for (i = 1; i < argc && !matched; i++) {
-						if (argv[i]->type == ESEXP_RES_STRING)
+						if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 							matched = camel_search_header_match (header->value, argv[i]->value.string, how, type, charset);
 					}
 				}
@@ -200,95 +198,95 @@ check_header (struct _ESExp *f,
 		}
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = matched;
 
 	return r;
 }
 
-static ESExpResult *
-header_contains (struct _ESExp *f,
+static CamelSExpResult *
+header_contains (struct _CamelSExp *f,
                  gint argc,
-                 struct _ESExpResult **argv,
+                 struct _CamelSExpResult **argv,
                  FilterMessageSearch *fms)
 {
 	return check_header (f, argc, argv, fms, CAMEL_SEARCH_MATCH_CONTAINS);
 }
 
-static ESExpResult *
-header_matches (struct _ESExp *f,
+static CamelSExpResult *
+header_matches (struct _CamelSExp *f,
                 gint argc,
-                struct _ESExpResult **argv,
+                struct _CamelSExpResult **argv,
                 FilterMessageSearch *fms)
 {
 	return check_header (f, argc, argv, fms, CAMEL_SEARCH_MATCH_EXACT);
 }
 
-static ESExpResult *
-header_starts_with (struct _ESExp *f,
+static CamelSExpResult *
+header_starts_with (struct _CamelSExp *f,
                     gint argc,
-                    struct _ESExpResult **argv,
+                    struct _CamelSExpResult **argv,
                     FilterMessageSearch *fms)
 {
 	return check_header (f, argc, argv, fms, CAMEL_SEARCH_MATCH_STARTS);
 }
 
-static ESExpResult *
-header_ends_with (struct _ESExp *f,
+static CamelSExpResult *
+header_ends_with (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpResult **argv,
+                  struct _CamelSExpResult **argv,
                   FilterMessageSearch *fms)
 {
 	return check_header (f, argc, argv, fms, CAMEL_SEARCH_MATCH_ENDS);
 }
 
-static ESExpResult *
-header_soundex (struct _ESExp *f,
+static CamelSExpResult *
+header_soundex (struct _CamelSExp *f,
                 gint argc,
-                struct _ESExpResult **argv,
+                struct _CamelSExpResult **argv,
                 FilterMessageSearch *fms)
 {
 	return check_header (f, argc, argv, fms, CAMEL_SEARCH_MATCH_SOUNDEX);
 }
 
-static ESExpResult *
-header_exists (struct _ESExp *f,
+static CamelSExpResult *
+header_exists (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                FilterMessageSearch *fms)
 {
 	CamelMimeMessage *message;
 	gboolean matched = FALSE;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 
 	message = camel_filter_search_get_message (fms, f);
 
 	for (i = 0; i < argc && !matched; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING)
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 			matched = camel_medium_get_header (CAMEL_MEDIUM (message), argv[i]->value.string) != NULL;
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = matched;
 
 	return r;
 }
 
-static ESExpResult *
-header_regex (struct _ESExp *f,
+static CamelSExpResult *
+header_regex (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               FilterMessageSearch *fms)
 {
-	ESExpResult *r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	CamelSExpResult *r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	CamelMimeMessage *message;
 	regex_t pattern;
 	const gchar *contents;
 
 	message = camel_filter_search_get_message (fms, f);
 
-	if (argc > 1 && argv[0]->type == ESEXP_RES_STRING
+	if (argc > 1 && argv[0]->type == CAMEL_SEXP_RES_STRING
 	    && (contents = camel_medium_get_header (CAMEL_MEDIUM (message), argv[0]->value.string))
 	    && camel_search_build_match_regex (&pattern, CAMEL_SEARCH_MATCH_REGEX | CAMEL_SEARCH_MATCH_ICASE, argc - 1, argv + 1, fms->error) == 0) {
 		r->value.boolean = regexec (&pattern, contents, 0, NULL, 0) == 0;
@@ -327,13 +325,13 @@ get_full_header (CamelMimeMessage *message)
 	return ret;
 }
 
-static ESExpResult *
-header_full_regex (struct _ESExp *f,
+static CamelSExpResult *
+header_full_regex (struct _CamelSExp *f,
                    gint argc,
-                   struct _ESExpResult **argv,
+                   struct _CamelSExpResult **argv,
                    FilterMessageSearch *fms)
 {
-	ESExpResult *r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	CamelSExpResult *r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	CamelMimeMessage *message;
 	regex_t pattern;
 	gchar *contents;
@@ -351,31 +349,31 @@ header_full_regex (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-match_all (struct _ESExp *f,
+static CamelSExpResult *
+match_all (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpTerm **argv,
+           struct _CamelSExpTerm **argv,
            FilterMessageSearch *fms)
 {
 	/* match-all: when dealing with single messages is a no-op */
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	if (argc > 0)
-		return e_sexp_term_eval (f, argv[0]);
+		return camel_sexp_term_eval (f, argv[0]);
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = TRUE;
 
 	return r;
 }
 
-static ESExpResult *
-body_contains (struct _ESExp *f,
+static CamelSExpResult *
+body_contains (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                FilterMessageSearch *fms)
 {
-	ESExpResult *r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	CamelSExpResult *r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	CamelMimeMessage *message;
 	regex_t pattern;
 
@@ -389,13 +387,13 @@ body_contains (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-body_regex (struct _ESExp *f,
+static CamelSExpResult *
+body_regex (struct _CamelSExp *f,
             gint argc,
-            struct _ESExpResult **argv,
+            struct _CamelSExpResult **argv,
             FilterMessageSearch *fms)
 {
-	ESExpResult *r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	CamelSExpResult *r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	CamelMimeMessage *message;
 	regex_t pattern;
 
@@ -410,129 +408,129 @@ body_regex (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-user_flag (struct _ESExp *f,
+static CamelSExpResult *
+user_flag (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpResult **argv,
+           struct _CamelSExpResult **argv,
            FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gboolean truth = FALSE;
 	gint i;
 
 	/* performs an OR of all words */
 	for (i = 0; i < argc && !truth; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING
 		    && camel_message_info_user_flag (fms->info, argv[i]->value.string)) {
 			truth = TRUE;
 			break;
 		}
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = truth;
 
 	return r;
 }
 
-static ESExpResult *
-system_flag (struct _ESExp *f,
+static CamelSExpResult *
+system_flag (struct _CamelSExp *f,
              gint argc,
-             struct _ESExpResult **argv,
+             struct _CamelSExpResult **argv,
              FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
-	if (argc != 1 || argv[0]->type != ESEXP_RES_STRING)
-		e_sexp_fatal_error(f, _("Invalid arguments to (system-flag)"));
+	if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_STRING)
+		camel_sexp_fatal_error(f, _("Invalid arguments to (system-flag)"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = camel_system_flag_get (camel_message_info_flags (fms->info), argv[0]->value.string);
 
 	return r;
 }
 
-static ESExpResult *
-user_tag (struct _ESExp *f,
+static CamelSExpResult *
+user_tag (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	const gchar *tag;
 
-	if (argc != 1 || argv[0]->type != ESEXP_RES_STRING)
-		e_sexp_fatal_error(f, _("Invalid arguments to (user-tag)"));
+	if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_STRING)
+		camel_sexp_fatal_error(f, _("Invalid arguments to (user-tag)"));
 
 	tag = camel_message_info_user_tag (fms->info, argv[0]->value.string);
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup (tag ? tag : "");
 
 	return r;
 }
 
-static ESExpResult *
-get_sent_date (struct _ESExp *f,
+static CamelSExpResult *
+get_sent_date (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                FilterMessageSearch *fms)
 {
 	CamelMimeMessage *message;
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	message = camel_filter_search_get_message (fms, f);
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = camel_mime_message_get_date (message, NULL);
 
 	return r;
 }
 
-static ESExpResult *
-get_received_date (struct _ESExp *f,
+static CamelSExpResult *
+get_received_date (struct _CamelSExp *f,
                    gint argc,
-                   struct _ESExpResult **argv,
+                   struct _CamelSExpResult **argv,
                    FilterMessageSearch *fms)
 {
 	CamelMimeMessage *message;
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	message = camel_filter_search_get_message (fms, f);
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = camel_mime_message_get_date_received (message, NULL);
 
 	return r;
 }
 
-static ESExpResult *
-get_current_date (struct _ESExp *f,
+static CamelSExpResult *
+get_current_date (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpResult **argv,
+                  struct _CamelSExpResult **argv,
                   FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = time (NULL);
 
 	return r;
 }
 
-static ESExpResult *
-get_relative_months (struct _ESExp *f,
+static CamelSExpResult *
+get_relative_months (struct _CamelSExp *f,
                      gint argc,
-                     struct _ESExpResult **argv,
+                     struct _CamelSExpResult **argv,
                      FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
-	if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_INT) {
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = FALSE;
 
 		g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 		r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
 	}
 
@@ -570,14 +568,14 @@ get_service_for_source (CamelSession *session,
 	return service;
 }
 
-static ESExpResult *
-header_source (struct _ESExp *f,
+static CamelSExpResult *
+header_source (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                FilterMessageSearch *fms)
 {
 	CamelMimeMessage *message;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	const gchar *src;
 	CamelService *msg_source = NULL;
 	gboolean truth = FALSE;
@@ -596,28 +594,28 @@ header_source (struct _ESExp *f,
 		gint ii;
 
 		for (ii = 0; ii < argc && !truth; ii++) {
-			if (argv[ii]->type == ESEXP_RES_STRING) {
+			if (argv[ii]->type == CAMEL_SEXP_RES_STRING) {
 				truth = msg_source == get_service_for_source (fms->session, argv[ii]->value.string);
 			}
 		}
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = truth;
 
 	return r;
 }
 
 /* remember, the size comparisons are done at Kbytes */
-static ESExpResult *
-get_size (struct _ESExp *f,
+static CamelSExpResult *
+get_size (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = camel_message_info_size (fms->info) / 1024;
 
 	return r;
@@ -652,9 +650,9 @@ child_watch (GPid pid,
 }
 
 static gint
-run_command (struct _ESExp *f,
+run_command (struct _CamelSExp *f,
              gint argc,
-             struct _ESExpResult **argv,
+             struct _CamelSExpResult **argv,
              FilterMessageSearch *fms)
 {
 	CamelMimeMessage *message;
@@ -732,18 +730,18 @@ run_command (struct _ESExp *f,
 #endif
 }
 
-static ESExpResult *
-pipe_message (struct _ESExp *f,
+static CamelSExpResult *
+pipe_message (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint retval, i;
 
 	/* make sure all args are strings */
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type != ESEXP_RES_STRING) {
+		if (argv[i]->type != CAMEL_SEXP_RES_STRING) {
 			retval = -1;
 			goto done;
 		}
@@ -752,19 +750,19 @@ pipe_message (struct _ESExp *f,
 	retval = run_command (f, argc, argv, fms);
 
  done:
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = retval;
 
 	return r;
 }
 
-static ESExpResult *
-junk_test (struct _ESExp *f,
+static CamelSExpResult *
+junk_test (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpResult **argv,
+           struct _CamelSExpResult **argv,
            FilterMessageSearch *fms)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gboolean retval = FALSE;
 	CamelMessageInfo *info = fms->info;
 	CamelJunkFilter *junk_filter;
@@ -814,7 +812,7 @@ junk_test (struct _ESExp *f,
 			printf ("Message has a NotJunk flag set already, skipping junk test...\n");
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.number = retval;
 
 	return r;
@@ -843,8 +841,8 @@ camel_filter_search_match (CamelSession *session,
                            GError **error)
 {
 	FilterMessageSearch fms;
-	ESExp *sexp;
-	ESExpResult *result;
+	CamelSExp *sexp;
+	CamelSExpResult *result;
 	gboolean retval;
 	gint i;
 
@@ -856,42 +854,42 @@ camel_filter_search_match (CamelSession *session,
 	fms.source = source;
 	fms.error = error;
 
-	sexp = e_sexp_new ();
+	sexp = camel_sexp_new ();
 
 	for (i = 0; i < G_N_ELEMENTS (symbols); i++) {
 		if (symbols[i].type == 1)
-			e_sexp_add_ifunction (sexp, 0, symbols[i].name, (ESExpIFunc *) symbols[i].func, &fms);
+			camel_sexp_add_ifunction (sexp, 0, symbols[i].name, (CamelSExpIFunc) symbols[i].func, &fms);
 		else
-			e_sexp_add_function (sexp, 0, symbols[i].name, symbols[i].func, &fms);
+			camel_sexp_add_function (sexp, 0, symbols[i].name, symbols[i].func, &fms);
 	}
 
-	e_sexp_input_text (sexp, expression, strlen (expression));
-	if (e_sexp_parse (sexp) == -1) {
+	camel_sexp_input_text (sexp, expression, strlen (expression));
+	if (camel_sexp_parse (sexp) == -1) {
 		/* A filter search is a search through your filters,
 		 * ie. your filters is the corpus being searched thru. */
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Error executing filter search: %s: %s"),
-			e_sexp_error (sexp), expression);
+			camel_sexp_error (sexp), expression);
 		goto error;
 	}
 
-	result = e_sexp_eval (sexp);
+	result = camel_sexp_eval (sexp);
 	if (result == NULL) {
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Error executing filter search: %s: %s"),
-			e_sexp_error (sexp), expression);
+			camel_sexp_error (sexp), expression);
 		goto error;
 	}
 
-	if (result->type == ESEXP_RES_BOOL)
+	if (result->type == CAMEL_SEXP_RES_BOOL)
 		retval = result->value.boolean ? CAMEL_SEARCH_MATCHED : CAMEL_SEARCH_NOMATCH;
 	else
 		retval = CAMEL_SEARCH_NOMATCH;
 
-	e_sexp_result_free (sexp, result);
-	e_sexp_unref (sexp);
+	camel_sexp_result_free (sexp, result);
+	g_object_unref (sexp);
 
 	if (fms.message)
 		g_object_unref (fms.message);
@@ -902,7 +900,7 @@ camel_filter_search_match (CamelSession *session,
 	if (fms.message)
 		g_object_unref (fms.message);
 
-	e_sexp_unref (sexp);
+	g_object_unref (sexp);
 
 	return CAMEL_SEARCH_ERROR;
 }
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index a4f88e6..416634c 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -64,32 +64,32 @@ struct _CamelFolderSearchPrivate {
 	GHashTable *threads_hash;
 };
 
-static ESExpResult *search_not (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-
-static ESExpResult *search_header_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_matches (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_starts_with (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_ends_with (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_exists (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_soundex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_header_full_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_match_all (struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *search);
-static ESExpResult *search_match_threads (struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-static ESExpResult *search_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_body_regex (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
-static ESExpResult *search_user_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_user_tag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_system_flag (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_sent_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_received_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_uid (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-static ESExpResult *search_message_location (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-
-static ESExpResult *search_dummy (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_not (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+
+static CamelSExpResult *search_header_contains (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_matches (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_starts_with (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_ends_with (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_exists (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_soundex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_header_full_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_match_all (struct _CamelSExp *f, gint argc, struct _CamelSExpTerm **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_match_threads (struct _CamelSExp *f, gint argc, struct _CamelSExpTerm **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_body_contains (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_body_regex (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
+static CamelSExpResult *search_user_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_user_tag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_system_flag (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_get_sent_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_get_received_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_get_current_date (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_get_relative_months (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_get_size (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_uid (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *search_message_location (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
+
+static CamelSExpResult *search_dummy (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *search);
 
 static gint read_uid_callback (gpointer  ref, gint ncol, gchar ** cols, gchar **name);
 
@@ -101,7 +101,7 @@ folder_search_dispose (GObject *object)
 	CamelFolderSearch *search = CAMEL_FOLDER_SEARCH (object);
 
 	if (search->sexp != NULL) {
-		e_sexp_unref (search->sexp);
+		g_object_unref (search->sexp);
 		search->sexp = NULL;
 	}
 
@@ -161,7 +161,7 @@ camel_folder_search_init (CamelFolderSearch *search)
 {
 	search->priv = G_TYPE_INSTANCE_GET_PRIVATE (
 		search, CAMEL_TYPE_FOLDER_SEARCH, CamelFolderSearchPrivate);
-	search->sexp = e_sexp_new ();
+	search->sexp = camel_sexp_new ();
 }
 
 static struct {
@@ -222,9 +222,9 @@ camel_folder_search_construct (CamelFolderSearch *search)
 		}
 		if (func != NULL) {
 			if (builtins[i].flags&2) {
-				e_sexp_add_ifunction (search->sexp, 0, builtins[i].name, (ESExpIFunc *) func, search);
+				camel_sexp_add_ifunction (search->sexp, 0, builtins[i].name, (CamelSExpIFunc) func, search);
 			} else {
-				e_sexp_add_function (search->sexp, 0, builtins[i].name, (ESExpFunc *) func, search);
+				camel_sexp_add_function (search->sexp, 0, builtins[i].name, (CamelSExpFunc) func, search);
 			}
 		}
 	}
@@ -330,7 +330,7 @@ camel_folder_search_execute_expression (CamelFolderSearch *search,
                                         const gchar *expr,
                                         GError **error)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	GPtrArray *matches;
 	gint i;
 	GHashTable *results;
@@ -341,31 +341,31 @@ camel_folder_search_execute_expression (CamelFolderSearch *search,
 	/* only re-parse if the search has changed */
 	if (search->last_search == NULL
 	    || strcmp (search->last_search, expr)) {
-		e_sexp_input_text (search->sexp, expr, strlen (expr));
-		if (e_sexp_parse (search->sexp) == -1) {
+		camel_sexp_input_text (search->sexp, expr, strlen (expr));
+		if (camel_sexp_parse (search->sexp) == -1) {
 			g_set_error (
 				error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Cannot parse search expression: %s:\n%s"),
-				e_sexp_error (search->sexp), expr);
+				camel_sexp_error (search->sexp), expr);
 			return NULL;
 		}
 
 		g_free (search->last_search);
 		search->last_search = g_strdup (expr);
 	}
-	r = e_sexp_eval (search->sexp);
+	r = camel_sexp_eval (search->sexp);
 	if (r == NULL) {
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Error executing search expression: %s:\n%s"),
-			e_sexp_error (search->sexp), expr);
+			camel_sexp_error (search->sexp), expr);
 		return NULL;
 	}
 
 	matches = g_ptr_array_new ();
 
 	/* now create a folder summary to return?? */
-	if (r->type == ESEXP_RES_ARRAY_PTR) {
+	if (r->type == CAMEL_SEXP_RES_ARRAY_PTR) {
 		d(printf("got result ...\n"));
 		if (search->summary) {
 			/* reorder result in summary order */
@@ -391,7 +391,7 @@ camel_folder_search_execute_expression (CamelFolderSearch *search,
 		g_warning("Search returned an invalid result type");
 	}
 
-	e_sexp_result_free (search->sexp, r);
+	camel_sexp_result_free (search->sexp, r);
 
 	if (p->threads)
 		camel_folder_thread_messages_unref (p->threads);
@@ -427,7 +427,7 @@ camel_folder_search_count (CamelFolderSearch *search,
                            const gchar *expr,
                            GError **error)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	GPtrArray *summary_set;
 	gint i;
 	CamelDB *cdb;
@@ -451,29 +451,29 @@ camel_folder_search_count (CamelFolderSearch *search,
 		/* only re-parse if the search has changed */
 		if (search->last_search == NULL
 		    || strcmp (search->last_search, expr)) {
-			e_sexp_input_text (search->sexp, expr, strlen (expr));
-			if (e_sexp_parse (search->sexp) == -1) {
+			camel_sexp_input_text (search->sexp, expr, strlen (expr));
+			if (camel_sexp_parse (search->sexp) == -1) {
 				g_set_error (
 					error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 					_("Cannot parse search expression: %s:\n%s"),
-					e_sexp_error (search->sexp), expr);
+					camel_sexp_error (search->sexp), expr);
 				goto fail;
 			}
 
 			g_free (search->last_search);
 			search->last_search = g_strdup (expr);
 		}
-		r = e_sexp_eval (search->sexp);
+		r = camel_sexp_eval (search->sexp);
 		if (r == NULL) {
 			g_set_error (
 				error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Error executing search expression: %s:\n%s"),
-				e_sexp_error (search->sexp), expr);
+				camel_sexp_error (search->sexp), expr);
 			goto fail;
 		}
 
 		/* now create a folder summary to return?? */
-		if (r->type == ESEXP_RES_ARRAY_PTR) {
+		if (r->type == CAMEL_SEXP_RES_ARRAY_PTR) {
 			d(printf("got result\n"));
 
 			/* reorder result in summary order */
@@ -491,7 +491,7 @@ camel_folder_search_count (CamelFolderSearch *search,
 			g_hash_table_destroy (results);
 		}
 
-		e_sexp_result_free (search->sexp, r);
+		camel_sexp_result_free (search->sexp, r);
 
 	} else {
 		CamelStore *parent_store;
@@ -587,7 +587,7 @@ camel_folder_search_search (CamelFolderSearch *search,
                             GPtrArray *uids,
                             GError **error)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	GPtrArray *matches = NULL, *summary_set;
 	gint i;
 	CamelDB *cdb;
@@ -622,31 +622,31 @@ camel_folder_search_search (CamelFolderSearch *search,
 		/* only re-parse if the search has changed */
 		if (search->last_search == NULL
 		    || strcmp (search->last_search, expr)) {
-			e_sexp_input_text (search->sexp, expr, strlen (expr));
-			if (e_sexp_parse (search->sexp) == -1) {
+			camel_sexp_input_text (search->sexp, expr, strlen (expr));
+			if (camel_sexp_parse (search->sexp) == -1) {
 				g_set_error (
 					error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 					_("Cannot parse search expression: %s:\n%s"),
-					e_sexp_error (search->sexp), expr);
+					camel_sexp_error (search->sexp), expr);
 				goto fail;
 			}
 
 			g_free (search->last_search);
 			search->last_search = g_strdup (expr);
 		}
-		r = e_sexp_eval (search->sexp);
+		r = camel_sexp_eval (search->sexp);
 		if (r == NULL) {
 			g_set_error (
 				error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 				_("Error executing search expression: %s:\n%s"),
-				e_sexp_error (search->sexp), expr);
+				camel_sexp_error (search->sexp), expr);
 			goto fail;
 		}
 
 		matches = g_ptr_array_new ();
 
 		/* now create a folder summary to return?? */
-		if (r->type == ESEXP_RES_ARRAY_PTR) {
+		if (r->type == CAMEL_SEXP_RES_ARRAY_PTR) {
 			d(printf("got result\n"));
 
 			/* reorder result in summary order */
@@ -664,7 +664,7 @@ camel_folder_search_search (CamelFolderSearch *search,
 			g_hash_table_destroy (results);
 		}
 
-		e_sexp_result_free (search->sexp, r);
+		camel_sexp_result_free (search->sexp, r);
 
 	} else {
 		CamelStore *parent_store;
@@ -735,19 +735,19 @@ void camel_folder_search_free_result (CamelFolderSearch *search, GPtrArray *resu
 }
 
 /* dummy function, returns false always, or an empty match array */
-static ESExpResult *
-search_dummy (struct _ESExp *f,
+static CamelSExpResult *
+search_dummy (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	if (search->current == NULL) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = FALSE;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
@@ -755,21 +755,21 @@ search_dummy (struct _ESExp *f,
 }
 
 /* impelemnt an 'array not', i.e. everything in the summary, not in the supplied array */
-static ESExpResult *
-search_not (struct _ESExp *f,
+static CamelSExpResult *
+search_not (struct _CamelSExp *f,
             gint argc,
-            struct _ESExpResult **argv,
+            struct _CamelSExpResult **argv,
             CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 
 	if (argc > 0) {
-		if (argv[0]->type == ESEXP_RES_ARRAY_PTR) {
+		if (argv[0]->type == CAMEL_SEXP_RES_ARRAY_PTR) {
 			GPtrArray *v = argv[0]->value.ptrarray;
 			const gchar *uid;
 
-			r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 			r->value.ptrarray = g_ptr_array_new ();
 
 			/* not against a single message?*/
@@ -809,28 +809,28 @@ search_not (struct _ESExp *f,
 		} else {
 			gint res = TRUE;
 
-			if (argv[0]->type == ESEXP_RES_BOOL)
+			if (argv[0]->type == CAMEL_SEXP_RES_BOOL)
 				res = !argv[0]->value.boolean;
 
-			r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 			r->value.boolean = res;
 		}
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = TRUE;
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_match_all (struct _ESExp *f,
+static CamelSExpResult *
+search_match_all (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpTerm **argv,
+                  struct _CamelSExpTerm **argv,
                   CamelFolderSearch *search)
 {
 	gint i;
-	ESExpResult *r, *r1;
+	CamelSExpResult *r, *r1;
 	gchar *error_msg;
 	GPtrArray *v;
 
@@ -842,28 +842,28 @@ search_match_all (struct _ESExp *f,
 	if (search->current) {
 		d(printf("matching against 1 message: %s\n", camel_message_info_subject(search->current)));
 
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = FALSE;
 
 		if (argc > 0) {
-			r1 = e_sexp_term_eval (f, argv[0]);
-			if (r1->type == ESEXP_RES_BOOL) {
+			r1 = camel_sexp_term_eval (f, argv[0]);
+			if (r1->type == CAMEL_SEXP_RES_BOOL) {
 				r->value.boolean = r1->value.boolean;
 			} else {
 				g_warning("invalid syntax, matches require a single bool result");
 				/* Translators: The '%s' is an element type name, part of an expressing language */
 				error_msg = g_strdup_printf(_("(%s) requires a single bool result"), "match-all");
-				e_sexp_fatal_error (f, error_msg);
+				camel_sexp_fatal_error (f, error_msg);
 				g_free (error_msg);
 			}
-			e_sexp_result_free (f, r1);
+			camel_sexp_result_free (f, r1);
 		} else {
 			r->value.boolean = TRUE;
 		}
 		return r;
 	}
 
-	r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 	r->value.ptrarray = g_ptr_array_new ();
 
 	if (search->summary == NULL) {
@@ -888,18 +888,18 @@ search_match_all (struct _ESExp *f,
 		uid = camel_message_info_uid (search->current);
 
 		if (argc > 0) {
-			r1 = e_sexp_term_eval (f, argv[0]);
-			if (r1->type == ESEXP_RES_BOOL) {
+			r1 = camel_sexp_term_eval (f, argv[0]);
+			if (r1->type == CAMEL_SEXP_RES_BOOL) {
 				if (r1->value.boolean)
 					g_ptr_array_add (r->value.ptrarray, (gchar *) uid);
 			} else {
 				g_warning("invalid syntax, matches require a single bool result");
 				/* Translators: The '%s' is an element type name, part of an expressing language */
 				error_msg = g_strdup_printf(_("(%s) requires a single bool result"), "match-all");
-				e_sexp_fatal_error (f, error_msg);
+				camel_sexp_fatal_error (f, error_msg);
 				g_free (error_msg);
 			}
-			e_sexp_result_free (f, r1);
+			camel_sexp_result_free (f, r1);
 		} else {
 			g_ptr_array_add (r->value.ptrarray, (gchar *) uid);
 		}
@@ -941,13 +941,13 @@ add_results (gchar *uid,
 	g_ptr_array_add (result, uid);
 }
 
-static ESExpResult *
-search_match_threads (struct _ESExp *f,
+static CamelSExpResult *
+search_match_threads (struct _CamelSExp *f,
                       gint argc,
-                      struct _ESExpTerm **argv,
+                      struct _CamelSExpTerm **argv,
                       CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	CamelFolderSearchPrivate *p = search->priv;
 	gint i, type;
 	GHashTable *results;
@@ -957,22 +957,22 @@ search_match_threads (struct _ESExp *f,
 	if (search->current) {
 		/* Translators: Each '%s' is an element type name, part of an expressing language */
 		error_msg = g_strdup_printf(_("(%s) not allowed inside %s"), "match-threads", "match-all");
-		e_sexp_fatal_error (f, error_msg);
+		camel_sexp_fatal_error (f, error_msg);
 		g_free (error_msg);
 	}
 
 	if (argc == 0) {
 		/* Translators: The '%s' is an element type name, part of an expressing language */
 		error_msg = g_strdup_printf(_("(%s) requires a match type string"), "match-threads");
-		e_sexp_fatal_error (f, error_msg);
+		camel_sexp_fatal_error (f, error_msg);
 		g_free (error_msg);
 	}
 
-	r = e_sexp_term_eval (f, argv[0]);
-	if (r->type != ESEXP_RES_STRING) {
+	r = camel_sexp_term_eval (f, argv[0]);
+	if (r->type != CAMEL_SEXP_RES_STRING) {
 		/* Translators: The '%s' is an element type name, part of an expressing language */
 		error_msg = g_strdup_printf(_("(%s) requires a match type string"), "match-threads");
-		e_sexp_fatal_error (f, error_msg);
+		camel_sexp_fatal_error (f, error_msg);
 		g_free (error_msg);
 	}
 
@@ -987,20 +987,20 @@ search_match_threads (struct _ESExp *f,
 		type = 3;
 	else if (!strcmp(r->value.string, "single"))
 		type = 4;
-	e_sexp_result_free (f, r);
+	camel_sexp_result_free (f, r);
 
 	/* behave as (begin does */
 	r = NULL;
 	for (i = 1; i < argc; i++) {
 		if (r)
-			e_sexp_result_free (f, r);
-		r = e_sexp_term_eval (f, argv[i]);
+			camel_sexp_result_free (f, r);
+		r = camel_sexp_term_eval (f, argv[i]);
 	}
 
-	if (r == NULL || r->type != ESEXP_RES_ARRAY_PTR) {
+	if (r == NULL || r->type != CAMEL_SEXP_RES_ARRAY_PTR) {
 		/* Translators: The '%s' is an element type name, part of an expressing language */
 		error_msg = g_strdup_printf(_("(%s) expects an array result"), "match-threads");
-		e_sexp_fatal_error (f, error_msg);
+		camel_sexp_fatal_error (f, error_msg);
 		g_free (error_msg);
 	}
 
@@ -1010,7 +1010,7 @@ search_match_threads (struct _ESExp *f,
 	if (search->folder == NULL) {
 		/* Translators: The '%s' is an element type name, part of an expressing language */
 		error_msg = g_strdup_printf(_("(%s) requires the folder set"), "match-threads");
-		e_sexp_fatal_error (f, error_msg);
+		camel_sexp_fatal_error (f, error_msg);
 		g_free (error_msg);
 	}
 
@@ -1053,9 +1053,9 @@ search_match_threads (struct _ESExp *f,
 				add_thread_results (node->child, results);
 		}
 	}
-	e_sexp_result_free (f, r);
+	camel_sexp_result_free (f, r);
 
-	r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 	r->value.ptrarray = g_ptr_array_new ();
 
 	g_hash_table_foreach (results, (GHFunc) add_results, r->value.ptrarray);
@@ -1075,21 +1075,21 @@ get_current_message (CamelFolderSearch *search)
 		search->folder, search->current->uid, NULL, NULL);
 }
 
-static ESExpResult *
-check_header (struct _ESExp *f,
+static CamelSExpResult *
+check_header (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               CamelFolderSearch *search,
               camel_search_match_t how)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint truth = FALSE;
 
 	r(printf("executing check-header %d\n", how));
 
 	/* are we inside a match-all? */
 	if (search->current && argc > 1
-	    && argv[0]->type == ESEXP_RES_STRING) {
+	    && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		gchar *headername;
 		const gchar *header = NULL, *charset = NULL;
 		gchar strbuf[32];
@@ -1136,7 +1136,7 @@ check_header (struct _ESExp *f,
 
 		/* performs an OR of all words */
 		for (i = 1; i < argc && !truth; i++) {
-			if (argv[i]->type == ESEXP_RES_STRING) {
+			if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 				if (argv[i]->value.string[0] == 0) {
 					truth = TRUE;
 				} else if (how == CAMEL_SEARCH_MATCH_CONTAINS) {
@@ -1175,7 +1175,7 @@ check_header (struct _ESExp *f,
 	}
 	/* TODO: else, find all matches */
 
-	r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 	r->value.boolean = truth;
 
 	return r;
@@ -1189,81 +1189,81 @@ printf("%s\t", node);
 }
 */
 
-static ESExpResult *
-search_header_contains (struct _ESExp *f,
+static CamelSExpResult *
+search_header_contains (struct _CamelSExp *f,
                         gint argc,
-                        struct _ESExpResult **argv,
+                        struct _CamelSExpResult **argv,
                         CamelFolderSearch *search)
 {
 	return check_header (f, argc, argv, search, CAMEL_SEARCH_MATCH_CONTAINS);
 }
 
-static ESExpResult *
-search_header_matches (struct _ESExp *f,
+static CamelSExpResult *
+search_header_matches (struct _CamelSExp *f,
                        gint argc,
-                       struct _ESExpResult **argv,
+                       struct _CamelSExpResult **argv,
                        CamelFolderSearch *search)
 {
 	return check_header (f, argc, argv, search, CAMEL_SEARCH_MATCH_EXACT);
 }
 
-static ESExpResult *
-search_header_starts_with (struct _ESExp *f,
+static CamelSExpResult *
+search_header_starts_with (struct _CamelSExp *f,
                            gint argc,
-                           struct _ESExpResult **argv,
+                           struct _CamelSExpResult **argv,
                            CamelFolderSearch *search)
 {
 	return check_header (f, argc, argv, search, CAMEL_SEARCH_MATCH_STARTS);
 }
 
-static ESExpResult *
-search_header_ends_with (struct _ESExp *f,
+static CamelSExpResult *
+search_header_ends_with (struct _CamelSExp *f,
                          gint argc,
-                         struct _ESExpResult **argv,
+                         struct _CamelSExpResult **argv,
                          CamelFolderSearch *search)
 {
 	return check_header (f, argc, argv, search, CAMEL_SEARCH_MATCH_ENDS);
 }
 
-static ESExpResult *
-search_header_exists (struct _ESExp *f,
+static CamelSExpResult *
+search_header_exists (struct _CamelSExp *f,
                       gint argc,
-                      struct _ESExpResult **argv,
+                      struct _CamelSExpResult **argv,
                       CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf ("executing header-exists\n"));
 
 	if (search->current) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
-		if (argc == 1 && argv[0]->type == ESEXP_RES_STRING)
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
+		if (argc == 1 && argv[0]->type == CAMEL_SEXP_RES_STRING)
 			r->value.boolean = camel_medium_get_header (CAMEL_MEDIUM (search->current), argv[0]->value.string) != NULL;
 
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_header_soundex (struct _ESExp *f,
+static CamelSExpResult *
+search_header_soundex (struct _CamelSExp *f,
                        gint argc,
-                       struct _ESExpResult **argv,
+                       struct _CamelSExpResult **argv,
                        CamelFolderSearch *search)
 {
 	return check_header (f, argc, argv, search, CAMEL_SEARCH_MATCH_SOUNDEX);
 }
 
-static ESExpResult *
-search_header_regex (struct _ESExp *f,
+static CamelSExpResult *
+search_header_regex (struct _CamelSExp *f,
                      gint argc,
-                     struct _ESExpResult **argv,
+                     struct _CamelSExpResult **argv,
                      CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	CamelMimeMessage *msg;
 
 	msg = get_current_message (search);
@@ -1272,9 +1272,9 @@ search_header_regex (struct _ESExp *f,
 		regex_t pattern;
 		const gchar *contents;
 
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 
-		if (argc > 1 && argv[0]->type == ESEXP_RES_STRING
+		if (argc > 1 && argv[0]->type == CAMEL_SEXP_RES_STRING
 		    && (contents = camel_medium_get_header (CAMEL_MEDIUM (msg), argv[0]->value.string))
 		    && camel_search_build_match_regex (&pattern, CAMEL_SEARCH_MATCH_REGEX | CAMEL_SEARCH_MATCH_ICASE, argc - 1, argv + 1, search->priv->error) == 0) {
 			r->value.boolean = regexec (&pattern, contents, 0, NULL, 0) == 0;
@@ -1284,7 +1284,7 @@ search_header_regex (struct _ESExp *f,
 
 		g_object_unref (msg);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
@@ -1313,13 +1313,13 @@ get_full_header (CamelMimeMessage *message)
 	return g_string_free (str, FALSE);
 }
 
-static ESExpResult *
-search_header_full_regex (struct _ESExp *f,
+static CamelSExpResult *
+search_header_full_regex (struct _CamelSExp *f,
                           gint argc,
-                          struct _ESExpResult **argv,
+                          struct _CamelSExpResult **argv,
                           CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	CamelMimeMessage *msg;
 
 	msg = get_current_message (search);
@@ -1327,7 +1327,7 @@ search_header_full_regex (struct _ESExp *f,
 	if (msg) {
 		regex_t pattern;
 
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 
 		if (camel_search_build_match_regex (&pattern, CAMEL_SEARCH_MATCH_REGEX | CAMEL_SEARCH_MATCH_ICASE | CAMEL_SEARCH_MATCH_NEWLINE, argc, argv, search->priv->error) == 0) {
 			gchar *contents;
@@ -1342,7 +1342,7 @@ search_header_full_regex (struct _ESExp *f,
 
 		g_object_unref (msg);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
@@ -1576,16 +1576,16 @@ match_words_messages (CamelFolderSearch *search,
 	return matches;
 }
 
-static ESExpResult *
-search_body_contains (struct _ESExp *f,
+static CamelSExpResult *
+search_body_contains (struct _CamelSExp *f,
                       gint argc,
-                      struct _ESExpResult **argv,
+                      struct _CamelSExpResult **argv,
                       CamelFolderSearch *search)
 {
 	gint i, j;
 	GError **error = search->priv->error;
 	struct _camel_search_words *words;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	struct IterData lambdafoo;
 
 	if (search->current) {
@@ -1595,7 +1595,7 @@ search_body_contains (struct _ESExp *f,
 			truth = TRUE;
 		} else {
 			for (i = 0; i < argc && !truth; i++) {
-				if (argv[i]->type == ESEXP_RES_STRING) {
+				if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 					words = camel_search_words_split ((const guchar *) argv[i]->value.string);
 					truth = TRUE;
 					if ((words->type & CAMEL_SEARCH_WORD_COMPLEX) == 0 && search->body_index) {
@@ -1610,10 +1610,10 @@ search_body_contains (struct _ESExp *f,
 				}
 			}
 		}
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = truth;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 
 		if (argc == 1 && argv[0]->value.string[0] == 0) {
@@ -1629,7 +1629,7 @@ search_body_contains (struct _ESExp *f,
 			GPtrArray *matches;
 
 			for (i = 0; i < argc; i++) {
-				if (argv[i]->type == ESEXP_RES_STRING) {
+				if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 					words = camel_search_words_split ((const guchar *) argv[i]->value.string);
 					if ((words->type & CAMEL_SEARCH_WORD_COMPLEX) == 0 && search->body_index) {
 						matches = match_words_index (search, words, error);
@@ -1653,19 +1653,19 @@ search_body_contains (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-search_body_regex (struct _ESExp *f,
+static CamelSExpResult *
+search_body_regex (struct _CamelSExp *f,
                    gint argc,
-                   struct _ESExpResult **argv,
+                   struct _CamelSExpResult **argv,
                    CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	CamelMimeMessage *msg = get_current_message (search);
 
 	if (msg) {
 		regex_t pattern;
 
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 
 		if (camel_search_build_match_regex (&pattern, CAMEL_SEARCH_MATCH_ICASE | CAMEL_SEARCH_MATCH_REGEX | CAMEL_SEARCH_MATCH_NEWLINE, argc, argv, search->priv->error) == 0) {
 			r->value.boolean = camel_search_message_body_contains ((CamelDataWrapper *) msg, &pattern);
@@ -1677,7 +1677,7 @@ search_body_regex (struct _ESExp *f,
 	} else {
 		regex_t pattern;
 
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 
 		if (camel_search_build_match_regex (&pattern, CAMEL_SEARCH_MATCH_ICASE | CAMEL_SEARCH_MATCH_REGEX | CAMEL_SEARCH_MATCH_NEWLINE, argc, argv, search->priv->error) == 0) {
@@ -1707,13 +1707,13 @@ search_body_regex (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-search_user_flag (struct _ESExp *f,
+static CamelSExpResult *
+search_user_flag (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpResult **argv,
+                  struct _CamelSExpResult **argv,
                   CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 
 	r(printf("executing user-flag\n"));
@@ -1723,29 +1723,29 @@ search_user_flag (struct _ESExp *f,
 		gint truth = FALSE;
 		/* performs an OR of all words */
 		for (i = 0; i < argc && !truth; i++) {
-			if (argv[i]->type == ESEXP_RES_STRING
+			if (argv[i]->type == CAMEL_SEXP_RES_STRING
 			    && camel_message_info_user_flag (search->current, argv[i]->value.string)) {
 				truth = TRUE;
 				break;
 			}
 		}
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = truth;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_system_flag (struct _ESExp *f,
+static CamelSExpResult *
+search_system_flag (struct _CamelSExp *f,
                     gint argc,
-                    struct _ESExpResult **argv,
+                    struct _CamelSExpResult **argv,
                     CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf ("executing system-flag\n"));
 
@@ -1755,149 +1755,149 @@ search_system_flag (struct _ESExp *f,
 		if (argc == 1)
 			truth = camel_system_flag_get (camel_message_info_flags (search->current), argv[0]->value.string);
 
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = truth;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_user_tag (struct _ESExp *f,
+static CamelSExpResult *
+search_user_tag (struct _CamelSExp *f,
                  gint argc,
-                 struct _ESExpResult **argv,
+                 struct _CamelSExpResult **argv,
                  CamelFolderSearch *search)
 {
 	const gchar *value = NULL;
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing user-tag\n"));
 
 	if (search->current && argc == 1)
 		value = camel_message_info_user_tag (search->current, argv[0]->value.string);
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup (value ? value : "");
 
 	return r;
 }
 
-static ESExpResult *
-search_get_sent_date (struct _ESExp *f,
+static CamelSExpResult *
+search_get_sent_date (struct _CamelSExp *f,
                       gint argc,
-                      struct _ESExpResult **argv,
+                      struct _CamelSExpResult **argv,
                       CamelFolderSearch *s)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing get-sent-date\n"));
 
 	/* are we inside a match-all? */
 	if (s->current) {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 
 		r->value.number = camel_message_info_date_sent (s->current);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_get_received_date (struct _ESExp *f,
+static CamelSExpResult *
+search_get_received_date (struct _CamelSExp *f,
                           gint argc,
-                          struct _ESExpResult **argv,
+                          struct _CamelSExpResult **argv,
                           CamelFolderSearch *s)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing get-received-date\n"));
 
 	/* are we inside a match-all? */
 	if (s->current) {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 
 		r->value.number = camel_message_info_date_received (s->current);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_get_current_date (struct _ESExp *f,
+static CamelSExpResult *
+search_get_current_date (struct _CamelSExp *f,
                          gint argc,
-                         struct _ESExpResult **argv,
+                         struct _CamelSExpResult **argv,
                          CamelFolderSearch *s)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing get-current-date\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = time (NULL);
 	return r;
 }
 
-static ESExpResult *
-search_get_relative_months (struct _ESExp *f,
+static CamelSExpResult *
+search_get_relative_months (struct _CamelSExp *f,
                             gint argc,
-                            struct _ESExpResult **argv,
+                            struct _CamelSExpResult **argv,
                             CamelFolderSearch *s)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing get-relative-months\n"));
 
-	if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_INT) {
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = FALSE;
 
 		g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 		r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_get_size (struct _ESExp *f,
+static CamelSExpResult *
+search_get_size (struct _CamelSExp *f,
                  gint argc,
-                 struct _ESExpResult **argv,
+                 struct _CamelSExpResult **argv,
                  CamelFolderSearch *s)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	r(printf("executing get-size\n"));
 
 	/* are we inside a match-all? */
 	if (s->current) {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 		r->value.number = camel_message_info_size (s->current) / 1024;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 	}
 
 	return r;
 }
 
-static ESExpResult *
-search_uid (struct _ESExp *f,
+static CamelSExpResult *
+search_uid (struct _CamelSExp *f,
             gint argc,
-            struct _ESExpResult **argv,
+            struct _CamelSExpResult **argv,
             CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 
 	r(printf("executing uid\n"));
@@ -1909,19 +1909,19 @@ search_uid (struct _ESExp *f,
 
 		/* performs an OR of all words */
 		for (i = 0; i < argc && !truth; i++) {
-			if (argv[i]->type == ESEXP_RES_STRING
+			if (argv[i]->type == CAMEL_SEXP_RES_STRING
 			    && !strcmp (uid, argv[i]->value.string)) {
 				truth = TRUE;
 				break;
 			}
 		}
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = truth;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 		for (i = 0; i < argc; i++) {
-			if (argv[i]->type == ESEXP_RES_STRING)
+			if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 				g_ptr_array_add (r->value.ptrarray, argv[i]->value.string);
 		}
 	}
@@ -1943,16 +1943,16 @@ read_uid_callback (gpointer ref,
 	return 0;
 }
 
-static ESExpResult *
-search_message_location (struct _ESExp *f,
+static CamelSExpResult *
+search_message_location (struct _CamelSExp *f,
                          gint argc,
-                         struct _ESExpResult **argv,
+                         struct _CamelSExpResult **argv,
                          CamelFolderSearch *search)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gboolean same = FALSE;
 
-	if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc == 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		if (argv[0]->value.string && search->folder) {
 			CamelStore *store;
 			const gchar *name;
@@ -1972,10 +1972,10 @@ search_message_location (struct _ESExp *f,
 	}
 
 	if (search->current) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = same ? TRUE : FALSE;
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 		r->value.ptrarray = g_ptr_array_new ();
 
 		if (same) {
diff --git a/camel/camel-folder-search.h b/camel/camel-folder-search.h
index cdd65e5..a1b2448 100644
--- a/camel/camel-folder-search.h
+++ b/camel/camel-folder-search.h
@@ -26,9 +26,9 @@
 #ifndef CAMEL_FOLDER_SEARCH_H
 #define CAMEL_FOLDER_SEARCH_H
 
-#include <libedataserver/e-sexp.h>
 #include <camel/camel-folder.h>
 #include <camel/camel-index.h>
+#include <camel/camel-sexp.h>
 
 /* Standard GObject macros */
 #define CAMEL_TYPE_FOLDER_SEARCH \
@@ -59,7 +59,7 @@ struct _CamelFolderSearch {
 	CamelObject parent;
 	CamelFolderSearchPrivate *priv;
 
-	ESExp *sexp;		/* s-exp evaluator */
+	CamelSExp *sexp;		/* s-exp evaluator */
 	gchar *last_search;	/* last searched expression */
 
 	/* these are only valid during the search, and are reset afterwards */
@@ -75,79 +75,79 @@ struct _CamelFolderSearchClass {
 	CamelObjectClass parent_class;
 
 	/* general bool/comparison options, usually these wont need to be set, unless it is compiling into another language */
-	ESExpResult * (*and)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-	ESExpResult * (*or)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-	ESExpResult * (*not)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
-	ESExpResult * (*lt)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-	ESExpResult * (*gt)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
-	ESExpResult * (*eq)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*and)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*or)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*not)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*lt)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*gt)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*eq)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
 
 	/* search options */
 	/* (match-all [boolean expression]) Apply match to all messages */
-	ESExpResult * (*match_all)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*match_all)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
 
 	/* (match-threads "type" [array expression]) add all related threads */
-	ESExpResult * (*match_threads)(struct _ESExp *f, gint argc, struct _ESExpTerm **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*match_threads)(CamelSExp *f, gint argc, CamelSExpTerm **argv, CamelFolderSearch *s);
 
 	/* (body-contains "string1" "string2" ...) Returns a list of matches, or true if in single-message mode */
-	ESExpResult * (*body_contains)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*body_contains)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (body-regex "regex") Returns a list of matches, or true if in single-message mode */
-	ESExpResult * (*body_regex)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*body_regex)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-contains "headername" "string1" ...) List of matches, or true if in single-message mode */
-	ESExpResult * (*header_contains)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_contains)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-matches "headername" "string") */
-	ESExpResult * (*header_matches)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_matches)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-starts-with "headername" "string") */
-	ESExpResult * (*header_starts_with)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_starts_with)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-ends-with "headername" "string") */
-	ESExpResult * (*header_ends_with)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_ends_with)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-exists "headername") */
-	ESExpResult * (*header_exists)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_exists)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-soundex "headername" "string") */
-	ESExpResult * (*header_soundex)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_soundex)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-regex "headername" "regex_string") */
-	ESExpResult * (*header_regex)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_regex)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (header-full-regex "regex") */
-	ESExpResult * (*header_full_regex)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*header_full_regex)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (user-flag "flagname" "flagname" ...) If one of user-flag set */
-	ESExpResult * (*user_flag)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*user_flag)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (user-tag "flagname") Returns the value of a user tag.  Can only be used in match-all */
-	ESExpResult * (*user_tag)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*user_tag)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (system-flag "flagname") Returns the value of a system flag.  Can only be used in match-all */
-	ESExpResult * (*system_flag)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*system_flag)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (get-sent-date) Retrieve the date that the message was sent on as a time_t */
-	ESExpResult * (*get_sent_date)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*get_sent_date)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (get-received-date) Retrieve the date that the message was received on as a time_t */
-	ESExpResult * (*get_received_date)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*get_received_date)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (get-current-date) Retrieve 'now' as a time_t */
-	ESExpResult * (*get_current_date)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*get_current_date)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (get-relative-months) Retrieve relative seconds from 'now' and specified number of months as a time_t */
-	ESExpResult * (*get_relative_months)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*get_relative_months)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (get-size) Retrieve message size as an gint (in kilobytes) */
-	ESExpResult * (*get_size)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*get_size)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (uid "uid" ...) True if the uid is in the list */
-	ESExpResult * (*uid)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*uid)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 	/* (message-location "folder_string") True if the message is in the folder's full name "folder_string" */
-	ESExpResult * (*message_location)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+	CamelSExpResult * (*message_location)(CamelSExp *f, gint argc, CamelSExpResult **argv, CamelFolderSearch *s);
 
 };
 
diff --git a/camel/camel-search-private.c b/camel/camel-search-private.c
index 9b19f86..680343b 100644
--- a/camel/camel-search-private.c
+++ b/camel/camel-search-private.c
@@ -54,7 +54,7 @@ gint
 camel_search_build_match_regex (regex_t *pattern,
                                 camel_search_flags_t type,
                                 gint argc,
-                                struct _ESExpResult **argv,
+                                struct _CamelSExpResult **argv,
                                 GError **error)
 {
 	GString *match = g_string_new("");
@@ -66,7 +66,7 @@ camel_search_build_match_regex (regex_t *pattern,
 	if (argc > 1)
 		g_string_append_c (match, '(');
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING) {
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 			if (count > 0)
 				g_string_append_c (match, '|');
 
diff --git a/camel/camel-search-private.h b/camel/camel-search-private.h
index 58a963c..a6e4b81 100644
--- a/camel/camel-search-private.h
+++ b/camel/camel-search-private.h
@@ -28,8 +28,6 @@
 
 #include <camel/camel.h>
 
-#include "libedataserver/e-sexp.h"
-
 G_BEGIN_DECLS
 
 typedef enum {
@@ -57,7 +55,7 @@ typedef enum {
 } camel_search_t;
 
 /* builds a regex that represents a string search */
-gint camel_search_build_match_regex (regex_t *pattern, camel_search_flags_t type, gint argc, struct _ESExpResult **argv, GError **error);
+gint camel_search_build_match_regex (regex_t *pattern, camel_search_flags_t type, gint argc, struct _CamelSExpResult **argv, GError **error);
 gboolean camel_search_message_body_contains (CamelDataWrapper *object, regex_t *pattern);
 
 gboolean camel_search_header_match (const gchar *value, const gchar *match, camel_search_match_t how, camel_search_t type, const gchar *default_charset);
diff --git a/camel/camel-search-sql-sexp.c b/camel/camel-search-sql-sexp.c
index f5fb023..aac19a2 100644
--- a/camel/camel-search-sql-sexp.c
+++ b/camel/camel-search-sql-sexp.c
@@ -77,13 +77,13 @@ get_db_safe_string (const gchar *str)
 
 /* Configuration of your sexp expression */
 
-static ESExpResult *
-func_and (ESExp *f,
+static CamelSExpResult *
+func_and (CamelSExp *f,
           gint argc,
-          struct _ESExpTerm **argv,
+          struct _CamelSExpTerm **argv,
           gpointer data)
 {
-	ESExpResult *r, *r1;
+	CamelSExpResult *r, *r1;
 	GString *string;
 	gint i;
 
@@ -91,18 +91,18 @@ func_and (ESExp *f,
 
 	string = g_string_new("( ");
 	for (i = 0; i < argc; i++) {
-		r1 = e_sexp_term_eval (f, argv[i]);
+		r1 = camel_sexp_term_eval (f, argv[i]);
 
-		if (r1->type != ESEXP_RES_STRING) {
-			e_sexp_result_free (f, r1);
+		if (r1->type != CAMEL_SEXP_RES_STRING) {
+			camel_sexp_result_free (f, r1);
 			continue;
 		}
 		if (r1->value.string && *r1->value.string)
 			g_string_append_printf(string, "%s%s", r1->value.string, ((argc>1) && (i != argc-1)) ?  " AND ":"");
-		e_sexp_result_free (f, r1);
+		camel_sexp_result_free (f, r1);
 	}
 	g_string_append(string, " )");
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (strlen (string->str) == 4)
 		r->value.string = g_strdup("");
@@ -113,13 +113,13 @@ func_and (ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-func_or (ESExp *f,
+static CamelSExpResult *
+func_or (CamelSExp *f,
          gint argc,
-         struct _ESExpTerm **argv,
+         struct _CamelSExpTerm **argv,
          gpointer data)
 {
-	ESExpResult *r, *r1;
+	CamelSExpResult *r, *r1;
 	GString *string;
 	gint i;
 
@@ -127,36 +127,36 @@ func_or (ESExp *f,
 
 	string = g_string_new("( ");
 	for (i = 0; i < argc; i++) {
-		r1 = e_sexp_term_eval (f, argv[i]);
+		r1 = camel_sexp_term_eval (f, argv[i]);
 
-		if (r1->type != ESEXP_RES_STRING) {
-			e_sexp_result_free (f, r1);
+		if (r1->type != CAMEL_SEXP_RES_STRING) {
+			camel_sexp_result_free (f, r1);
 			continue;
 		}
 		g_string_append_printf(string, "%s%s", r1->value.string, ((argc>1) && (i != argc-1)) ?  " OR ":"");
-		e_sexp_result_free (f, r1);
+		camel_sexp_result_free (f, r1);
 	}
 	g_string_append(string, " )");
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = string->str;
 	g_string_free (string, FALSE);
 	return r;
 }
 
-static ESExpResult *
-func_not (ESExp *f,
+static CamelSExpResult *
+func_not (CamelSExp *f,
           gint argc,
-          struct _ESExpTerm **argv,
+          struct _CamelSExpTerm **argv,
           gpointer data)
 {
-	ESExpResult *r = NULL, *r1;
+	CamelSExpResult *r = NULL, *r1;
 
 	d(printf("executing not: %d", argc));
-	r1 = e_sexp_term_eval (f, argv[0]);
+	r1 = camel_sexp_term_eval (f, argv[0]);
 
-	if (r1->type == ESEXP_RES_STRING) {
-		r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	if (r1->type == CAMEL_SEXP_RES_STRING) {
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 		/* HACK: Fix and handle completed-on better. */
 		if (g_strcmp0 (r1->value.string, "( (usertags LIKE '%completed-on 0%' AND usertags LIKE '%completed-on%') )") == 0)
 			r->value.string = g_strdup ("( (not (usertags LIKE '%completed-on 0%')) AND usertags LIKE '%completed-on%' )");
@@ -164,32 +164,32 @@ func_not (ESExp *f,
 			r->value.string = g_strdup_printf ("(NOT (%s))",
 							   r1->value.string);
 	}
-	e_sexp_result_free (f, r1);
+	camel_sexp_result_free (f, r1);
 
 	return r;
 }
 
 /* this should support all arguments ...? */
-static ESExpResult *
-eval_eq (struct _ESExp *f,
+static CamelSExpResult *
+eval_eq (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpTerm **argv,
+         struct _CamelSExpTerm **argv,
          gpointer data)
 {
-	struct _ESExpResult *r, *r1, *r2;
+	struct _CamelSExpResult *r, *r1, *r2;
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (argc == 2) {
 		GString *str = g_string_new("( ");
-		r1 = e_sexp_term_eval (f, argv[0]);
-		r2 = e_sexp_term_eval (f, argv[1]);
+		r1 = camel_sexp_term_eval (f, argv[0]);
+		r2 = camel_sexp_term_eval (f, argv[1]);
 
-		if (r1->type == ESEXP_RES_INT)
+		if (r1->type == CAMEL_SEXP_RES_INT)
 			g_string_append_printf(str, "%d", r1->value.number);
-		else if (r1->type == ESEXP_RES_TIME)
+		else if (r1->type == CAMEL_SEXP_RES_TIME)
 			g_string_append_printf(str, "%ld", r1->value.time);
-		else if (r1->type == ESEXP_RES_STRING)
+		else if (r1->type == CAMEL_SEXP_RES_STRING)
 			g_string_append_printf(str, "%s", r1->value.string);
 
 		if (!strstr(str->str, "completed-on") && !strstr(str->str, "follow-up")) {
@@ -201,13 +201,13 @@ eval_eq (struct _ESExp *f,
 				g_string_append_printf(str, " LIKE ");
 			else
 				g_string_append_printf(str, " = ");
-			if (r2->type == ESEXP_RES_INT)
+			if (r2->type == CAMEL_SEXP_RES_INT)
 				g_string_append_printf(str, "%d", r2->value.number);
-			if (r2->type == ESEXP_RES_BOOL)
+			if (r2->type == CAMEL_SEXP_RES_BOOL)
 				g_string_append_printf(str, "%d", r2->value.boolean);
-			else if (r2->type == ESEXP_RES_TIME)
+			else if (r2->type == CAMEL_SEXP_RES_TIME)
 				g_string_append_printf(str, "%ld", r2->value.time);
-			else if (r2->type == ESEXP_RES_STRING) {
+			else if (r2->type == CAMEL_SEXP_RES_STRING) {
 				gchar *tmp = g_strdup_printf("%c%s%c", ut ? '%':' ', r2->value.string, ut?'%':' ');
 				gchar *safe = get_db_safe_string (tmp);
 				g_string_append_printf(str, "%s", safe);
@@ -215,8 +215,8 @@ eval_eq (struct _ESExp *f,
 				g_free (tmp);
 			}
 		}
-		e_sexp_result_free (f, r1);
-		e_sexp_result_free (f, r2);
+		camel_sexp_result_free (f, r1);
+		camel_sexp_result_free (f, r2);
 		g_string_append (str, " )");
 		r->value.string = str->str;
 		g_string_free (str, FALSE);
@@ -226,39 +226,39 @@ eval_eq (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-eval_lt (struct _ESExp *f,
+static CamelSExpResult *
+eval_lt (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpTerm **argv,
+         struct _CamelSExpTerm **argv,
          gpointer data)
 {
-	struct _ESExpResult *r, *r1, *r2;
+	struct _CamelSExpResult *r, *r1, *r2;
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (argc == 2) {
 		GString *str = g_string_new("( ");
-		r1 = e_sexp_term_eval (f, argv[0]);
-		r2 = e_sexp_term_eval (f, argv[1]);
+		r1 = camel_sexp_term_eval (f, argv[0]);
+		r2 = camel_sexp_term_eval (f, argv[1]);
 
-		if (r1->type == ESEXP_RES_INT)
+		if (r1->type == CAMEL_SEXP_RES_INT)
 			g_string_append_printf(str, "%d", r1->value.number);
-		else if (r1->type == ESEXP_RES_TIME)
+		else if (r1->type == CAMEL_SEXP_RES_TIME)
 			g_string_append_printf(str, "%ld", r1->value.time);
-		else if (r1->type == ESEXP_RES_STRING)
+		else if (r1->type == CAMEL_SEXP_RES_STRING)
 			g_string_append_printf(str, "%s", r1->value.string);
 
 		g_string_append_printf(str, " < ");
-		if (r2->type == ESEXP_RES_INT)
+		if (r2->type == CAMEL_SEXP_RES_INT)
 			g_string_append_printf(str, "%d", r2->value.number);
-		if (r2->type == ESEXP_RES_BOOL)
+		if (r2->type == CAMEL_SEXP_RES_BOOL)
 			g_string_append_printf(str, "%d", r2->value.boolean);
-		else if (r2->type == ESEXP_RES_TIME)
+		else if (r2->type == CAMEL_SEXP_RES_TIME)
 			g_string_append_printf(str, "%ld", r2->value.time);
-		else if (r2->type == ESEXP_RES_STRING)
+		else if (r2->type == CAMEL_SEXP_RES_STRING)
 			g_string_append_printf(str, "%s", r2->value.string);
-		e_sexp_result_free (f, r1);
-		e_sexp_result_free (f, r2);
+		camel_sexp_result_free (f, r1);
+		camel_sexp_result_free (f, r2);
 		g_string_append (str, " )");
 
 		r->value.string = str->str;
@@ -268,39 +268,39 @@ eval_lt (struct _ESExp *f,
 }
 
 /* this should support all arguments ...? */
-static ESExpResult *
-eval_gt (struct _ESExp *f,
+static CamelSExpResult *
+eval_gt (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpTerm **argv,
+         struct _CamelSExpTerm **argv,
          gpointer data)
 {
-	struct _ESExpResult *r, *r1, *r2;
+	struct _CamelSExpResult *r, *r1, *r2;
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (argc == 2) {
 		GString *str = g_string_new("( ");
-		r1 = e_sexp_term_eval (f, argv[0]);
-		r2 = e_sexp_term_eval (f, argv[1]);
+		r1 = camel_sexp_term_eval (f, argv[0]);
+		r2 = camel_sexp_term_eval (f, argv[1]);
 
-		if (r1->type == ESEXP_RES_INT)
+		if (r1->type == CAMEL_SEXP_RES_INT)
 			g_string_append_printf(str, "%d", r1->value.number);
-		else if (r1->type == ESEXP_RES_TIME)
+		else if (r1->type == CAMEL_SEXP_RES_TIME)
 			g_string_append_printf(str, "%ld", r1->value.time);
-		else if (r1->type == ESEXP_RES_STRING)
+		else if (r1->type == CAMEL_SEXP_RES_STRING)
 			g_string_append_printf(str, "%s", r1->value.string);
 
 		g_string_append_printf(str, " > ");
-		if (r2->type == ESEXP_RES_INT)
+		if (r2->type == CAMEL_SEXP_RES_INT)
 			g_string_append_printf(str, "%d", r2->value.number);
-		if (r2->type == ESEXP_RES_BOOL)
+		if (r2->type == CAMEL_SEXP_RES_BOOL)
 			g_string_append_printf(str, "%d", r2->value.boolean);
-		else if (r2->type == ESEXP_RES_TIME)
+		else if (r2->type == CAMEL_SEXP_RES_TIME)
 			g_string_append_printf(str, "%ld", r2->value.time);
-		else if (r2->type == ESEXP_RES_STRING)
+		else if (r2->type == CAMEL_SEXP_RES_STRING)
 			g_string_append_printf(str, "%s", r2->value.string);
-		e_sexp_result_free (f, r1);
-		e_sexp_result_free (f, r2);
+		camel_sexp_result_free (f, r1);
+		camel_sexp_result_free (f, r2);
 		g_string_append (str, " )");
 
 		r->value.string = str->str;
@@ -309,22 +309,22 @@ eval_gt (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-match_all (struct _ESExp *f,
+static CamelSExpResult *
+match_all (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpTerm **argv,
+           struct _CamelSExpTerm **argv,
            gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing match-all: %d", argc));
 	if (argc == 0) {
-		r = e_sexp_result_new (f, ESEXP_RES_STRING);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 		r->value.string = g_strdup ("1");
-	} else if (argv[0]->type != ESEXP_TERM_BOOL)
-		r = e_sexp_term_eval (f, argv[0]);
+	} else if (argv[0]->type != CAMEL_SEXP_TERM_BOOL)
+		r = camel_sexp_term_eval (f, argv[0]);
 	else {
-		r = e_sexp_result_new (f, ESEXP_RES_STRING);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 		r->value.string = g_strdup(argv[0]->value.boolean ? "1" : "0");
 	}
 
@@ -332,46 +332,46 @@ match_all (struct _ESExp *f,
 
 }
 
-static ESExpResult *
-match_threads (struct _ESExp *f,
+static CamelSExpResult *
+match_threads (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpTerm **argv,
+               struct _CamelSExpTerm **argv,
                gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 	GString *str = g_string_new ("( ");
 
 	d(printf("executing match-threads: %d", argc));
 
 	for (i = 1; i < argc; i++) {
-		r = e_sexp_term_eval (f, argv[i]);
+		r = camel_sexp_term_eval (f, argv[i]);
 		g_string_append_printf(str, "%s%s", r->value.string, ((argc>1) && (i != argc-1)) ?  " AND ":"");
-		e_sexp_result_free (f, r);
+		camel_sexp_result_free (f, r);
 	}
 
 	g_string_append (str, " )");
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = str->str;
 	g_string_free (str, FALSE);
 
 	return r;
 }
 
-static ESExpResult *
-check_header (struct _ESExp *f,
+static CamelSExpResult *
+check_header (struct _CamelSExp *f,
               gint argc,
-              struct _ESExpResult **argv,
+              struct _CamelSExpResult **argv,
               gpointer data,
               camel_search_match_t how)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gchar *str = NULL;
 
 	d(printf("executing check-header %d\n", how));
 
 	/* are we inside a match-all? */
-	if (argc > 1 && argv[0]->type == ESEXP_RES_STRING) {
+	if (argc > 1 && argv[0]->type == CAMEL_SEXP_RES_STRING) {
 		gchar *headername;
 		gint i;
 
@@ -380,7 +380,7 @@ check_header (struct _ESExp *f,
 
 		/* performs an OR of all words */
 		for (i = 1; i < argc; i++) {
-			if (argv[i]->type == ESEXP_RES_STRING) {
+			if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 				gchar *value = NULL, *tstr = NULL;
 				if (argv[i]->value.string[0] == 0)
 					continue;
@@ -409,16 +409,16 @@ check_header (struct _ESExp *f,
 	}
 	/* TODO: else, find all matches */
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = str;
 
 	return r;
 }
 
-static ESExpResult *
-header_contains (struct _ESExp *f,
+static CamelSExpResult *
+header_contains (struct _CamelSExp *f,
                  gint argc,
-                 struct _ESExpResult **argv,
+                 struct _CamelSExpResult **argv,
                  gpointer data)
 {
 	d(printf("executing header-contains: %d", argc));
@@ -426,10 +426,10 @@ header_contains (struct _ESExp *f,
 	return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_CONTAINS);
 }
 
-static ESExpResult *
-header_matches (struct _ESExp *f,
+static CamelSExpResult *
+header_matches (struct _CamelSExp *f,
                 gint argc,
-                struct _ESExpResult **argv,
+                struct _CamelSExpResult **argv,
                 gpointer data)
 {
 	d(printf("executing header-matches: %d", argc));
@@ -437,10 +437,10 @@ header_matches (struct _ESExp *f,
 	return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_EXACT);
 }
 
-static ESExpResult *
-header_starts_with (struct _ESExp *f,
+static CamelSExpResult *
+header_starts_with (struct _CamelSExp *f,
                     gint argc,
-                    struct _ESExpResult **argv,
+                    struct _CamelSExpResult **argv,
                     gpointer data)
 {
 	d(printf("executing header-starts-with: %d", argc));
@@ -448,10 +448,10 @@ header_starts_with (struct _ESExp *f,
 	return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_STARTS);
 }
 
-static ESExpResult *
-header_ends_with (struct _ESExp *f,
+static CamelSExpResult *
+header_ends_with (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpResult **argv,
+                  struct _CamelSExpResult **argv,
                   gpointer data)
 {
 	d(printf("executing header-ends-with: %d", argc));
@@ -459,35 +459,35 @@ header_ends_with (struct _ESExp *f,
 	return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_ENDS);
 }
 
-static ESExpResult *
-header_exists (struct _ESExp *f,
+static CamelSExpResult *
+header_exists (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gchar *headername;
 
 	d(printf("executing header-exists: %d", argc));
 
 	headername = camel_db_get_column_name (argv[0]->value.string);
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup_printf ("(%s NOTNULL)", headername);
 	g_free (headername);
 	return r;
 }
 
-static ESExpResult *
-user_tag (struct _ESExp *f,
+static CamelSExpResult *
+user_tag (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing user-tag: %d", argc));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	/* Hacks no otherway to fix these really :( */
 	if (g_strcmp0 (argv[0]->value.string, "completed-on") == 0)
 		r->value.string = g_strdup_printf("(usertags LIKE '%ccompleted-on 0%c' AND usertags LIKE '%ccompleted-on%c')", '%', '%', '%', '%');
@@ -499,18 +499,18 @@ user_tag (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-user_flag (struct _ESExp *f,
+static CamelSExpResult *
+user_flag (struct _CamelSExp *f,
            gint argc,
-           struct _ESExpResult **argv,
+           struct _CamelSExpResult **argv,
            gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gchar *tstr, *qstr;
 
 	d(printf("executing user-flag: %d", argc));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (argc != 1) {
 		r->value.string = g_strdup ("(0)");
@@ -525,18 +525,18 @@ user_flag (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-system_flag (struct _ESExp *f,
+static CamelSExpResult *
+system_flag (struct _CamelSExp *f,
              gint argc,
-             struct _ESExpResult **argv,
+             struct _CamelSExpResult **argv,
              gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gchar *tstr;
 
 	d(printf("executing system-flag: %d", argc));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
 	if (argc != 1) {
 		r->value.string = g_strdup ("(0)");
@@ -549,107 +549,107 @@ system_flag (struct _ESExp *f,
 	return r;
 }
 
-static ESExpResult *
-get_sent_date (struct _ESExp *f,
+static CamelSExpResult *
+get_sent_date (struct _CamelSExp *f,
                gint argc,
-               struct _ESExpResult **argv,
+               struct _CamelSExpResult **argv,
                gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing get-sent-date\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup("dsent");
 
 	return r;
 }
 
-static ESExpResult *
-get_received_date (struct _ESExp *f,
+static CamelSExpResult *
+get_received_date (struct _CamelSExp *f,
                    gint argc,
-                   struct _ESExpResult **argv,
+                   struct _CamelSExpResult **argv,
                    gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing get-received-date\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup("dreceived");
 
 	return r;
 }
 
-static ESExpResult *
-get_current_date (struct _ESExp *f,
+static CamelSExpResult *
+get_current_date (struct _CamelSExp *f,
                   gint argc,
-                  struct _ESExpResult **argv,
+                  struct _CamelSExpResult **argv,
                   gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing get-current-date\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_INT);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 	r->value.number = time (NULL);
 	return r;
 }
 
-static ESExpResult *
-get_relative_months (struct _ESExp *f,
+static CamelSExpResult *
+get_relative_months (struct _CamelSExp *f,
                      gint argc,
-                     struct _ESExpResult **argv,
+                     struct _CamelSExpResult **argv,
                      gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing get-relative-months\n"));
 
-	if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
-		r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+	if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_INT) {
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 		r->value.boolean = FALSE;
 
 		g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
 	} else {
-		r = e_sexp_result_new (f, ESEXP_RES_INT);
+		r = camel_sexp_result_new (f, CAMEL_SEXP_RES_INT);
 		r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
 	}
 
 	return r;
 }
 
-static ESExpResult *
-get_size (struct _ESExp *f,
+static CamelSExpResult *
+get_size (struct _CamelSExp *f,
           gint argc,
-          struct _ESExpResult **argv,
+          struct _CamelSExpResult **argv,
           gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 
 	d(printf("executing get-size\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	r->value.string = g_strdup("size/1024");
 
 	return r;
 }
 
-static ESExpResult *
-sql_exp (struct _ESExp *f,
+static CamelSExpResult *
+sql_exp (struct _CamelSExp *f,
          gint argc,
-         struct _ESExpResult **argv,
+         struct _CamelSExpResult **argv,
          gpointer data)
 {
-	ESExpResult *r;
+	CamelSExpResult *r;
 	gint i;
 	GString *str = g_string_new (NULL);
 
 	d(printf("executing sql-exp\n"));
 
-	r = e_sexp_result_new (f, ESEXP_RES_STRING);
+	r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING && argv[i]->value.string)
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING && argv[i]->value.string)
 			g_string_append (str, argv[i]->value.string);
 	}
 	r->value.string = str->str;
@@ -661,18 +661,18 @@ sql_exp (struct _ESExp *f,
 /* 'builtin' functions */
 static struct {
 	const gchar *name;
-	ESExpFunc *func;
+	CamelSExpFunc func;
 	guint immediate :1;
 } symbols[] = {
-	{ "and", (ESExpFunc *) func_and, 1 },
-	{ "or", (ESExpFunc *) func_or, 1},
-	{ "not", (ESExpFunc *) func_not, 1},
-	{ "=", (ESExpFunc *)eval_eq, 1},
-	{ ">", (ESExpFunc *)eval_gt, 1},
-	{ "<", (ESExpFunc *)eval_lt, 1},
-
-	{ "match-all", (ESExpFunc *)match_all, 1 },
-	{ "match-threads", (ESExpFunc *)match_threads, 1 },
+	{ "and", (CamelSExpFunc) func_and, 1 },
+	{ "or", (CamelSExpFunc) func_or, 1},
+	{ "not", (CamelSExpFunc) func_not, 1},
+	{ "=", (CamelSExpFunc)eval_eq, 1},
+	{ ">", (CamelSExpFunc)eval_gt, 1},
+	{ "<", (CamelSExpFunc)eval_lt, 1},
+
+	{ "match-all", (CamelSExpFunc)match_all, 1 },
+	{ "match-threads", (CamelSExpFunc)match_threads, 1 },
 /*	{ "body-contains", body_contains}, */ /* We don't store body on the db. */
 	{ "header-contains", header_contains, 0},
 	{ "header-matches", header_matches, 0},
@@ -700,38 +700,38 @@ static struct {
 gchar *
 camel_sexp_to_sql_sexp (const gchar *sql)
 {
-	ESExp *sexp;
-	ESExpResult *r;
+	CamelSExp *sexp;
+	CamelSExpResult *r;
 	gint i;
 	gchar *res;
 
-	sexp = e_sexp_new ();
+	sexp = camel_sexp_new ();
 
 	for (i = 0; i < G_N_ELEMENTS (symbols); i++) {
 		if (symbols[i].immediate)
-			e_sexp_add_ifunction (sexp, 0, symbols[i].name,
-					     (ESExpIFunc *) symbols[i].func, NULL);
+			camel_sexp_add_ifunction (sexp, 0, symbols[i].name,
+					     (CamelSExpIFunc) symbols[i].func, NULL);
 		else
-			e_sexp_add_function (sexp, 0, symbols[i].name,
+			camel_sexp_add_function (sexp, 0, symbols[i].name,
 					    symbols[i].func, NULL);
 	}
 
-	e_sexp_input_text (sexp, sql, strlen (sql));
-	e_sexp_parse (sexp);
+	camel_sexp_input_text (sexp, sql, strlen (sql));
+	camel_sexp_parse (sexp);
 
-	r = e_sexp_eval (sexp);
+	r = camel_sexp_eval (sexp);
 	if (!r) {
-		e_sexp_unref (sexp);
+		g_object_unref (sexp);
 		return NULL;
 	}
 
-	if (r->type == ESEXP_RES_STRING) {
+	if (r->type == CAMEL_SEXP_RES_STRING) {
 		res = g_strdup (r->value.string);
 	} else
 		g_assert (0);
 
-	e_sexp_result_free (sexp, r);
-	e_sexp_unref (sexp);
+	camel_sexp_result_free (sexp, r);
+	g_object_unref (sexp);
 
 	return res;
 }
diff --git a/camel/camel-sexp.c b/camel/camel-sexp.c
new file mode 100644
index 0000000..31c8e2d
--- /dev/null
+++ b/camel/camel-sexp.c
@@ -0,0 +1,1861 @@
+/*
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * A simple, extensible s-exp evaluation engine.
+ *
+ * Author :
+ *  Michael Zucchi <notzed ximian com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU Lesser General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+
+/*
+ *   The following built-in s-exp's are supported:
+ *
+ *   list = (and list*)
+ *      perform an intersection of a number of lists, and return that.
+ *
+ *   bool = (and bool*)
+ *      perform a boolean AND of boolean values.
+ *
+ *   list = (or list*)
+ *      perform a union of a number of lists, returning the new list.
+ *
+ *   bool = (or bool*)
+ *      perform a boolean OR of boolean values.
+ *
+ *   gint = (+ int*)
+ *      Add integers.
+ *
+ *   string = (+ string*)
+ *      Concat strings.
+ *
+ *   time_t = (+ time_t*)
+ *      Add time_t values.
+ *
+ *   gint = (- gint int*)
+ *      Subtract integers from the first.
+ *
+ *   time_t = (- time_t*)
+ *      Subtract time_t values from the first.
+ *
+ *   gint = (cast-int string|int|bool)
+ *         Cast to an integer value.
+ *
+ *   string = (cast-string string|int|bool)
+ *         Cast to an string value.
+ *
+ *   Comparison operators:
+ *
+ *   bool = (< gint gint)
+ *   bool = (> gint gint)
+ *   bool = (= gint gint)
+ *
+ *   bool = (< string string)
+ *   bool = (> string string)
+ *   bool = (= string string)
+ *
+ *   bool = (< time_t time_t)
+ *   bool = (> time_t time_t)
+ *   bool = (= time_t time_t)
+ *      Perform a comparision of 2 integers, 2 string values, or 2 time values.
+ *
+ *   Function flow:
+ *
+ *   type = (if bool function)
+ *   type = (if bool function function)
+ *      Choose a flow path based on a boolean value
+ *
+ *   type = (begin  func func func)
+ *         Execute a sequence.  The last function return is the return type.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+
+#include "camel-sexp.h"
+
+#define p(x)			/* parse debug */
+#define r(x)			/* run debug */
+#define d(x)			/* general debug */
+
+G_DEFINE_TYPE (CamelSExp, camel_sexp, G_TYPE_OBJECT)
+
+static CamelSExpTerm * parse_list (CamelSExp *sexp, gint gotbrace);
+static CamelSExpTerm * parse_value (CamelSExp *sexp);
+
+#ifdef TESTER
+static void parse_dump_term (CamelSExpTerm *term, gint depth);
+#endif
+
+typedef gboolean	(CamelSGeneratorFunc)	(gint argc,
+						 CamelSExpResult **argv,
+						 CamelSExpResult *result);
+typedef gboolean	(CamelSOperatorFunc)	(gint argc,
+						 CamelSExpResult **argv,
+						 CamelSExpResult *result);
+
+/* FIXME: constant _TIME_MAX used in different files, move it somewhere */
+#define _TIME_MAX	((time_t) INT_MAX)	/* Max valid time_t	*/
+
+static const GScannerConfig scanner_config =
+{
+	( (gchar *) " \t\r\n")		/* cset_skip_characters */,
+	( (gchar *) G_CSET_a_2_z
+	  "_+-<=>?"
+	  G_CSET_A_2_Z)			/* cset_identifier_first */,
+	( (gchar *) G_CSET_a_2_z
+	  "_0123456789-<>?"
+	  G_CSET_A_2_Z
+	  G_CSET_LATINS
+	  G_CSET_LATINC	)		/* cset_identifier_nth */,
+	( (gchar *) ";\n" )		/* cpair_comment_single */,
+
+	FALSE				/* case_sensitive */,
+
+	TRUE				/* skip_comment_multi */,
+	TRUE				/* skip_comment_single */,
+	TRUE				/* scan_comment_multi */,
+	TRUE				/* scan_identifier */,
+	TRUE				/* scan_identifier_1char */,
+	FALSE				/* scan_identifier_NULL */,
+	TRUE				/* scan_symbols */,
+	FALSE				/* scan_binary */,
+	TRUE				/* scan_octal */,
+	TRUE				/* scan_float */,
+	TRUE				/* scan_hex */,
+	FALSE				/* scan_hex_dollar */,
+	TRUE				/* scan_string_sq */,
+	TRUE				/* scan_string_dq */,
+	TRUE				/* numbers_2_int */,
+	FALSE				/* int_2_float */,
+	FALSE				/* identifier_2_string */,
+	TRUE				/* char_2_token */,
+	FALSE				/* symbol_2_token */,
+	FALSE				/* scope_0_fallback */,
+};
+
+/**
+ * camel_sexp_fatal_error:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_fatal_error (CamelSExp *sexp,
+                        const gchar *why,
+                        ...)
+{
+	va_list args;
+
+	/* jumps back to the caller of sexp->failenv,
+	 * only to be called from inside a callback */
+
+	if (sexp->error)
+		g_free (sexp->error);
+
+	va_start (args, why);
+	sexp->error = g_strdup_vprintf (why, args);
+	va_end (args);
+
+	longjmp (sexp->failenv, 1);
+}
+
+/**
+ * camel_sexp_error:
+ *
+ * Since: 3.4
+ **/
+const gchar *
+camel_sexp_error (CamelSExp *sexp)
+{
+	return sexp->error;
+}
+
+/**
+ * camel_sexp_result_new:
+ *
+ * Since: 3.4
+ **/
+CamelSExpResult *
+camel_sexp_result_new (CamelSExp *sexp,
+                       gint type)
+{
+	CamelSExpResult *result;
+
+	result = camel_memchunk_alloc0 (sexp->result_chunks);
+	result->type = type;
+	result->occuring_start = 0;
+	result->occuring_end = _TIME_MAX;
+	result->time_generator = FALSE;
+
+	return result;
+}
+
+/**
+ * camel_sexp_result_free:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_result_free (CamelSExp *sexp,
+                        CamelSExpResult *term)
+{
+	if (term == NULL)
+		return;
+
+	switch (term->type) {
+	case CAMEL_SEXP_RES_ARRAY_PTR:
+		g_ptr_array_free (term->value.ptrarray, TRUE);
+		break;
+	case CAMEL_SEXP_RES_BOOL:
+	case CAMEL_SEXP_RES_INT:
+	case CAMEL_SEXP_RES_TIME:
+		break;
+	case CAMEL_SEXP_RES_STRING:
+		g_free (term->value.string);
+		break;
+	case CAMEL_SEXP_RES_UNDEFINED:
+		break;
+	default:
+		g_assert_not_reached ();
+	}
+	camel_memchunk_free (sexp->result_chunks, term);
+}
+
+/**
+ * camel_sexp_resultv_free:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_resultv_free (CamelSExp *sexp,
+                         gint argc,
+                         CamelSExpResult **argv)
+{
+	gint i;
+
+	/* used in normal functions if they have to abort,
+	 * and free their arguments */
+
+	for (i = 0; i < argc; i++) {
+		camel_sexp_result_free (sexp, argv[i]);
+	}
+}
+
+/* implementations for the builtin functions */
+
+/* we can only itereate a hashtable from a called function */
+struct IterData {
+	gint count;
+	GPtrArray *uids;
+};
+
+/* ok, store any values that are in all sets */
+static void
+htand (gchar *key,
+       gint value,
+       struct IterData *iter_data)
+{
+	if (value == iter_data->count) {
+		g_ptr_array_add (iter_data->uids, key);
+	}
+}
+
+/* or, store all unique values */
+static void
+htor (gchar *key,
+      gint value,
+      struct IterData *iter_data)
+{
+	g_ptr_array_add (iter_data->uids, key);
+}
+
+static CamelSExpResult *
+term_eval_and (CamelSExp *sexp,
+               gint argc,
+               CamelSExpTerm **argv,
+               gpointer data)
+{
+	CamelSExpResult *result, *r1;
+	GHashTable *ht = g_hash_table_new (g_str_hash, g_str_equal);
+	struct IterData lambdafoo;
+	gint type=-1;
+	gint bool = TRUE;
+	gint i;
+	const gchar *oper;
+
+	r(printf("( and\n"));
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	oper = "AND";
+	sexp->operators = g_slist_prepend (sexp->operators, (gpointer) oper);
+
+	for (i = 0; bool && i < argc; i++) {
+		r1 = camel_sexp_term_eval (sexp, argv[i]);
+		if (type == -1)
+			type = r1->type;
+		if (type != r1->type) {
+			camel_sexp_result_free (sexp, result);
+			camel_sexp_result_free (sexp, r1);
+			g_hash_table_destroy (ht);
+			camel_sexp_fatal_error(sexp, "Invalid types in AND");
+		} else if (r1->type == CAMEL_SEXP_RES_ARRAY_PTR) {
+			gchar **a1;
+			gint l1, j;
+
+			a1 = (gchar **) r1->value.ptrarray->pdata;
+			l1 = r1->value.ptrarray->len;
+			for (j = 0; j < l1; j++) {
+				gpointer ptr;
+				gint n;
+				ptr = g_hash_table_lookup (ht, a1[j]);
+				n = GPOINTER_TO_INT (ptr);
+				g_hash_table_insert (ht, a1[j], GINT_TO_POINTER (n + 1));
+			}
+		} else if (r1->type == CAMEL_SEXP_RES_BOOL) {
+			bool = bool && r1->value.boolean;
+		}
+		camel_sexp_result_free (sexp, r1);
+	}
+
+	if (type == CAMEL_SEXP_RES_ARRAY_PTR) {
+		lambdafoo.count = argc;
+		lambdafoo.uids = g_ptr_array_new ();
+		g_hash_table_foreach (ht, (GHFunc) htand, &lambdafoo);
+		result->type = CAMEL_SEXP_RES_ARRAY_PTR;
+		result->value.ptrarray = lambdafoo.uids;
+	} else if (type == CAMEL_SEXP_RES_BOOL) {
+		result->type = CAMEL_SEXP_RES_BOOL;
+		result->value.boolean = bool;
+	}
+
+	g_hash_table_destroy (ht);
+	sexp->operators = g_slist_remove (sexp->operators, oper);
+
+	return result;
+}
+
+static CamelSExpResult *
+term_eval_or (CamelSExp *sexp,
+              gint argc,
+              CamelSExpTerm **argv,
+              gpointer data)
+{
+	CamelSExpResult *result, *r1;
+	GHashTable *ht = g_hash_table_new (g_str_hash, g_str_equal);
+	struct IterData lambdafoo;
+	gint type = -1;
+	gint bool = FALSE;
+	gint i;
+	const gchar *oper;
+
+	r(printf("(or \n"));
+
+	oper = "OR";
+	sexp->operators = g_slist_prepend (sexp->operators, (gpointer) oper);
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	for (i = 0; !bool && i < argc; i++) {
+		r1 = camel_sexp_term_eval (sexp, argv[i]);
+		if (type == -1)
+			type = r1->type;
+		if (r1->type != type) {
+			camel_sexp_result_free (sexp, result);
+			camel_sexp_result_free (sexp, r1);
+			g_hash_table_destroy (ht);
+			camel_sexp_fatal_error(sexp, "Invalid types in OR");
+		} else if (r1->type == CAMEL_SEXP_RES_ARRAY_PTR) {
+			gchar **a1;
+			gint l1, j;
+
+			a1 = (gchar **) r1->value.ptrarray->pdata;
+			l1 = r1->value.ptrarray->len;
+			for (j = 0; j < l1; j++) {
+				g_hash_table_insert (ht, a1[j], (gpointer) 1);
+			}
+		} else if (r1->type == CAMEL_SEXP_RES_BOOL) {
+			bool |= r1->value.boolean;
+		}
+		camel_sexp_result_free (sexp, r1);
+	}
+
+	if (type == CAMEL_SEXP_RES_ARRAY_PTR) {
+		lambdafoo.count = argc;
+		lambdafoo.uids = g_ptr_array_new ();
+		g_hash_table_foreach (ht, (GHFunc) htor, &lambdafoo);
+		result->type = CAMEL_SEXP_RES_ARRAY_PTR;
+		result->value.ptrarray = lambdafoo.uids;
+	} else if (type == CAMEL_SEXP_RES_BOOL) {
+		result->type = CAMEL_SEXP_RES_BOOL;
+		result->value.boolean = bool;
+	}
+	g_hash_table_destroy (ht);
+
+	sexp->operators = g_slist_remove (sexp->operators, oper);
+	return result;
+}
+
+static CamelSExpResult *
+term_eval_not (CamelSExp *sexp,
+               gint argc,
+               CamelSExpResult **argv,
+               gpointer data)
+{
+	gint res = TRUE;
+	CamelSExpResult *result;
+
+	if (argc > 0) {
+		if (argv[0]->type == CAMEL_SEXP_RES_BOOL
+		    && argv[0]->value.boolean)
+			res = FALSE;
+	}
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_BOOL);
+	result->value.boolean = res;
+
+	return result;
+}
+
+/* this should support all arguments ...? */
+static CamelSExpResult *
+term_eval_lt (CamelSExp *sexp,
+              gint argc,
+              CamelSExpTerm **argv,
+              gpointer data)
+{
+	CamelSExpResult *result, *r1, *r2;
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	if (argc == 2) {
+		r1 = camel_sexp_term_eval (sexp, argv[0]);
+		r2 = camel_sexp_term_eval (sexp, argv[1]);
+		if (r1->type != r2->type) {
+			camel_sexp_result_free (sexp, r1);
+			camel_sexp_result_free (sexp, r2);
+			camel_sexp_result_free (sexp, result);
+			camel_sexp_fatal_error(sexp, "Incompatible types in compare <");
+		} else if (r1->type == CAMEL_SEXP_RES_INT) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = r1->value.number < r2->value.number;
+		} else if (r1->type == CAMEL_SEXP_RES_TIME) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = r1->value.time < r2->value.time;
+		} else if (r1->type == CAMEL_SEXP_RES_STRING) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = strcmp (r1->value.string, r2->value.string) < 0;
+		}
+		camel_sexp_result_free (sexp, r1);
+		camel_sexp_result_free (sexp, r2);
+	}
+	return result;
+}
+
+/* this should support all arguments ...? */
+static CamelSExpResult *
+term_eval_gt (CamelSExp *sexp,
+              gint argc,
+              CamelSExpTerm **argv,
+              gpointer data)
+{
+	CamelSExpResult *result, *r1, *r2;
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	if (argc == 2) {
+		r1 = camel_sexp_term_eval (sexp, argv[0]);
+		r2 = camel_sexp_term_eval (sexp, argv[1]);
+		if (r1->type != r2->type) {
+			camel_sexp_result_free (sexp, r1);
+			camel_sexp_result_free (sexp, r2);
+			camel_sexp_result_free (sexp, result);
+			camel_sexp_fatal_error(sexp, "Incompatible types in compare >");
+		} else if (r1->type == CAMEL_SEXP_RES_INT) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = r1->value.number > r2->value.number;
+		} else if (r1->type == CAMEL_SEXP_RES_TIME) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = r1->value.time > r2->value.time;
+		} else if (r1->type == CAMEL_SEXP_RES_STRING) {
+			result->type = CAMEL_SEXP_RES_BOOL;
+			result->value.boolean = strcmp (r1->value.string, r2->value.string) > 0;
+		}
+		camel_sexp_result_free (sexp, r1);
+		camel_sexp_result_free (sexp, r2);
+	}
+	return result;
+}
+
+/* this should support all arguments ...? */
+static CamelSExpResult *
+term_eval_eq (CamelSExp *sexp,
+              gint argc,
+              CamelSExpTerm **argv,
+              gpointer data)
+{
+	CamelSExpResult *result, *r1, *r2;
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_BOOL);
+
+	if (argc == 2) {
+		r1 = camel_sexp_term_eval (sexp, argv[0]);
+		r2 = camel_sexp_term_eval (sexp, argv[1]);
+		if (r1->type != r2->type) {
+			result->value.boolean = FALSE;
+		} else if (r1->type == CAMEL_SEXP_RES_INT) {
+			result->value.boolean = r1->value.number == r2->value.number;
+		} else if (r1->type == CAMEL_SEXP_RES_BOOL) {
+			result->value.boolean = r1->value.boolean == r2->value.boolean;
+		} else if (r1->type == CAMEL_SEXP_RES_TIME) {
+			result->value.boolean = r1->value.time == r2->value.time;
+		} else if (r1->type == CAMEL_SEXP_RES_STRING) {
+			result->value.boolean = strcmp (r1->value.string, r2->value.string) == 0;
+		}
+		camel_sexp_result_free (sexp, r1);
+		camel_sexp_result_free (sexp, r2);
+	}
+	return result;
+}
+
+static CamelSExpResult *
+term_eval_plus (CamelSExp *sexp,
+                gint argc,
+                CamelSExpResult **argv,
+                gpointer data)
+{
+	CamelSExpResult *result = NULL;
+	gint type;
+	gint i;
+
+	if (argc > 0) {
+		type = argv[0]->type;
+		switch (type) {
+		case CAMEL_SEXP_RES_INT: {
+			gint total = argv[0]->value.number;
+			for (i = 1; i < argc && argv[i]->type == CAMEL_SEXP_RES_INT; i++) {
+				total += argv[i]->value.number;
+			}
+			if (i < argc) {
+				camel_sexp_resultv_free (sexp, argc, argv);
+				camel_sexp_fatal_error(sexp, "Invalid types in (+ ints)");
+			}
+			result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+			result->value.number = total;
+			break; }
+		case CAMEL_SEXP_RES_STRING: {
+			GString *string = g_string_new (argv[0]->value.string);
+			for (i = 1; i < argc && argv[i]->type == CAMEL_SEXP_RES_STRING; i++) {
+				g_string_append (string, argv[i]->value.string);
+			}
+			if (i < argc) {
+				camel_sexp_resultv_free (sexp, argc, argv);
+				camel_sexp_fatal_error(sexp, "Invalid types in (+ strings)");
+			}
+			result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_STRING);
+			result->value.string = string->str;
+			g_string_free (string, FALSE);
+			break; }
+		case CAMEL_SEXP_RES_TIME: {
+			time_t total;
+
+			total = argv[0]->value.time;
+
+			for (i = 1; i < argc && argv[i]->type == CAMEL_SEXP_RES_TIME; i++)
+				total += argv[i]->value.time;
+
+			if (i < argc) {
+				camel_sexp_resultv_free (sexp, argc, argv);
+				camel_sexp_fatal_error (sexp, "Invalid types in (+ time_t)");
+			}
+
+			result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_TIME);
+			result->value.time = total;
+			break; }
+		}
+	}
+
+	if (result == NULL) {
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+		result->value.number = 0;
+	}
+
+	return result;
+}
+
+static CamelSExpResult *
+term_eval_sub (CamelSExp *sexp,
+               gint argc,
+               CamelSExpResult **argv,
+               gpointer data)
+{
+	CamelSExpResult *result = NULL;
+	gint type;
+	gint i;
+
+	if (argc > 0) {
+		type = argv[0]->type;
+		switch (type) {
+		case CAMEL_SEXP_RES_INT: {
+			gint total = argv[0]->value.number;
+			for (i = 1; i < argc && argv[i]->type == CAMEL_SEXP_RES_INT; i++) {
+				total -= argv[i]->value.number;
+			}
+			if (i < argc) {
+				camel_sexp_resultv_free (sexp, argc, argv);
+				camel_sexp_fatal_error(sexp, "Invalid types in -");
+			}
+			result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+			result->value.number = total;
+			break; }
+		case CAMEL_SEXP_RES_TIME: {
+			time_t total;
+
+			total = argv[0]->value.time;
+
+			for (i = 1; i < argc && argv[i]->type == CAMEL_SEXP_RES_TIME; i++)
+				total -= argv[i]->value.time;
+
+			if (i < argc) {
+				camel_sexp_resultv_free (sexp, argc, argv);
+				camel_sexp_fatal_error (sexp, "Invalid types in (- time_t)");
+			}
+
+			result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_TIME);
+			result->value.time = total;
+			break; }
+		}
+	}
+
+	if (result == NULL) {
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+		result->value.number = 0;
+	}
+	return result;
+}
+
+/* cast to gint */
+static CamelSExpResult *
+term_eval_castint (CamelSExp *sexp,
+                   gint argc,
+                   CamelSExpResult **argv,
+                   gpointer data)
+{
+	CamelSExpResult *result;
+
+	if (argc != 1)
+		camel_sexp_fatal_error(sexp, "Incorrect argument count to (gint )");
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+	switch (argv[0]->type) {
+	case CAMEL_SEXP_RES_INT:
+		result->value.number = argv[0]->value.number;
+		break;
+	case CAMEL_SEXP_RES_BOOL:
+		result->value.number = argv[0]->value.boolean != 0;
+		break;
+	case CAMEL_SEXP_RES_STRING:
+		result->value.number = strtoul (argv[0]->value.string, NULL, 10);
+		break;
+	default:
+		camel_sexp_result_free (sexp, result);
+		camel_sexp_fatal_error(sexp, "Invalid type in (cast-int )");
+	}
+
+	return result;
+}
+
+/* cast to string */
+static CamelSExpResult *
+term_eval_caststring (CamelSExp *sexp,
+                      gint argc,
+                      CamelSExpResult **argv,
+                      gpointer data)
+{
+	CamelSExpResult *result;
+
+	if (argc != 1)
+		camel_sexp_fatal_error(sexp, "Incorrect argument count to (cast-string )");
+
+	result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_STRING);
+	switch (argv[0]->type) {
+	case CAMEL_SEXP_RES_INT:
+		result->value.string = g_strdup_printf("%d", argv[0]->value.number);
+		break;
+	case CAMEL_SEXP_RES_BOOL:
+		result->value.string = g_strdup_printf("%d", argv[0]->value.boolean != 0);
+		break;
+	case CAMEL_SEXP_RES_STRING:
+		result->value.string = g_strdup (argv[0]->value.string);
+		break;
+	default:
+		camel_sexp_result_free (sexp, result);
+		camel_sexp_fatal_error(sexp, "Invalid type in (gint )");
+	}
+
+	return result;
+}
+
+/* implements 'if' function */
+static CamelSExpResult *
+term_eval_if (CamelSExp *sexp,
+              gint argc,
+              CamelSExpTerm **argv,
+              gpointer data)
+{
+	CamelSExpResult *result;
+	gint doit;
+
+	if (argc >=2 && argc <= 3) {
+		result = camel_sexp_term_eval (sexp, argv[0]);
+		doit = (result->type == CAMEL_SEXP_RES_BOOL && result->value.boolean);
+		camel_sexp_result_free (sexp, result);
+		if (doit) {
+			return camel_sexp_term_eval (sexp, argv[1]);
+		} else if (argc > 2) {
+			return camel_sexp_term_eval (sexp, argv[2]);
+		}
+	}
+	return camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+}
+
+/* implements 'begin' statement */
+static CamelSExpResult *
+term_eval_begin (CamelSExp *sexp,
+                 gint argc,
+                 CamelSExpTerm **argv,
+                 gpointer data)
+{
+	CamelSExpResult *result = NULL;
+	gint i;
+
+	for (i = 0; i < argc; i++) {
+		if (result != NULL)
+			camel_sexp_result_free (sexp, result);
+		result = camel_sexp_term_eval (sexp, argv[i]);
+	}
+	if (result != NULL)
+		return result;
+	else
+		return camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+}
+
+/**
+ * camel_sexp_term_eval:
+ *
+ * Since: 3.4
+ **/
+CamelSExpResult *
+camel_sexp_term_eval (CamelSExp *sexp,
+                      CamelSExpTerm *term)
+{
+	CamelSExpResult *result = NULL;
+	gint i;
+	CamelSExpResult **argv;
+
+	/* this must only be called from inside term evaluation callbacks! */
+
+	g_return_val_if_fail (term != NULL, NULL);
+
+	r(printf("eval term :\n"));
+	r (parse_dump_term (term, 0));
+
+	switch (term->type) {
+	case CAMEL_SEXP_TERM_STRING:
+		r(printf(" (string \"%s\")\n", term->value.string));
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_STRING);
+		/* erk, this shoul;dn't need to strdup this ... */
+		result->value.string = g_strdup (term->value.string);
+		break;
+	case CAMEL_SEXP_TERM_INT:
+		r(printf(" (gint %d)\n", term->value.number));
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_INT);
+		result->value.number = term->value.number;
+		break;
+	case CAMEL_SEXP_TERM_BOOL:
+		r(printf(" (gint %d)\n", term->value.number));
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_BOOL);
+		result->value.boolean = term->value.boolean;
+		break;
+	case CAMEL_SEXP_TERM_TIME:
+		r(printf(" (time_t %ld)\n", term->value.time));
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_TIME);
+		result->value.time = term->value.time;
+		break;
+	case CAMEL_SEXP_TERM_IFUNC:
+		if (term->value.func.sym && term->value.func.sym->f.ifunc)
+			result = term->value.func.sym->f.ifunc (sexp, term->value.func.termcount, term->value.func.terms, term->value.func.sym->data);
+		break;
+	case CAMEL_SEXP_TERM_FUNC:
+		/* first evaluate all arguments to result types */
+		argv = alloca (sizeof (argv[0]) * term->value.func.termcount);
+		for (i = 0; i < term->value.func.termcount; i++) {
+			argv[i] = camel_sexp_term_eval (sexp, term->value.func.terms[i]);
+		}
+		/* call the function */
+		if (term->value.func.sym->f.func)
+			result = term->value.func.sym->f.func (sexp, term->value.func.termcount, argv, term->value.func.sym->data);
+
+		camel_sexp_resultv_free (sexp, term->value.func.termcount, argv);
+		break;
+	default:
+		camel_sexp_fatal_error(sexp, "Unknown type in parse tree: %d", term->type);
+	}
+
+	if (result == NULL)
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	return result;
+}
+
+#ifdef TESTER
+static void
+eval_dump_result (CamelSExpResult *result,
+                  gint depth)
+{
+	gint i;
+
+	if (result == NULL) {
+		printf("null result???\n");
+		return;
+	}
+
+	for (i = 0; i < depth; i++)
+		printf("   ");
+
+	switch (result->type) {
+	case CAMEL_SEXP_RES_ARRAY_PTR:
+		printf("array pointers\n");
+		break;
+	case CAMEL_SEXP_RES_INT:
+		printf("int: %d\n", result->value.number);
+		break;
+	case CAMEL_SEXP_RES_STRING:
+		printf("string: '%s'\n", result->value.string);
+		break;
+	case CAMEL_SEXP_RES_BOOL:
+		printf("bool: %c\n", result->value.boolean?'t':'f');
+		break;
+	case CAMEL_SEXP_RES_TIME:
+		printf("time_t: %ld\n", (glong) result->value.time);
+		break;
+	case CAMEL_SEXP_RES_UNDEFINED:
+		printf(" <undefined>\n");
+		break;
+	}
+	printf("\n");
+}
+#endif
+
+#ifdef TESTER
+static void
+parse_dump_term (CamelSExpTerm *term,
+                 gint depth)
+{
+	gint i;
+
+	if (t == NULL) {
+		printf("null term??\n");
+		return;
+	}
+
+	for (i = 0; i < depth; i++)
+		printf("   ");
+
+	switch (term->type) {
+	case CAMEL_SEXP_TERM_STRING:
+		printf(" \"%s\"", term->value.string);
+		break;
+	case CAMEL_SEXP_TERM_INT:
+		printf(" %d", term->value.number);
+		break;
+	case CAMEL_SEXP_TERM_BOOL:
+		printf(" #%c", term->value.boolean?'t':'f');
+		break;
+	case CAMEL_SEXP_TERM_TIME:
+		printf(" %ld", (glong) term->value.time);
+		break;
+	case CAMEL_SEXP_TERM_IFUNC:
+	case CAMEL_SEXP_TERM_FUNC:
+		printf(" (function %s\n", term->value.func.sym->name);
+		/*printf(" [%d] ", term->value.func.termcount);*/
+		for (i = 0; i < term->value.func.termcount; i++) {
+			parse_dump_term (term->value.func.terms[i], depth + 1);
+		}
+		for (i = 0; i < depth; i++)
+			printf("   ");
+		printf(" )");
+		break;
+	case CAMEL_SEXP_TERM_VAR:
+		printf(" (variable %s )\n", term->value.var->name);
+		break;
+	default:
+		printf("unknown type: %d\n", term->type);
+	}
+
+	printf("\n");
+}
+#endif
+
+const gchar *time_functions[] = {
+	"time-now",
+	"make-time",
+	"time-add-day",
+	"time-day-begin",
+	"time-day-end"
+};
+
+static gboolean
+occur_in_time_range_generator (gint argc,
+                               CamelSExpResult **argv,
+                               CamelSExpResult *result)
+{
+	g_return_val_if_fail (result != NULL, FALSE);
+	g_return_val_if_fail (argc == 2 || argc == 3, FALSE);
+
+	if ((argv[0]->type != CAMEL_SEXP_RES_TIME) || (argv[1]->type != CAMEL_SEXP_RES_TIME))
+		return FALSE;
+
+	result->occuring_start = argv[0]->value.time;
+	result->occuring_end = argv[1]->value.time;
+
+	return TRUE;
+}
+
+static gboolean
+binary_generator (gint argc,
+                  CamelSExpResult **argv,
+                  CamelSExpResult *result)
+{
+	g_return_val_if_fail (result != NULL, FALSE);
+	g_return_val_if_fail (argc == 2, FALSE);
+
+	if ((argv[0]->type != CAMEL_SEXP_RES_TIME) || (argv[1]->type != CAMEL_SEXP_RES_TIME))
+		return FALSE;
+
+	result->occuring_start = argv[0]->value.time;
+	result->occuring_end = argv[1]->value.time;
+
+	return TRUE;
+}
+
+static gboolean
+unary_generator (gint argc,
+                 CamelSExpResult **argv,
+                 CamelSExpResult *result)
+{
+	/* unary generator with end time */
+	g_return_val_if_fail (result != NULL, FALSE);
+	g_return_val_if_fail (argc == 1, FALSE);
+
+	if (argv[0]->type != CAMEL_SEXP_RES_TIME)
+		return FALSE;
+
+	result->occuring_start = 0;
+	result->occuring_end = argv[0]->value.time;
+
+	return TRUE;
+}
+
+static const struct {
+	const gchar *name;
+	CamelSGeneratorFunc *func;
+} generators[] = {
+	{"occur-in-time-range?", occur_in_time_range_generator},
+	{"due-in-time-range?", binary_generator},
+	{"has-alarms-in-range?", binary_generator},
+	{"completed-before?", unary_generator},
+};
+
+const gint generators_count = sizeof (generators) / sizeof (generators[0]);
+
+static gboolean
+or_operator (gint argc,
+             CamelSExpResult **argv,
+             CamelSExpResult *result)
+{
+	gint ii;
+
+	/*
+	 * A          B           A or B
+	 * ----       ----        ------
+	 * norm (0)   norm (0)    norm (0)
+	 * gen (1)    norm (0)    norm (0)
+	 * norm (0)   gen (1)     norm (0)
+	 * gen (1)    gen (1)     gen*(1)
+	 */
+
+	g_return_val_if_fail (result != NULL, FALSE);
+	g_return_val_if_fail (argc > 0, FALSE);
+
+	result->time_generator = TRUE;
+	for (ii = 0; ii < argc && result->time_generator; ii++) {
+		result->time_generator = argv[ii]->time_generator;
+	}
+
+	if (result->time_generator) {
+		result->occuring_start = argv[0]->occuring_start;
+		result->occuring_end = argv[0]->occuring_end;
+
+		for (ii = 1; ii < argc; ii++) {
+			result->occuring_start = MIN (result->occuring_start, argv[ii]->occuring_start);
+			result->occuring_end = MAX (result->occuring_end, argv[ii]->occuring_end);
+		}
+	}
+
+	return TRUE;
+}
+
+static gboolean
+and_operator (gint argc,
+              CamelSExpResult **argv,
+              CamelSExpResult *result)
+{
+	gint ii;
+
+	/*
+	 * A           B          A and B
+	 * ----        ----       ------- -
+	 * norm (0)     norm (0)    norm (0)
+	 * gen (1)      norm (0)    gen (1)
+	 * norm (0)     gen (1)     gen (1)
+	 * gen (1)      gen (1)     gen (1)
+	 * */
+
+	g_return_val_if_fail (result != NULL, FALSE);
+	g_return_val_if_fail (argc > 0, FALSE);
+
+	result->time_generator = FALSE;
+	for (ii = 0; ii < argc && !result->time_generator; ii++) {
+		result->time_generator = argv[ii]->time_generator;
+	}
+
+	if (result->time_generator) {
+		result->occuring_start = argv[0]->occuring_start;
+		result->occuring_end = argv[0]->occuring_end;
+
+		for (ii = 1; ii < argc; ii++) {
+			result->occuring_start = MAX (result->occuring_start, argv[ii]->occuring_start);
+			result->occuring_end = MIN (result->occuring_end, argv[ii]->occuring_end);
+		}
+	}
+
+	return TRUE;
+}
+
+static const struct {
+	const gchar *name;
+	CamelSOperatorFunc *func;
+} operators[] = {
+	{"or", or_operator},
+	{"and", and_operator}
+};
+
+const gint operators_count = sizeof (operators) / sizeof (operators[0]);
+
+static CamelSOperatorFunc *
+get_operator_function (const gchar *fname)
+{
+	gint i;
+
+	g_return_val_if_fail (fname != NULL, NULL);
+
+	for (i = 0; i < sizeof (operators) / sizeof (operators[0]); i++)
+		if (strcmp (operators[i].name, fname) == 0)
+			return operators[i].func;
+
+	return NULL;
+}
+
+static inline gboolean
+is_time_function (const gchar *fname)
+{
+	gint i;
+
+	g_return_val_if_fail (fname != NULL, FALSE);
+
+	for (i = 0; i < sizeof (time_functions) / sizeof (time_functions[0]); i++)
+		if (strcmp (time_functions[i], fname) == 0)
+			return TRUE;
+
+	return FALSE;
+}
+
+static CamelSGeneratorFunc *
+get_generator_function (const gchar *fname)
+{
+	gint i;
+
+	g_return_val_if_fail (fname != NULL, NULL);
+
+	for (i = 0; i < sizeof (generators) / sizeof (generators[0]); i++)
+		if (strcmp (generators[i].name, fname) == 0)
+			return generators[i].func;
+
+	return NULL;
+}
+
+/* this must only be called from inside term evaluation callbacks! */
+static CamelSExpResult *
+camel_sexp_term_evaluate_occur_times (CamelSExp *sexp,
+                                      CamelSExpTerm *term,
+                                      time_t *start,
+                                      time_t *end)
+{
+	CamelSExpResult *result = NULL;
+	gint i, argc;
+	CamelSExpResult **argv;
+	gboolean ok = TRUE;
+
+	g_return_val_if_fail (term != NULL, NULL);
+	g_return_val_if_fail (start != NULL, NULL);
+	g_return_val_if_fail (end != NULL, NULL);
+
+	/*
+	printf("eval term :\n");
+	parse_dump_term (t, 0);
+	*/
+
+	switch (term->type) {
+	case CAMEL_SEXP_TERM_STRING:
+		r(printf(" (string \"%s\")\n", term->value.string));
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_STRING);
+		result->value.string = g_strdup (term->value.string);
+		break;
+	case CAMEL_SEXP_TERM_IFUNC:
+	case CAMEL_SEXP_TERM_FUNC:
+	{
+		CamelSGeneratorFunc *generator = NULL;
+		CamelSOperatorFunc *operator = NULL;
+
+		r(printf(" (function \"%s\"\n", term->value.func.sym->name));
+
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+		argc = term->value.func.termcount;
+		argv = alloca (sizeof (argv[0]) * argc);
+
+		for (i = 0; i < term->value.func.termcount; i++) {
+			argv[i] = camel_sexp_term_evaluate_occur_times (sexp, term->value.func.terms[i],
+								    start, end);
+		}
+
+		if (is_time_function (term->value.func.sym->name)) {
+			/* evaluate time */
+			if (term->value.func.sym->f.func)
+				result = term->value.func.sym->f.func (sexp, term->value.func.termcount,
+					      argv, term->value.func.sym->data);
+		} else if ((generator = get_generator_function (term->value.func.sym->name)) != NULL) {
+			/* evaluate generator function */
+			result->time_generator = TRUE;
+			ok = generator (argc, argv, result);
+		} else if ((operator = get_operator_function (term->value.func.sym->name)) != NULL)
+			/* evaluate operator function */
+			ok = operator (argc, argv, result);
+		else {
+			/* normal function: we need to scan all objects */
+			result->time_generator = FALSE;
+		}
+
+		camel_sexp_resultv_free (sexp, term->value.func.termcount, argv);
+		break;
+	}
+	case CAMEL_SEXP_TERM_INT:
+	case CAMEL_SEXP_TERM_BOOL:
+	case CAMEL_SEXP_TERM_TIME:
+		break;
+	default:
+		ok = FALSE;
+		break;
+	}
+
+	if (!ok)
+		camel_sexp_fatal_error(sexp, "Error in parse tree");
+
+	if (result == NULL)
+		result = camel_sexp_result_new (sexp, CAMEL_SEXP_RES_UNDEFINED);
+
+	return result;
+}
+
+/*
+  PARSER
+*/
+
+static CamelSExpTerm *
+parse_term_new (CamelSExp *sexp,
+                gint type)
+{
+	CamelSExpTerm *term;
+
+	term = camel_memchunk_alloc0 (sexp->term_chunks);
+	term->type = type;
+
+	return term;
+}
+
+static void
+parse_term_free (CamelSExp *sexp,
+                 CamelSExpTerm *term)
+{
+	gint i;
+
+	if (term == NULL) {
+		return;
+	}
+
+	switch (term->type) {
+	case CAMEL_SEXP_TERM_INT:
+	case CAMEL_SEXP_TERM_BOOL:
+	case CAMEL_SEXP_TERM_TIME:
+	case CAMEL_SEXP_TERM_VAR:
+		break;
+
+	case CAMEL_SEXP_TERM_STRING:
+		g_free (term->value.string);
+		break;
+
+	case CAMEL_SEXP_TERM_FUNC:
+	case CAMEL_SEXP_TERM_IFUNC:
+		for (i = 0; i < term->value.func.termcount; i++) {
+			parse_term_free (sexp, term->value.func.terms[i]);
+		}
+		g_free (term->value.func.terms);
+		break;
+
+	default:
+		printf("parse_term_free: unknown type: %d\n", term->type);
+	}
+	camel_memchunk_free (sexp->term_chunks, term);
+}
+
+static CamelSExpTerm **
+parse_values (CamelSExp *sexp,
+              gint *len)
+{
+	gint token;
+	CamelSExpTerm **terms;
+	gint i, size = 0;
+	GScanner *gs = sexp->scanner;
+	GSList *list = NULL, *l;
+
+	p(printf("parsing values\n"));
+
+	while ( (token = g_scanner_peek_next_token (gs)) != G_TOKEN_EOF
+		&& token != ')') {
+		list = g_slist_prepend (list, parse_value (sexp));
+		size++;
+	}
+
+	/* go over the list, and put them backwards into the term array */
+	terms = g_malloc (size * sizeof (*terms));
+	l = list;
+	for (i = size - 1; i >= 0; i--) {
+		g_assert (l);
+		g_assert (l->data);
+		terms[i] = l->data;
+		l = g_slist_next (l);
+	}
+	g_slist_free (list);
+
+	p(printf("found %d subterms\n", size));
+	*len = size;
+
+	p(printf("done parsing values\n"));
+	return terms;
+}
+
+/**
+ * camel_sexp_parse_value:
+ *
+ * Since: 3.4
+ **/
+CamelSExpTerm *
+camel_sexp_parse_value (CamelSExp *sexp)
+{
+	return parse_value (sexp);
+}
+
+static CamelSExpTerm *
+parse_value (CamelSExp *sexp)
+{
+	gint token, negative = FALSE;
+	CamelSExpTerm *term = NULL;
+	GScanner *gs = sexp->scanner;
+	CamelSExpSymbol *sym;
+
+	p(printf("parsing value\n"));
+
+	token = g_scanner_get_next_token (gs);
+	switch (token) {
+	case G_TOKEN_EOF:
+		break;
+	case G_TOKEN_LEFT_PAREN:
+		p(printf("got brace, its a list!\n"));
+		return parse_list (sexp, TRUE);
+	case G_TOKEN_STRING:
+		p(printf("got string '%s'\n", g_scanner_cur_value(gs).v_string));
+		term = parse_term_new (sexp, CAMEL_SEXP_TERM_STRING);
+		term->value.string = g_strdup (g_scanner_cur_value (gs).v_string);
+		break;
+	case '-':
+		p(printf ("got negative int?\n"));
+		token = g_scanner_get_next_token (gs);
+		if (token != G_TOKEN_INT) {
+			camel_sexp_fatal_error (sexp, "Invalid format for a integer value");
+			return NULL;
+		}
+
+		negative = TRUE;
+		/* fall through... */
+	case G_TOKEN_INT:
+		term = parse_term_new (sexp, CAMEL_SEXP_TERM_INT);
+		term->value.number = g_scanner_cur_value (gs).v_int;
+		if (negative)
+			term->value.number = -term->value.number;
+		p(printf("got gint %d\n", term->value.number));
+		break;
+	case '#': {
+		gchar *str;
+
+		p(printf("got bool?\n"));
+		token = g_scanner_get_next_token (gs);
+		if (token != G_TOKEN_IDENTIFIER) {
+			camel_sexp_fatal_error (sexp, "Invalid format for a boolean value");
+			return NULL;
+		}
+
+		str = g_scanner_cur_value (gs).v_identifier;
+
+		g_assert (str != NULL);
+		if (!(strlen (str) == 1 && (str[0] == 't' || str[0] == 'f'))) {
+			camel_sexp_fatal_error (sexp, "Invalid format for a boolean value");
+			return NULL;
+		}
+
+		term = parse_term_new (sexp, CAMEL_SEXP_TERM_BOOL);
+		term->value.boolean = (str[0] == 't');
+		break; }
+	case G_TOKEN_SYMBOL:
+		sym = g_scanner_cur_value (gs).v_symbol;
+		p(printf("got symbol '%s'\n", sym->name));
+		switch (sym->type) {
+		case CAMEL_SEXP_TERM_FUNC:
+		case CAMEL_SEXP_TERM_IFUNC:
+			/* this is basically invalid, since we can't use function
+			 * pointers, but let the runtime catch it ... */
+			term = parse_term_new (sexp, sym->type);
+			term->value.func.sym = sym;
+			term->value.func.terms = parse_values (sexp, &term->value.func.termcount);
+			break;
+		case CAMEL_SEXP_TERM_VAR:
+			term = parse_term_new (sexp, sym->type);
+			term->value.var = sym;
+			break;
+		default:
+			camel_sexp_fatal_error(sexp, "Invalid symbol type: %s: %d", sym->name, sym->type);
+		}
+		break;
+	case G_TOKEN_IDENTIFIER:
+		p(printf("got unknown identifider '%s'\n", g_scanner_cur_value(gs).v_identifier));
+		camel_sexp_fatal_error(sexp, "Unknown identifier: %s", g_scanner_cur_value(gs).v_identifier);
+		break;
+	default:
+		camel_sexp_fatal_error(sexp, "Unexpected token encountered: %d", token);
+	}
+	p(printf("done parsing value\n"));
+
+	return term;
+}
+
+/* FIXME: this needs some robustification */
+static CamelSExpTerm *
+parse_list (CamelSExp *sexp,
+            gint gotbrace)
+{
+	gint token;
+	CamelSExpTerm *term = NULL;
+	GScanner *gs = sexp->scanner;
+
+	p(printf("parsing list\n"));
+	if (gotbrace)
+		token = '(';
+	else
+		token = g_scanner_get_next_token (gs);
+	if (token =='(') {
+		token = g_scanner_get_next_token (gs);
+		switch (token) {
+		case G_TOKEN_SYMBOL: {
+			CamelSExpSymbol *sym;
+
+			sym = g_scanner_cur_value (gs).v_symbol;
+			p(printf("got funciton: %s\n", sym->name));
+			term = parse_term_new (sexp, sym->type);
+			p(printf("created new list %p\n", t));
+			/* if we have a variable, find out its base type */
+			while (sym->type == CAMEL_SEXP_TERM_VAR) {
+				sym = ((CamelSExpTerm *)(sym->data))->value.var;
+			}
+			if (sym->type == CAMEL_SEXP_TERM_FUNC
+			    || sym->type == CAMEL_SEXP_TERM_IFUNC) {
+				term->value.func.sym = sym;
+				term->value.func.terms = parse_values (sexp, &term->value.func.termcount);
+			} else {
+				parse_term_free (sexp, term);
+				camel_sexp_fatal_error(sexp, "Trying to call variable as function: %s", sym->name);
+			}
+			break; }
+		case G_TOKEN_IDENTIFIER:
+			camel_sexp_fatal_error(sexp, "Unknown identifier: %s", g_scanner_cur_value(gs).v_identifier);
+			break;
+		case G_TOKEN_LEFT_PAREN:
+			return parse_list (sexp, TRUE);
+		default:
+			camel_sexp_fatal_error(sexp, "Unexpected token encountered: %d", token);
+		}
+		token = g_scanner_get_next_token (gs);
+		if (token != ')') {
+			camel_sexp_fatal_error(sexp, "Missing ')'");
+		}
+	} else {
+		camel_sexp_fatal_error(sexp, "Missing '('");
+	}
+
+	p(printf("returning list %p\n", term));
+
+	return term;
+}
+
+static void
+free_symbol (gpointer key,
+             gpointer value,
+             gpointer data)
+{
+	CamelSExpSymbol *sym = value;
+
+	g_free (sym->name);
+	g_free (sym);
+}
+
+static void
+camel_sexp_finalize (GObject *object)
+{
+	CamelSExp *sexp = (CamelSExp *) object;
+
+	if (sexp->tree) {
+		parse_term_free (sexp, sexp->tree);
+		sexp->tree = NULL;
+	}
+
+	camel_memchunk_destroy (sexp->term_chunks);
+	camel_memchunk_destroy (sexp->result_chunks);
+
+	g_scanner_scope_foreach_symbol (sexp->scanner, 0, free_symbol, NULL);
+	g_scanner_destroy (sexp->scanner);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (camel_sexp_parent_class)->finalize (object);
+}
+
+
+static void
+camel_sexp_class_init (CamelSExpClass *class)
+{
+	GObjectClass *object_class;
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->finalize = camel_sexp_finalize;
+}
+
+/* 'builtin' functions */
+static const struct {
+	const gchar *name;
+	CamelSExpFunc func;
+	gint type;	/* set to 1 if a function can perform shortcut
+			 * evaluation, or doesn't execute everything,
+			 * 0 otherwise */
+} symbols[] = {
+	{ "and",         (CamelSExpFunc) term_eval_and, 1 },
+	{ "or",          (CamelSExpFunc) term_eval_or, 1 },
+	{ "not",         (CamelSExpFunc) term_eval_not, 0 },
+	{ "<",           (CamelSExpFunc) term_eval_lt, 1 },
+	{ ">",           (CamelSExpFunc) term_eval_gt, 1 },
+	{ "=",           (CamelSExpFunc) term_eval_eq, 1 },
+	{ "+",           (CamelSExpFunc) term_eval_plus, 0 },
+	{ "-",           (CamelSExpFunc) term_eval_sub, 0 },
+	{ "cast-int",    (CamelSExpFunc) term_eval_castint, 0 },
+	{ "cast-string", (CamelSExpFunc) term_eval_caststring, 0 },
+	{ "if",          (CamelSExpFunc) term_eval_if, 1 },
+	{ "begin",       (CamelSExpFunc) term_eval_begin, 1 },
+};
+
+static void
+camel_sexp_init (CamelSExp *sexp)
+{
+	gint i;
+
+	sexp->scanner = g_scanner_new (&scanner_config);
+	sexp->term_chunks = camel_memchunk_new (16, sizeof (CamelSExpTerm));
+	sexp->result_chunks = camel_memchunk_new (16, sizeof (CamelSExpResult));
+
+	/* load in builtin symbols? */
+	for (i = 0; i < G_N_ELEMENTS (symbols); i++) {
+		if (symbols[i].type == 1) {
+			camel_sexp_add_ifunction (
+				sexp, 0, symbols[i].name,
+				(CamelSExpIFunc) symbols[i].func,
+				(gpointer) &symbols[i]);
+		} else {
+			camel_sexp_add_function (
+				sexp, 0, symbols[i].name,
+				symbols[i].func,
+				(gpointer) &symbols[i]);
+		}
+	}
+}
+
+/**
+ * camel_sexp_new:
+ *
+ * Since: 3.4
+ **/
+CamelSExp *
+camel_sexp_new (void)
+{
+	return g_object_new (CAMEL_TYPE_SEXP, NULL);
+}
+
+/**
+ * camel_sexp_add_function:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_add_function (CamelSExp *sexp,
+                         guint scope,
+                         const gchar *name,
+                         CamelSExpFunc func,
+                         gpointer data)
+{
+	CamelSExpSymbol *sym;
+
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+	g_return_if_fail (name != NULL);
+
+	camel_sexp_remove_symbol (sexp, scope, name);
+
+	sym = g_malloc0 (sizeof (*sym));
+	sym->name = g_strdup (name);
+	sym->f.func = func;
+	sym->type = CAMEL_SEXP_TERM_FUNC;
+	sym->data = data;
+
+	g_scanner_scope_add_symbol (sexp->scanner, scope, sym->name, sym);
+}
+
+/**
+ * camel_sexp_add_ifunction:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_add_ifunction (CamelSExp *sexp,
+                          guint scope,
+                          const gchar *name,
+                          CamelSExpIFunc ifunc,
+                          gpointer data)
+{
+	CamelSExpSymbol *sym;
+
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+	g_return_if_fail (name != NULL);
+
+	camel_sexp_remove_symbol (sexp, scope, name);
+
+	sym = g_malloc0 (sizeof (*sym));
+	sym->name = g_strdup (name);
+	sym->f.ifunc = ifunc;
+	sym->type = CAMEL_SEXP_TERM_IFUNC;
+	sym->data = data;
+
+	g_scanner_scope_add_symbol (sexp->scanner, scope, sym->name, sym);
+}
+
+/**
+ * camel_sexp_add_variable:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_add_variable (CamelSExp *sexp,
+                         guint scope,
+                         gchar *name,
+                         CamelSExpTerm *value)
+{
+	CamelSExpSymbol *sym;
+
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+	g_return_if_fail (name != NULL);
+
+	sym = g_malloc0 (sizeof (*sym));
+	sym->name = g_strdup (name);
+	sym->type = CAMEL_SEXP_TERM_VAR;
+	sym->data = value;
+
+	g_scanner_scope_add_symbol (sexp->scanner, scope, sym->name, sym);
+}
+
+/**
+ * camel_sexp_remove_symbol:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_remove_symbol (CamelSExp *sexp,
+                          guint scope,
+                          const gchar *name)
+{
+	gint oldscope;
+	CamelSExpSymbol *sym;
+
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+	g_return_if_fail (name != NULL);
+
+	oldscope = g_scanner_set_scope (sexp->scanner, scope);
+	sym = g_scanner_lookup_symbol (sexp->scanner, name);
+	g_scanner_scope_remove_symbol (sexp->scanner, scope, name);
+	g_scanner_set_scope (sexp->scanner, oldscope);
+	if (sym != NULL) {
+		g_free (sym->name);
+		g_free (sym);
+	}
+}
+
+/**
+ * camel_sexp_set_scope:
+ *
+ * Since: 3.4
+ **/
+gint
+camel_sexp_set_scope (CamelSExp *sexp,
+                      guint scope)
+{
+	g_return_val_if_fail (CAMEL_IS_SEXP (sexp), 0);
+
+	return g_scanner_set_scope (sexp->scanner, scope);
+}
+
+/**
+ * camel_sexp_input_text:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_input_text (CamelSExp *sexp,
+                       const gchar *text,
+                       gint len)
+{
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+	g_return_if_fail (text != NULL);
+
+	g_scanner_input_text (sexp->scanner, text, len);
+}
+
+/**
+ * camel_sexp_input_file:
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_input_file (CamelSExp *sexp,
+                       gint fd)
+{
+	g_return_if_fail (CAMEL_IS_SEXP (sexp));
+
+	g_scanner_input_file (sexp->scanner, fd);
+}
+
+/**
+ * camel_sexp_parse:
+ *
+ * Since: 3.4
+ **/
+gint
+camel_sexp_parse (CamelSExp *sexp)
+{
+	g_return_val_if_fail (CAMEL_IS_SEXP (sexp), -1);
+
+	if (setjmp (sexp->failenv)) {
+		g_warning("Error in parsing: %s", sexp->error);
+		return -1;
+	}
+
+	if (sexp->tree)
+		parse_term_free (sexp, sexp->tree);
+
+	sexp->tree = parse_value (sexp);
+
+	return 0;
+}
+
+/**
+ * camel_sexp_eval:
+ *
+ * Since: 3.4
+ **/
+CamelSExpResult *
+camel_sexp_eval (CamelSExp *sexp)
+{
+	g_return_val_if_fail (CAMEL_IS_SEXP (sexp), NULL);
+	g_return_val_if_fail (sexp->tree != NULL, NULL);
+
+	if (setjmp (sexp->failenv)) {
+		g_warning("Error in execution: %s", sexp->error);
+		return NULL;
+	}
+
+	return camel_sexp_term_eval (sexp, sexp->tree);
+}
+
+/**
+ * e_cal_backend_sexp_evaluate_occur_times:
+ * @f: An #CamelSExp object.
+ * @start: Start of the time window will be stored here.
+ * @end: End of the time window will be stored here.
+ *
+ * Determines biggest time window given by expressions "occur-in-range" in sexp.
+ *
+ * Since: 3.4
+ */
+gboolean
+camel_sexp_evaluate_occur_times (CamelSExp *sexp,
+                                 time_t *start,
+                                 time_t *end)
+{
+	CamelSExpResult *result;
+	gboolean generator;
+	g_return_val_if_fail (CAMEL_IS_SEXP (sexp), FALSE);
+	g_return_val_if_fail (sexp->tree != NULL, FALSE);
+	g_return_val_if_fail (start != NULL, FALSE);
+	g_return_val_if_fail (end != NULL, FALSE);
+
+	*start = *end = -1;
+
+	if (setjmp (sexp->failenv)) {
+		g_warning("Error in execution: %s", sexp->error);
+		return FALSE;
+	}
+
+	result = camel_sexp_term_evaluate_occur_times (
+		sexp, sexp->tree, start, end);
+	generator = result->time_generator;
+
+	if (generator) {
+		*start = result->occuring_start;
+		*end = result->occuring_end;
+	}
+
+	camel_sexp_result_free (sexp, result);
+
+	return generator;
+}
+
+/**
+ * camel_sexp_encode_bool:
+ * @string:
+ * @v_bool:
+ *
+ * Encode a bool into an s-expression @string.  Bools are
+ * encoded using #t #f syntax.
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_encode_bool (GString *string,
+                        gboolean v_bool)
+{
+	if (v_bool)
+		g_string_append (string, " #t");
+	else
+		g_string_append (string, " #f");
+}
+
+/**
+ * camel_sexp_encode_string:
+ * @string: Destination string.
+ * @v_string: String expression.
+ *
+ * Add a c string @v_string to the s-expression stored in
+ * the gstring @s.  Quotes are added, and special characters
+ * are escaped appropriately.
+ *
+ * Since: 3.4
+ **/
+void
+camel_sexp_encode_string (GString *string,
+                          const gchar *v_string)
+{
+	gchar c;
+	const gchar *p;
+
+	if (v_string == NULL)
+		p = "";
+	else
+		p = v_string;
+	g_string_append (string, " \"");
+	while ((c = *p++)) {
+		if (c == '\\' || c == '\"' || c == '\'')
+			g_string_append_c (string, '\\');
+		g_string_append_c (string, c);
+	}
+	g_string_append (string, "\"");
+}
+
+#ifdef TESTER
+gint
+main (gint argc,
+      gchar **argv)
+{
+	CamelSExp *sexp;
+	gchar *t = "(+ \"foo\" \"\\\"\" \"bar\" \"\\\\ blah \\x \")";
+	CamelSExpResult *result;
+
+	g_type_init ();
+
+	sexp = camel_sexp_new ();
+
+	camel_sexp_add_variable (sexp, 0, "test", NULL);
+
+	if (argc < 2 || !argv[1])
+		return;
+
+	camel_sexp_input_text (sexp, t, t);
+	camel_sexp_parse (sexp);
+
+	if (sexp->tree)
+		parse_dump_term (sexp->tree, 0);
+
+	result = camel_sexp_eval (sexp);
+	if (result) {
+		eval_dump_result (result, 0);
+	} else {
+		printf("no result?|\n");
+	}
+
+	return 0;
+}
+#endif
diff --git a/camel/camel-sexp.h b/camel/camel-sexp.h
new file mode 100644
index 0000000..50e5ab8
--- /dev/null
+++ b/camel/camel-sexp.h
@@ -0,0 +1,243 @@
+/*
+ * generic s-exp evaluator class
+*/
+
+#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
+#error "Only <camel/camel.h> can be included directly."
+#endif
+
+#ifndef CAMEL_SEXP_H
+#define CAMEL_SEXP_H
+
+#include <setjmp.h>
+#include <time.h>
+#include <glib.h>
+
+#include <glib-object.h>
+
+#include <camel/camel-memchunk.h>
+
+/* Standard GObject macros */
+#define CAMEL_TYPE_SEXP \
+	(camel_sexp_get_type ())
+#define CAMEL_SEXP(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), CAMEL_TYPE_SEXP, CamelSExp))
+#define CAMEL_SEXP_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), CAMEL_TYPE_SEXP, CamelSExpClass))
+#define CAMEL_IS_SEXP(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), CAMEL_TYPE_SEXP))
+#define CAMEL_IS_SEXP_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), CAMEL_TYPE_SEXP))
+#define CAMEL_SEXP_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), CAMEL_TYPE_SEXP, CamelSExpClass))
+
+G_BEGIN_DECLS
+
+typedef struct _CamelSExp CamelSExp;
+typedef struct _CamelSExpClass CamelSExpClass;
+
+typedef struct _CamelSExpSymbol CamelSExpSymbol;
+typedef struct _CamelSExpResult CamelSExpResult;
+typedef struct _CamelSExpTerm CamelSExpTerm;
+
+/**
+ * CamelSExpResultType:
+ *
+ * Since: 3.4
+ **/
+typedef enum {
+	CAMEL_SEXP_RES_ARRAY_PTR,	/* type is a ptrarray, what it points to is implementation dependant */
+	CAMEL_SEXP_RES_INT,		/* type is a number */
+	CAMEL_SEXP_RES_STRING,		/* type is a pointer to a single string */
+	CAMEL_SEXP_RES_BOOL,		/* boolean type */
+	CAMEL_SEXP_RES_TIME,		/* time_t type */
+	CAMEL_SEXP_RES_UNDEFINED	/* unknown type */
+} CamelSExpResultType;
+
+/**
+ * CamelSExpResult:
+ *
+ * Since: 3.4
+ **/
+struct _CamelSExpResult {
+	CamelSExpResultType type;
+	union {
+		GPtrArray *ptrarray;
+		gint number;
+		gchar *string;
+		gint boolean;
+		time_t time;
+	} value;
+	gboolean time_generator;
+	time_t occuring_start;
+	time_t occuring_end;
+};
+
+/**
+ * CamelSExpFunc:
+ *
+ * Since: 3.4
+ **/
+typedef CamelSExpResult *
+			(*CamelSExpFunc)	(CamelSExp *sexp,
+						 gint argc,
+						 CamelSExpResult **argv,
+						 gpointer data);
+
+/**
+ * CamelSExpIFunc:
+ *
+ * Since: 3.4
+ **/
+typedef CamelSExpResult *
+			(*CamelSExpIFunc)	(CamelSExp *sexp, gint argc,
+						 CamelSExpTerm **argv,
+						 gpointer data);
+
+/**
+ * CamelSExpTermType:
+ *
+ * Since: 3.4
+ **/
+typedef enum {
+	CAMEL_SEXP_TERM_INT,	/* integer literal */
+	CAMEL_SEXP_TERM_BOOL,	/* boolean literal */
+	CAMEL_SEXP_TERM_STRING,	/* string literal */
+	CAMEL_SEXP_TERM_TIME,	/* time_t literal (number of seconds past the epoch) */
+	CAMEL_SEXP_TERM_FUNC,	/* normal function, arguments are evaluated before calling */
+	CAMEL_SEXP_TERM_IFUNC,	/* immediate function, raw terms are arguments */
+	CAMEL_SEXP_TERM_VAR	/* variable reference */
+} CamelSExpTermType;
+
+/**
+ * CamelSExpSymbol:
+ *
+ * Since: 3.4
+ **/
+struct _CamelSExpSymbol {
+	gint type;		/* TERM_FUNC or TERM_VAR */
+	gchar *name;
+	gpointer data;
+	union {
+		CamelSExpFunc func;
+		CamelSExpIFunc ifunc;
+	} f;
+};
+
+/**
+ * CamelSExpTerm:
+ *
+ * Since: 3.4
+ **/
+struct _CamelSExpTerm {
+	CamelSExpTermType type;
+	union {
+		gchar *string;
+		gint number;
+		gint boolean;
+		time_t time;
+		struct {
+			CamelSExpSymbol *sym;
+			CamelSExpTerm **terms;
+			gint termcount;
+		} func;
+		CamelSExpSymbol *var;
+	} value;
+};
+
+/**
+ * CamelSExp:
+ *
+ * Since: 3.4
+ **/
+struct _CamelSExp {
+	GObject parent;
+	GScanner *scanner;	/* for parsing text version */
+	CamelSExpTerm *tree;	/* root of expression tree */
+
+	/* private stuff */
+	jmp_buf failenv;
+	gchar *error;
+	GSList *operators;
+
+	/* TODO: may also need a pool allocator for term strings,
+	 *       so we dont lose them in error conditions? */
+	CamelMemChunk *term_chunks;
+	CamelMemChunk *result_chunks;
+};
+
+struct _CamelSExpClass {
+	GObjectClass parent_class;
+};
+
+GType		camel_sexp_get_type		(void) G_GNUC_CONST;
+CamelSExp *	camel_sexp_new			(void);
+void		camel_sexp_add_function		(CamelSExp *sexp,
+						 guint scope,
+						 const gchar *name,
+						 CamelSExpFunc func,
+						 gpointer data);
+void		camel_sexp_add_ifunction	(CamelSExp *sexp,
+						 guint scope,
+						 const gchar *name,
+						 CamelSExpIFunc func,
+						 gpointer data);
+void		camel_sexp_add_variable		(CamelSExp *sexp,
+						 guint scope,
+						 gchar *name,
+						 CamelSExpTerm *value);
+void		camel_sexp_remove_symbol	(CamelSExp *sexp,
+						 guint scope,
+						 const gchar *name);
+gint		camel_sexp_set_scope		(CamelSExp *sexp,
+						 guint scope);
+void		camel_sexp_input_text		(CamelSExp *sexp,
+						 const gchar *text,
+						 gint len);
+void		camel_sexp_input_file		(CamelSExp *sexp,
+						 gint fd);
+gint		camel_sexp_parse		(CamelSExp *sexp);
+CamelSExpResult *
+		camel_sexp_eval			(CamelSExp *sexp);
+CamelSExpResult *
+		camel_sexp_term_eval		(CamelSExp *sexp,
+						 CamelSExpTerm *term);
+CamelSExpResult *
+		camel_sexp_result_new		(CamelSExp *sexp,
+						 gint type);
+void		camel_sexp_result_free		(CamelSExp *sexp,
+						 CamelSExpResult *term);
+
+/* used in normal functions if they have to abort, to free their arguments */
+void		camel_sexp_resultv_free		(CamelSExp *sexp,
+						 gint argc,
+						 CamelSExpResult **argv);
+
+/* utility functions for creating s-exp strings. */
+void		camel_sexp_encode_bool		(GString *string,
+						 gboolean v_bool);
+void		camel_sexp_encode_string	(GString *string,
+						 const gchar *v_string);
+
+/* only to be called from inside a callback to signal a fatal execution error */
+void		camel_sexp_fatal_error		(CamelSExp *sexp,
+						 const gchar *why,
+						 ...) G_GNUC_NORETURN;
+
+/* return the error string */
+const gchar *	camel_sexp_error		(CamelSExp *sexp);
+
+CamelSExpTerm *	camel_sexp_parse_value		(CamelSExp *sexp);
+
+gboolean	camel_sexp_evaluate_occur_times	(CamelSExp *sexp,
+						 time_t *start,
+						 time_t *end);
+
+G_END_DECLS
+
+#endif /* CAMEL_SEXP_H */
diff --git a/camel/camel.h b/camel/camel.h
index c110694..93dc3c9 100644
--- a/camel/camel.h
+++ b/camel/camel.h
@@ -114,6 +114,7 @@
 #include <camel/camel-service.h>
 #include <camel/camel-session.h>
 #include <camel/camel-settings.h>
+#include <camel/camel-sexp.h>
 #include <camel/camel-smime-context.h>
 #include <camel/camel-store.h>
 #include <camel/camel-store-settings.h>
diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c
index 9cf2754..6103b47 100644
--- a/camel/providers/imap/camel-imap-search.c
+++ b/camel/providers/imap/camel-imap-search.c
@@ -89,7 +89,7 @@ struct _match_record {
 	GArray *matches;
 };
 
-static ESExpResult *imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+static CamelSExpResult *imap_body_contains (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, CamelFolderSearch *s);
 
 G_DEFINE_TYPE (CamelImapSearch, camel_imap_search, CAMEL_TYPE_FOLDER_SEARCH)
 
@@ -187,7 +187,7 @@ camel_imap_search_new (const gchar *cachedir)
 static void
 hash_match (gchar hash[17],
             gint argc,
-            struct _ESExpResult **argv)
+            struct _CamelSExpResult **argv)
 {
 	GChecksum *checksum;
 	guint8 *digest;
@@ -200,7 +200,7 @@ hash_match (gchar hash[17],
 
 	checksum = g_checksum_new (G_CHECKSUM_MD5);
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING)
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 			g_checksum_update (
 				checksum, (guchar *) argv[i]->value.string, -1);
 	}
@@ -264,7 +264,7 @@ static struct _match_record *
 load_match (CamelImapSearch *is,
             gchar hash[17],
             gint argc,
-            struct _ESExpResult **argv)
+            struct _CamelSExpResult **argv)
 {
 	struct _match_record *mr;
 	CamelStream *stream = NULL;
@@ -277,7 +277,7 @@ load_match (CamelImapSearch *is,
 	strcpy (mr->hash, hash);
 	mr->terms = g_malloc0 (sizeof (mr->terms[0]) * argc);
 	for (i = 0; i < argc; i++) {
-		if (argv[i]->type == ESEXP_RES_STRING) {
+		if (argv[i]->type == CAMEL_SEXP_RES_STRING) {
 			mr->termcount++;
 			mr->terms[i] = g_strdup (argv[i]->value.string);
 		}
@@ -396,7 +396,7 @@ sync_match (CamelImapSearch *is,
 static struct _match_record *
 get_match (CamelImapSearch *is,
            gint argc,
-           struct _ESExpResult **argv)
+           struct _CamelSExpResult **argv)
 {
 	gchar hash[17];
 	struct _match_record *mr;
@@ -432,17 +432,17 @@ get_match (CamelImapSearch *is,
 	return mr;
 }
 
-static ESExpResult *
-imap_body_contains (struct _ESExp *f,
+static CamelSExpResult *
+imap_body_contains (struct _CamelSExp *f,
                     gint argc,
-                    struct _ESExpResult **argv,
+                    struct _CamelSExpResult **argv,
                     CamelFolderSearch *s)
 {
 	CamelStore *parent_store;
 	CamelImapStore *store;
 	CamelImapSearch *is = (CamelImapSearch *) s;
 	gchar *uid;
-	ESExpResult *r;
+	CamelSExpResult *r;
 	GHashTable *uid_hash = NULL;
 	GPtrArray *array;
 	gint i, j;
@@ -463,10 +463,10 @@ imap_body_contains (struct _ESExp *f,
 	/* optimise the match "" case - match everything */
 	if (argc == 1 && argv[0]->value.string[0] == '\0') {
 		if (s->current) {
-			r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 			r->value.boolean = TRUE;
 		} else {
-			r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 			r->value.ptrarray = g_ptr_array_new ();
 			for (i = 0; i < s->summary->len; i++) {
 				g_ptr_array_add (r->value.ptrarray, (gchar *) g_ptr_array_index (s->summary, i));
@@ -475,10 +475,10 @@ imap_body_contains (struct _ESExp *f,
 	} else if (argc == 0 || s->summary->len == 0) {
 		/* nothing to match case, do nothing (should be handled higher up?) */
 		if (s->current) {
-			r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 			r->value.boolean = FALSE;
 		} else {
-			r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 			r->value.ptrarray = g_ptr_array_new ();
 		}
 	} else {
@@ -496,10 +496,10 @@ imap_body_contains (struct _ESExp *f,
 			j = mr->matches->len;
 			for (i = 0; i < j && !truth; i++)
 				truth = *uidp++ == uidn;
-			r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
 			r->value.boolean = truth;
 		} else {
-			r = e_sexp_result_new (f, ESEXP_RES_ARRAY_PTR);
+			r = camel_sexp_result_new (f, CAMEL_SEXP_RES_ARRAY_PTR);
 			array = r->value.ptrarray = g_ptr_array_new ();
 
 			/* We use a hash to map the uid numbers to uid strings as required by the search api */
diff --git a/docs/reference/camel/camel-docs.sgml b/docs/reference/camel/camel-docs.sgml
index 2d9fb7e..20b7e03 100644
--- a/docs/reference/camel/camel-docs.sgml
+++ b/docs/reference/camel/camel-docs.sgml
@@ -191,6 +191,7 @@
       <xi:include href="xml/camel-net-utils.xml"/>
       <xi:include href="xml/camel-search-sql.xml"/>
       <xi:include href="xml/camel-search-sql-sexp.xml"/>
+      <xi:include href="xml/camel-sexp.xml"/>
       <xi:include href="xml/camel-string-utils.xml"/>
       <xi:include href="xml/camel-trie.xml"/>
       <xi:include href="xml/camel-uid-cache.xml"/>
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index 802fa3a..cbb0248 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -2090,6 +2090,49 @@ camel_settings_get_type
 </SECTION>
 
 <SECTION>
+<FILE>camel-sexp</FILE>
+<TITLE>CamelSExp</TITLE>
+CamelSExp
+CamelSExpSymbol
+CamelSExpResult
+CamelSExpTerm
+CamelSExpResultType
+CamelSExpFunc
+CamelSExpIFunc
+CamelSExpTermType
+camel_sexp_new
+camel_sexp_add_function
+camel_sexp_add_ifunction
+camel_sexp_add_variable
+camel_sexp_remove_symbol
+camel_sexp_set_scope
+camel_sexp_input_text
+camel_sexp_input_file
+camel_sexp_parse
+camel_sexp_eval
+camel_sexp_term_eval
+camel_sexp_result_new
+camel_sexp_result_free
+camel_sexp_resultv_free
+camel_sexp_encode_bool
+camel_sexp_encode_string
+camel_sexp_fatal_error
+camel_sexp_error
+camel_sexp_parse_value
+camel_sexp_evaluate_occur_times
+<SUBSECTION Standard>
+CAMEL_SEXP
+CAMEL_IS_SEXP
+CAMEL_TYPE_SEXP
+CAMEL_SEXP_CLASS
+CAMEL_IS_SEXP_CLASS
+CAMEL_SEXP_GET_CLASS
+CamelSExpClass
+<SUBSECTION Private>
+camel_sexp_get_type
+</SECTION>
+
+<SECTION>
 <FILE>camel-smime-context</FILE>
 <TITLE>CamelSMIMEContext</TITLE>
 CamelSMIMEContext
diff --git a/docs/reference/camel/camel.types b/docs/reference/camel/camel.types
index 70e8aa3..7f2932c 100644
--- a/docs/reference/camel/camel.types
+++ b/docs/reference/camel/camel.types
@@ -69,6 +69,7 @@ camel_sasl_popb4smtp_get_type
 camel_service_get_type
 camel_session_get_type
 camel_settings_get_type
+camel_sexp_get_type
 camel_smime_context_get_type
 camel_store_get_type
 camel_store_settings_get_type



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]