view src/list/list.c @ 13:a765eb7f3b7c

implement delete, traverse
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 07 Apr 2015 15:39:14 +0900
parents
children c3314208d7b9
line wrap: on
line source

#include <stdlib.h>
#include <stdio.h>

#include "prototype.h"

#include "context.h"
#include "allocate.h"
#include "origin_cs.h"

__code code1(Context* context) {
    goto meta_code1(context, allocate);
}

__code meta_code1(Context* context, __code (*next)()) {
    context->next = next;
    goto context->next(context, (int)sizeof(data1), 1, code2);
}

__code code2(Context* context, data1* ds) {
    ds->value = 1024;
    goto meta_code2(context, ds);
}

__code meta_code2(Context* context, data1* ds) {
    mdata* mds = (mdata*)context->mds-1;
    context->head = mds;
    mds->next = 0;
    goto append(context, code3);
}

__code append(Context* context, __code (*next)()) {
    goto meta_append(context, (mdata*)context->head, next);
}

__code meta_append(Context* context, mdata* mds, __code (*next)()) {
    if (mds->next)
        goto meta_append(context, mds->next, next);
    mds->next = context->mds;
    goto allocate(context, (int)sizeof(data1), 1, next);
}

__code code3(Context* context, data1* ds) {
    ds->value = 10;
    goto meta_code3(context);
}

__code meta_code3(Context* context) {
    goto append(context, code4);
}

__code code4(Context* context, data1* ds) {
    goto meta_code4(context);
}

__code meta_code4(Context* context) {
    goto traverse(context, code5);
}

__code traverse(Context* context, __code (*next)()) {
    goto meta_traverse(context, (mdata*)context->head, next);
}

__code meta_traverse(Context* context, mdata* mds, __code (*next)()) {
    printf("current value in list is %d\n", ((data1*)mds->ds)->value);
    if (mds->next)
        goto meta_traverse(context, mds->next, next);
    goto next(context);
}

__code code5(Context* context) {
    goto meta_code5(context);
}

__code meta_code5(Context* context) {
    goto delete(context, code6);
}

__code delete(Context* context, __code (*next)()) {
    goto meta_delete(context, (mdata*)context->head, next);
}

__code meta_delete(Context* context, mdata* head, __code (*next)()) {
    context->head = (head->next) ? head->next : 0;
    goto next(context);
}

__code code6(Context* context) {
    printf("after delete\n");
    goto meta_code6(context);
}

__code meta_code6(Context* context) {
    goto traverse(context, exit_code);
}

int main() {
    Context* context = (Context*)malloc(sizeof(Context));
    context->ds_heap = malloc(sizeof(data1)*1024);
    context->mds_heap = malloc(sizeof(mdata)*1024);
    context->ds = context->ds_heap;
    context->mds = context->mds_heap;
    goto start_code(context, code1);
}