LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

Поскольку тебе это вообще не нужно и ты лишь хочешь поржать над убогой сишкой, то покажу лишь использование.

begin_context(simple_generator)
int val;
end_context(simple_generator)

static int next(simple_generator* gen)
{
    begin(gen);
    while(gen->val > 0) 
    {
        yield(gen, gen->val);
        --gen->val;
    }
    end(gen);
    return 0;
}

int main(void)
{
    int i;
    simple_generator gen_iter = {5};
    while((void)(i = next(&gen_iter)), 
        errno != STOP_ITERATION)
    {
        printf("%d\n", i);
    }
    errno = 0;
}

begin_context создаёт структуру, которая используется как context для генератора, никаких проблем с многопоточностью нет, так как текущее состояние хранится в структуре.

yield может быть сколько угодно между begin и end.

макрос end также устанавливает errno в STOP_ITERATION.

Работает на С89: https://imgur.com/a/tf4tnsG

Вот и всё. Обычная простая вещь из 5 макросов, которая может быть удобной.

Исходная версия fsb4000, :

Поскольку тебе это вообще не нужно и ты лишь хочешь поржать над убогой сишкой, то покажу лишь использование.

begin_context(simple_generator)
int val;
end_context(simple_generator)

static int next(simple_generator* gen)
{
    begin(gen);
    while(gen->val > 0) 
    {
        yield(gen, gen->val);
        --gen->val;
    }
    end(gen);
    return 0;
}

int main(void)
{
    int i;
    simple_generator gen_iter = {5};
    while((void)(i = next(&gen_iter)), 
        errno != STOP_ITERATION)
    {
        printf("%d\n", i);
    }
    errno = 0;
}

begin_context создаёт структуру, которая используется как context для генератора, никаких проблем с многопоточностью нет, так как текущее состояние хранится в структуре.

yield может быть сколько угодно между begin и end.

макрос end также устанавливает errno в STOP_ITERATION.

Работает на С89: https://imgur.com/a/tf4tnsG

Вот и всё. Обычная простая вещь, которая может быть удобной.