summaryrefslogtreecommitdiff
path: root/src/async-io-coroutine.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/async-io-coroutine.h')
-rw-r--r--src/async-io-coroutine.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/async-io-coroutine.h b/src/async-io-coroutine.h
new file mode 100644
index 0000000..125d84e
--- /dev/null
+++ b/src/async-io-coroutine.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2008 Evenflow, Inc.
+ *
+ * async-io-coroutine.h
+ * Macros to simplify writing coroutines for the glib main loop.
+ *
+ * This file is part of nautilus-dropbox.
+ *
+ * nautilus-dropbox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * nautilus-dropbox 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 nautilus-dropbox. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef ASYNC_IO_COROUTINE_H
+#define ASYNC_IO_COROUTINE_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define CRBEGIN(pos) switch (pos) { case 0:
+#define CREND } return FALSE
+#define CRYIELD(pos) do { pos = __LINE__; return TRUE; case __LINE__:;} while (0)
+#define CRHALT return FALSE
+
+#define CRREADLINE(pos, chan, where) \
+ while (1) { \
+ gchar *__line; \
+ gsize __line_length, __newline_pos; \
+ GIOStatus __iostat; \
+ \
+ __iostat = g_io_channel_read_line(chan, &__line, \
+ &__line_length, \
+ &__newline_pos, NULL); \
+ if (__iostat == G_IO_STATUS_AGAIN) { \
+ CRYIELD(pos); \
+ } \
+ else if (__iostat == G_IO_STATUS_NORMAL) { \
+ *(__line + __newline_pos) = '\0'; \
+ where = __line; \
+ break; \
+ } \
+ else if (__iostat == G_IO_STATUS_EOF || \
+ __iostat == G_IO_STATUS_ERROR) { \
+ CRHALT; \
+ } \
+ else { \
+ g_assert_not_reached(); \
+ CRHALT; \
+ } \
+ }
+
+G_END_DECLS
+
+#endif