# HG changeset patch # User Shohei KOKUBO # Date 1428388754 -32400 # Node ID a765eb7f3b7cc8ade69fe4d257d20cc5145dc1be # Parent 81411d8f9a779e2460b691428ad4f4da14ae140a implement delete, traverse diff -r 81411d8f9a77 -r a765eb7f3b7c src/include/allocate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/include/allocate.h Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,16 @@ +__code allocate(); +__code meta_allocate(); + +__code allocate(Context* context, int size, int num, __code (*next)()) { + goto meta_allocate(context, size, num, next); +} + +__code meta_allocate(Context* context, int size, int num, __code (*next)()) { + context->next = next; + void* ds = context->ds; + context->ds += size*num; + ((mdata*)context->mds)->ds = ds; + ((mdata*)context->mds)->size = size; + context->mds = (mdata*)context->mds+1; + goto context->next(context, (data1*)ds); +} diff -r 81411d8f9a77 -r a765eb7f3b7c src/include/context.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/include/context.h Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,8 @@ +typedef struct Context_st { + void* ds; + void* mds; + void* ds_heap; + void* mds_heap; + __code (*next)(); + void* head; +} Context; diff -r 81411d8f9a77 -r a765eb7f3b7c src/include/origin_cs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/include/origin_cs.h Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,18 @@ +__code start_code(); +__code meta_start_code(); +__code exit_code(); + +__code start_code(Context* context, __code (*next)()) { + goto meta_start_code(context, next); +} + +__code meta_start_code(Context* context, __code (*next)()) { + context->next = next; + goto context->next(context); +} + +__code exit_code(Context* context) { + free(context->ds_heap); + free(context->mds_heap); + goto exit(0); +} diff -r 81411d8f9a77 -r a765eb7f3b7c src/list/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/list/CMakeLists.txt Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 2.8) + +add_executable(list + list.c +) diff -r 81411d8f9a77 -r a765eb7f3b7c src/list/list.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/list/list.c Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,103 @@ +#include +#include + +#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); +} diff -r 81411d8f9a77 -r a765eb7f3b7c src/list/prototype.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/list/prototype.h Tue Apr 07 15:39:14 2015 +0900 @@ -0,0 +1,29 @@ +typedef struct DataSegment1 { + int value; // 4 byte +} data1; + +typedef struct metaDataSegment { + size_t size; // 8 byte + void* ds; // 8 byte + void* next; // 8 byte +} mdata; + +__code code1(); +__code meta_code1(); +__code code2(); +__code meta_code2(); +__code code3(); +__code meta_code3(); +__code code4(); +__code meta_code4(); +__code code5(); +__code meta_code5(); +__code code6(); +__code meta_code6(); + +__code append(); +__code meta_append(); +__code traverse(); +__code meta_traverse(); +__code delete(); +__code meta_delete();