aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-arg.h
diff options
context:
space:
mode:
Diffstat (limited to 'camel/camel-arg.h')
-rw-r--r--camel/camel-arg.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/camel/camel-arg.h b/camel/camel-arg.h
new file mode 100644
index 0000000000..7846018149
--- /dev/null
+++ b/camel/camel-arg.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Author:
+ * Michael Zucchi <notzed@ximian.com>
+ *
+ * Copyright 2002 Ximian, Inc. (www.ximian.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#ifndef CAMEL_ARG_H
+#define CAMEL_ARG_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus } */
+
+#include <glib.h>
+#include <stdarg.h>
+
+enum camel_arg_t {
+ CAMEL_ARG_END = 0,
+ CAMEL_ARG_IGNORE = 1, /* override/ignore an arg in-place */
+
+ CAMEL_ARG_FIRST = 1024, /* 1024 args reserved for arg system */
+
+ CAMEL_ARG_TYPE = 0xf0000000, /* type field for tags */
+ CAMEL_ARG_TAG = 0x0fffffff, /* tag field for args */
+
+ CAMEL_ARG_OBJ = 0x00000000, /* object */
+ CAMEL_ARG_INT = 0x10000000, /* int */
+ CAMEL_ARG_DBL = 0x20000000, /* double */
+ CAMEL_ARG_STR = 0x30000000, /* c string */
+ CAMEL_ARG_PTR = 0x40000000, /* ptr */
+};
+
+typedef struct _CamelArg CamelArg;
+typedef struct _CamelArgV CamelArgV;
+
+typedef struct _CamelArgGet CamelArgGet;
+typedef struct _CamelArgGetV CamelArgGetV;
+
+struct _CamelArg {
+ guint32 tag;
+ union {
+ void *ca_object;
+ int ca_int;
+ double ca_double;
+ char *ca_str;
+ void *ca_ptr;
+ } u;
+};
+struct _CamelArgGet {
+ guint32 tag;
+ union {
+ void **ca_object;
+ int *ca_int;
+ double *ca_double;
+ char **ca_str;
+ void **ca_ptr;
+ } u;
+};
+#define ca_object u.ca_object
+#define ca_int u.ca_int
+#define ca_double u.ca_double
+#define ca_str u.ca_str
+#define ca_ptr u.ca_ptr
+
+/* maximum no of args processed at any one time, not the max of all args */
+#define CAMEL_ARGV_MAX (20)
+
+struct _CamelArgV {
+ va_list ap;
+ int argc;
+ CamelArg argv[CAMEL_ARGV_MAX];
+};
+
+struct _CamelArgGetV {
+ va_list ap;
+ int argc;
+ CamelArgGet argv[CAMEL_ARGV_MAX];
+};
+
+#define camel_argv_start(tv, last) (va_start((tv)->ap, last))
+#define camel_argv_end(tv) (va_end((tv)->ap))
+int camel_argv_build(CamelArgV *tv);
+int camel_arggetv_build(CamelArgGetV *tv);
+
+/* set an arg ignored */
+#define camel_argv_ignore(tv, i) ((tv)->argv[i].tag = ((tv)->argv[i].tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE)
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* CAMEL_ARG_H */