# HG changeset patch # User Shohei KOKUBO # Date 1434429626 -32400 # Node ID 8c709b714fb07749691b9f2e59aeb1c028a441c2 # Parent c469c5ed5b4dea6b9ec3f2fc5da7cac15acd3162# Parent 2ff693c5563ca8550f9da7e51ee9a842f9831dc6 merge diff -r c469c5ed5b4d -r 8c709b714fb0 src/list/list.c --- a/src/list/list.c Tue Jun 16 13:40:08 2015 +0900 +++ b/src/list/list.c Tue Jun 16 13:40:26 2015 +0900 @@ -8,88 +8,121 @@ extern __code initListContext(struct Context* context); -__code code1(struct Context* context) { - context->data[Allocate]->allocate.size = sizeof(struct Element); - context->data[Allocate]->allocate.next = Code2; +__code code1(struct Context* context, struct Allocate *allocate) { + allocate->size = sizeof(struct Element); + allocate->next = Code2; goto meta(context, Allocator); } +__code code1_stub(struct Context* context) { + goto code1(context, &context->data[Allocate]->allocate); +} + __code meta(struct Context* context, enum Code next) { goto (context->code[next])(context); } -__code meta_code2(struct Context* context, enum Code next) { - context->data[List]->list.head = context->data[context->dataNum]; - context->data[List]->list.tail = context->data[List]->list.head; - context->data[context->dataNum]->element.next = 0; - goto (context->code[next])(context); -} - -__code code2(struct Context* context) { - context->data[context->dataNum] -> element.value = 1024; - context->data[Allocate]->allocate.size = sizeof(struct Element); - context->data[Allocate]->allocate.next = Code3; - goto meta_code2(context, Allocator); -} - -__code code3(struct Context* context) { - context->data[Allocate]->allocate.after_append = Code4; - context->data[context->dataNum] -> element.value = 10; +__code code2(struct Context* context, struct Allocate* allocate, struct Element* element) { + allocate->after_append = Code3; + element ->value = 10; goto meta(context, Append); } -__code meta_append(struct Context* context, enum Code next) { - context->data[List]->list.tail->element.next = context->data[context->dataNum]; - context->data[List]->list.tail = context->data[List]->list.tail->element.next; - context->data[List]->list.tail->element.next = 0; - goto (context->code[next])(context); +__code code2_stub(struct Context* context) { + goto code2(context, &context->data[Allocate]->allocate, &context->data[context->dataNum]->element); } -__code append(struct Context* context) { - goto meta_append(context, context->data[Allocate]->allocate.after_append); + +__code append(struct Context* context, struct Allocate* allocate, struct List* list, struct Element* element) { + if(list->head) { + list->tail->next = element; + } else { + list->head = element; + } + list->tail = element; + list->tail->next = 0; + goto meta(context, allocate->after_append); } -__code meta_traverse(struct Context* context, enum Code next) { - printf("current value in list is %d\n", context->data[List]->list.current->element.value); - if (context->data[List]->list.current->element.next) { - context->data[List]->list.current = context->data[List]->list.current->element.next; - goto meta_traverse(context, next); +__code append_stub(struct Context* context) { + goto append(context,&context->data[Allocate]->allocate, &context->data[List]->list, &context->data[context->dataNum]->element); +} + +__code code3(struct Context* context, struct Allocate *allocate) { + allocate->size = sizeof(struct Element); + allocate->next = Code4; + goto meta(context, Allocator); +} + +__code code3_stub(struct Context* context) { + goto code3(context, &context->data[Allocate]->allocate); +} + +__code code4(struct Context* context, struct Allocate* allocate, struct Element* element) { + allocate->after_append = Code5; + element ->value = 100; + goto meta(context, Append); +} + +__code code4_stub(struct Context* context) { + goto code4(context, &context->data[Allocate]->allocate, &context->data[context->dataNum]->element); +} + +__code meta_traverse(struct Context* context, struct List* list, enum Code next) { + printf("current value in list is %d\n", list->current->value); + if (list->current->next) { + list->current = list->current->next; + goto meta_traverse(context, list, next); } goto (context->code[next])(context); } -__code traverse(struct Context* context) { - context->data[List]->list.current = context->data[List]->list.head; - goto meta_traverse(context, context->data[Allocate]->allocate.after_traverse); +__code traverse(struct Context* context, struct Allocate* allocate, struct List* list) { + list->current = list->head; + goto meta_traverse(context, list, allocate->after_traverse); } -__code code4(struct Context* context) { - context->data[Allocate]->allocate.after_traverse = Code5; +__code traverse_stub(struct Context* context) { + goto traverse(context, &context->data[Allocate]->allocate, &context->data[List]->list); +} + +__code code5(struct Context* context, struct Allocate* allocate) { + allocate->after_traverse = Code6; goto meta(context, Traverse); } +__code code5_stub(struct Context* context) { + goto code5(context, &context->data[Allocate]->allocate); +} -__code code5(struct Context* context) { - context->data[Allocate]->allocate.after_delete = Code6; +__code code6(struct Context* context, struct Allocate* allocate) { + allocate->after_delete = Code7; goto meta(context, Delete); } -__code meta_delete(struct Context* context, enum Code next) { - context->data[List]->list.head = (context->data[List]->list.head->element.next) ? context->data[List]->list.head->element.next : 0; - goto (context->code[next])(context); +__code code6_stub(struct Context* context) { + goto code6(context, &context->data[Allocate]->allocate); } -__code delete(struct Context* context) { - goto meta_delete(context, context->data[Allocate]->allocate.after_delete); +__code delete(struct Context* context, struct Allocate* allocate, struct List* list) { + list->head = (list->head->next) ? list->head->next : 0; + goto meta(context, allocate->after_delete); } -__code code6(struct Context* context) { +__code delete_stub(struct Context* context) { + goto delete(context, &context->data[Allocate]->allocate, &context->data[List]->list); +} + +__code code7(struct Context* context, struct Allocate* allocate) { printf("after delete\n"); - context->data[Allocate]->allocate.after_traverse = Exit; + allocate->after_traverse = Exit; goto meta(context, Traverse); } +__code code7_stub(struct Context* context) { + goto code7(context, &context->data[Allocate]->allocate); +} int main() { struct Context* context = (struct Context*)malloc(sizeof(struct Context)); diff -r c469c5ed5b4d -r 8c709b714fb0 src/list/listContext.c --- a/src/list/listContext.c Tue Jun 16 13:40:08 2015 +0900 +++ b/src/list/listContext.c Tue Jun 16 13:40:26 2015 +0900 @@ -2,17 +2,18 @@ #include "listContext.h" -extern __code code1(struct Context*); -extern __code code2(struct Context*); -extern __code code3(struct Context*); -extern __code code4(struct Context*); -extern __code code5(struct Context*); -extern __code code6(struct Context*); +extern __code code1_stub(struct Context*); +extern __code code2_stub(struct Context*); +extern __code code3_stub(struct Context*); +extern __code code4_stub(struct Context*); +extern __code code5_stub(struct Context*); +extern __code code6_stub(struct Context*); +extern __code code7_stub(struct Context*); extern __code meta(struct Context*); extern __code allocate(struct Context*); -extern __code append(struct Context*); -extern __code traverse(struct Context*); -extern __code delete(struct Context*); +extern __code append_stub(struct Context*); +extern __code traverse_stub(struct Context*); +extern __code delete_stub(struct Context*); extern __code exit_code(struct Context*); __code initListContext(struct Context* context) { @@ -22,16 +23,17 @@ context->heap_start = malloc(context->dataSize); context->codeNum = Exit; - context->code[Code1] = code1; - context->code[Code2] = code2; - context->code[Code3] = code3; - context->code[Code4] = code4; - context->code[Code5] = code5; - context->code[Code6] = code6; context->code[Allocator] = allocate; - context->code[Append] = append; - context->code[Traverse] = traverse; - context->code[Delete] = delete; + context->code[Code1] = code1_stub; + context->code[Code2] = code2_stub; + context->code[Code3] = code3_stub; + context->code[Code4] = code4_stub; + context->code[Code5] = code5_stub; + context->code[Code6] = code6_stub; + context->code[Code7] = code7_stub; + context->code[Append] = append_stub; + context->code[Traverse] = traverse_stub; + context->code[Delete] = delete_stub; context->code[Exit] = exit_code; context->heap = context->heap_start; diff -r c469c5ed5b4d -r 8c709b714fb0 src/list/listContext.h --- a/src/list/listContext.h Tue Jun 16 13:40:08 2015 +0900 +++ b/src/list/listContext.h Tue Jun 16 13:40:26 2015 +0900 @@ -9,6 +9,7 @@ Code4, Code5, Code6, + Code7, Allocator, Append, Traverse, @@ -35,13 +36,13 @@ union Data { long count; struct List { - union Data* head; - union Data* tail; - union Data* current; + struct Element* head; + struct Element* tail; + struct Element* current; } list; struct Element { int value; - union Data* next; + struct Element* next; } element; struct Allocate { long size;