summaryrefslogtreecommitdiffhomepage
path: root/include/stc/algo/cco.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/stc/algo/cco.h')
-rw-r--r--include/stc/algo/cco.h34
1 files changed, 16 insertions, 18 deletions
diff --git a/include/stc/algo/cco.h b/include/stc/algo/cco.h
index fdb8ece3..c94382b1 100644
--- a/include/stc/algo/cco.h
+++ b/include/stc/algo/cco.h
@@ -99,38 +99,36 @@
* `c_' macros for re-entrant coroutines.
*/
typedef struct {
- int _ccoline;
+ int cco_line;
} *cco_handle;
-#define cco_context(cref, ...) \
+#define cco_context(handle, ...) \
struct ccoContext { \
- int _ccoline; \
+ int cco_line; \
__VA_ARGS__ \
- } **_ccoparam = (struct ccoContext **)cref
+ } **_ccoparam = (struct ccoContext **)handle + 0*sizeof((*(handle))->cco_line)
#define cco_routine(ctx, ...) \
- do { \
- if (!*_ccoparam) { \
- *_ccoparam = malloc(sizeof **_ccoparam); \
- (*_ccoparam)->_ccoline = 0; \
- } \
- struct ccoContext *ctx = *_ccoparam; \
- switch (ctx->_ccoline) { \
- case 0: __VA_ARGS__ break; \
- default: assert(!"cco_finish: missing"); \
- } \
- free(ctx), *_ccoparam = 0; \
- } while (0)
+ if (!*_ccoparam) { \
+ *_ccoparam = (struct ccoContext *)malloc(sizeof **_ccoparam); \
+ (*_ccoparam)->cco_line = 0; \
+ } \
+ struct ccoContext *ctx = *_ccoparam; \
+ switch (ctx->cco_line) { \
+ case 0: __VA_ARGS__ break; \
+ default: assert(!"cco_finish: missing"); \
+ } \
+ free(ctx), *_ccoparam = NULL
#define cco_yield(ret) \
do { \
- (*_ccoparam)->_ccoline = __LINE__; return ret; \
+ (*_ccoparam)->cco_line = __LINE__; return ret; \
case __LINE__:; \
} while (0)
#define cco_finish case -1
#define cco_stop(ctx) \
- ((*(ctx))->_ccoline = -1, (ctx))
+ ((*(ctx))->cco_line = -1, (ctx))
#endif /* COROUTINE_H */