From 25d3a00cf37496f5be2f8a7f1aea42fc4d596ab2 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sat, 25 Feb 2023 12:09:11 +0100 Subject: Renamed algo/ccoro.h => algo/coroutine.h. Using cco_ as prefix. Changed ccoro_execute(c) => cco_begin(c); ... cco_end(); (was required). --- misc/examples/coread.c | 18 ++++++------- misc/examples/coroutines.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ misc/examples/cosub.c | 65 -------------------------------------------- 3 files changed, 76 insertions(+), 74 deletions(-) create mode 100644 misc/examples/coroutines.c delete mode 100644 misc/examples/cosub.c (limited to 'misc/examples') diff --git a/misc/examples/coread.c b/misc/examples/coread.c index a3eac7f9..6b0bfb37 100644 --- a/misc/examples/coread.c +++ b/misc/examples/coread.c @@ -1,30 +1,30 @@ #include -#include +#include #include // Read file line by line using coroutines: struct file_nextline { const char* filename; - int ccoro_state; + int cco_state; FILE* fp; cstr line; }; cstr file_nextline(struct file_nextline* U) { - ccoro_execute(U, + cco_begin(U) U->fp = fopen(U->filename, "r"); U->line = cstr_NULL; while (cstr_getline(&U->line, U->fp)) - ccoro_yield (cstr_clone(U->line)); + cco_yield(cstr_clone(U->line)); - ccoro_final: // ccoro_final is needed to support ccoro_stop. + cco_final: // cco_final is needed to support cco_stop. printf("finish\n"); cstr_drop(&U->line); fclose(U->fp); - ); + cco_end(); return cstr_NULL; } @@ -33,11 +33,11 @@ int main(void) { struct file_nextline z = {__FILE__}; int n = 0; do { - c_with (cstr line = file_nextline(&z), ccoro_alive(&z), cstr_drop(&line)) { + c_with (cstr line = file_nextline(&z), cco_alive(&z), cstr_drop(&line)) { printf("%3d %s\n", ++n, cstr_str(&line)); // stop after 15 lines: - if (n == 15) file_nextline(ccoro_stop(&z)); + if (n == 15) file_nextline(cco_stop(&z)); } - } while (ccoro_alive(&z)); + } while (cco_alive(&z)); } diff --git a/misc/examples/coroutines.c b/misc/examples/coroutines.c new file mode 100644 index 00000000..d3295102 --- /dev/null +++ b/misc/examples/coroutines.c @@ -0,0 +1,67 @@ +#include +#include +#include + +// Use coroutine to create a fibonacci sequence generator: + +typedef long long intll_t; + +struct fibonacci { + int n; + int cco_state; + intll_t a, b, idx; +}; + +intll_t fibonacci(struct fibonacci* F) { + assert (F->n < 95); + + cco_begin(F); + F->a = 0; + F->b = 1; + for (F->idx = 0; F->idx < F->n; F->idx++) { + cco_yield(F->a); + intll_t sum = F->a + F->b; // NB! locals only lasts until next cco_yield! + F->a = F->b; + F->b = sum; + } + cco_final: + cco_end(); + + return -1; +} + +// Demonstrate to call another coroutine from a coroutine: +// Create a 2D iterator, and call fibonacci sequence when x,y = 1,1: + +struct iterate { + int max_x, max_y; + int cco_state; + int x, y; +}; + +bool iterate(struct iterate* I, struct fibonacci* F) { + cco_begin(I); + for (I->x = 0; I->x < I->max_x; I->x++) { + for (I->y = 0; I->y < I->max_y; I->y++) { + if (I->x == 1 && I->y == 1) + cco_yield_coroutine(F, fibonacci(F), true); + else + cco_yield(true); + } + } + cco_final: + cco_end(); + return false; +} + + +int main(void) { + printf("Fibonacci numbers:\n"); + struct fibonacci fib = {.n = 14}; + struct iterate iter = {3, 3}; + + while (iterate(&iter, &fib)) + printf("%d %d. Fib: %lld\n", iter.x, iter.y, fib.a); + + puts(""); +} diff --git a/misc/examples/cosub.c b/misc/examples/cosub.c deleted file mode 100644 index 87dcb9a1..00000000 --- a/misc/examples/cosub.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include - -// Use coroutine to create a fibonacci sequence generator: - -typedef long long intll_t; - -struct fibonacci { - int n; - int ccoro_state; - intll_t a, b, idx; -}; - -intll_t fibonacci(struct fibonacci* F) { - assert (F->n < 95); - - ccoro_execute(F, - F->a = 0; - F->b = 1; - for (F->idx = 0; F->idx < F->n; F->idx++) { - ccoro_yield (F->a); - intll_t sum = F->a + F->b; // NB! locals only lasts until next ccoro_yield! - F->a = F->b; - F->b = sum; - } - ccoro_final: - ); - - return -1; -} - -// Demonstrate to call another coroutine from a coroutine: -// Create a 2D iterator, and call fibonacci sequence when x,y = 1,1: - -struct iterate { - int max_x, max_y; - int ccoro_state; - int x, y; -}; - -bool iterate(struct iterate* I, struct fibonacci* F) { - ccoro_execute(I, - for (I->x = 0; I->x < I->max_x; I->x++) - for (I->y = 0; I->y < I->max_y; I->y++) - if (I->x == 1 && I->y == 1) - ccoro_yield_call (F, fibonacci(F), true); - else - ccoro_yield (true); - ccoro_final: - ); - return false; -} - - -int main(void) { - printf("Fibonacci numbers:\n"); - struct fibonacci fib = {.n = 14}; - struct iterate iter = {3, 3}; - - while (iterate(&iter, &fib)) - printf("%d %d. Fib: %lld\n", iter.x, iter.y, fib.a); - - puts(""); -} -- cgit v1.2.3