changeset 58:8c709b714fb0

merge
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 16 Jun 2015 13:40:26 +0900
parents c469c5ed5b4d (current diff) 2ff693c5563c (diff)
children e8bf3ee224e7 4e5b425922ce
files
diffstat 3 files changed, 104 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- 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));
--- 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;
--- 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;