changeset 34:c3314208d7b9

Add listContext files
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 05 May 2015 18:07:12 +0900
parents 52df093e8c28
children 2bdd8e2118c7
files doc/synchronizedQueue.graffle src/list/CMakeLists.txt src/list/list.c src/list/listContext.c src/list/listContext.h
diffstat 5 files changed, 167 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/doc/synchronizedQueue.graffle	Mon May 04 16:08:09 2015 +0900
+++ b/doc/synchronizedQueue.graffle	Tue May 05 18:07:12 2015 +0900
@@ -46,7 +46,7 @@
 	<key>Creator</key>
 	<string>Tatsuki IHA</string>
 	<key>DisplayScale</key>
-	<string>1 0/72 in = 1 0/72 in</string>
+	<string>1 0/72 in = 1.0000 in</string>
 	<key>GraphDocumentVersion</key>
 	<integer>8</integer>
 	<key>GraphicsList</key>
@@ -2243,7 +2243,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2015-05-04 07:01:14 +0000</string>
+	<string>2015-05-04 08:36:28 +0000</string>
 	<key>Modifier</key>
 	<string>Tatsuki IHA</string>
 	<key>NotesVisible</key>
@@ -2324,7 +2324,7 @@
 			</dict>
 		</array>
 		<key>Frame</key>
-		<string>{{2059, 25}, {1029, 925}}</string>
+		<string>{{615, 0}, {1029, 925}}</string>
 		<key>ListView</key>
 		<true/>
 		<key>OutlineWidth</key>
@@ -2338,7 +2338,7 @@
 		<key>SidebarWidth</key>
 		<integer>120</integer>
 		<key>VisibleRegion</key>
-		<string>{{-168, 165}, {894, 783}}</string>
+		<string>{{-168, 9.5}, {894, 783}}</string>
 		<key>Zoom</key>
 		<real>1</real>
 		<key>ZoomValues</key>
--- a/src/list/CMakeLists.txt	Mon May 04 16:08:09 2015 +0900
+++ b/src/list/CMakeLists.txt	Tue May 05 18:07:12 2015 +0900
@@ -2,4 +2,5 @@
 
 add_executable(list
                list.c
+               listContext.c
 )
--- a/src/list/list.c	Mon May 04 16:08:09 2015 +0900
+++ b/src/list/list.c	Tue May 05 18:07:12 2015 +0900
@@ -1,103 +1,101 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "prototype.h"
+#include "listContext.h"
 
-#include "context.h"
 #include "allocate.h"
 #include "origin_cs.h"
 
-__code code1(Context* context) {
-    goto meta_code1(context, allocate);
-}
+extern __code initListContext(struct Context* context);
 
-__code meta_code1(Context* context, __code (*next)()) {
-    context->next = next;
-    goto context->next(context, (int)sizeof(data1), 1, code2);
+__code code1(struct Context* context) {
+    context->data[Allocate]->allocate.size = sizeof(struct Element);
+    context->data[Allocate]->allocate.next = Code2;
+    goto meta(context, Allocator);
 }
 
-__code code2(Context* context, data1* ds) {
-    ds->value = 1024;
-    goto meta_code2(context, ds);
+__code meta(struct Context* context, enum Code next) {
+    goto (context->code[next])(context);
 }
 
-__code meta_code2(Context* context, data1* ds) {
-    mdata* mds = (mdata*)context->mds-1;
-    context->head = mds;
-    mds->next = 0;
-    goto append(context, code3);
+__code meta_code2(struct Context* context, enum Code next) {
+    context->data[List]->list.head    = context->data[context->dataNum];
+    context->data[List]->list.current = context->data[List]->list.head;
+    context->data[context->dataNum]->element.next = 0;
+    goto (context->code[next])(context);
 }
 
-__code append(Context* context, __code (*next)()) {
-    goto meta_append(context, (mdata*)context->head, next);
+__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 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(struct Context* context) {
+    context->data[Allocate]->allocate.after_append = Code4;
+    context->data[context->dataNum] -> element.value = 10;
+    goto meta(context, Append);
 }
 
-__code code3(Context* context, data1* ds) {
-    ds->value = 10;
-    goto meta_code3(context);
+__code meta_append(struct Context* context, enum Code next) {
+    if (context->data[List]->list.current->element.next) {
+        context->data[List]->list.current = context->data[List]->list.current->element.next;
+        goto meta_append(context, next);
+    }
+    context->data[List]->list.current->element.next = context->data[context->dataNum];
+    goto (context->code[next])(context);
 }
 
-__code meta_code3(Context* context) {
-    goto append(context, code4);
-}
-
-__code code4(Context* context, data1* ds) {
-    goto meta_code4(context);
+__code append(struct Context* context) {
+    context->data[List]->list.current = context->data[List]->list.head;
+    goto meta_append(context, context->data[Allocate]->allocate.after_append);
 }
 
-__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(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);
+    }
+    goto (context->code[next])(context);
 }
 
-__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 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 code5(Context* context) {
-    goto meta_code5(context);
-}
-
-__code meta_code5(Context* context) {
-    goto delete(context, code6);
+__code code4(struct Context* context) {
+    context->data[Allocate]->allocate.after_traverse = Code5;
+    goto meta(context, Traverse);
 }
 
-__code delete(Context* context, __code (*next)()) {
-    goto meta_delete(context, (mdata*)context->head, next);
+
+__code code5(struct Context* context) {
+    context->data[Allocate]->allocate.after_delete = Code6;
+    goto meta(context, Delete);
 }
 
-__code meta_delete(Context* context, mdata* head, __code (*next)()) {
-    context->head = (head->next) ? head->next : 0;
-    goto next(context);
+__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(Context* context) {
-    printf("after delete\n");
-    goto meta_code6(context);
-}
-
-__code meta_code6(Context* context) {
-    goto traverse(context, exit_code);
+__code delete(struct Context* context) {
+    goto meta_delete(context, context->data[Allocate]->allocate.after_delete);
 }
 
+__code code6(struct Context* context) {
+    printf("after delete\n");
+    context->data[Allocate]->allocate.after_traverse = Exit;
+    goto meta(context, Traverse);
+}
+
+
 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);
+    struct Context* context = (struct Context*)malloc(sizeof(struct Context));
+    initListContext(context);
+    goto start_code(context, Code1);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/list/listContext.c	Tue May 05 18:07:12 2015 +0900
@@ -0,0 +1,46 @@
+#include <stdlib.h>
+
+#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 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 exit_code(struct Context*);
+
+__code initListContext(struct Context* context) {
+    context->dataSize   = sizeof(union Data)*ALLOCATE_SIZE;
+    context->code       = malloc(sizeof(__code*)*ALLOCATE_SIZE);
+    context->data       = malloc(sizeof(union Data*)*ALLOCATE_SIZE);
+    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[Exit]      = exit_code;
+
+    context->heap = context->heap_start;
+
+    context->data[Allocate] = context->heap;
+    context->heap          += sizeof(struct Allocate);
+
+    context->data[List]     = context->heap;
+    context->heap          += sizeof(struct List);
+
+    context->dataNum = List;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/list/listContext.h	Tue May 05 18:07:12 2015 +0900
@@ -0,0 +1,52 @@
+/* Context definition for  list example */
+
+#define ALLOCATE_SIZE 100
+
+enum Code {
+    Code1,
+    Code2,
+    Code3,
+    Code4,
+    Code5,
+    Code6,
+    Allocator,
+    Append,
+    Traverse,
+    Delete,
+    Exit,
+};
+
+enum UniqueData {
+    Allocate,
+    List,
+};
+
+struct Context {
+    int codeNum;
+    __code (**code) (struct Context *);
+    void* heap_start;
+    void* heap;
+    long dataSize;
+    int dataNum;
+    union Data* head;
+    union Data** data;
+};
+
+union Data {
+    long count;
+    struct List {
+        union Data* head;
+        union Data* current;
+    } list;
+    struct Element {
+        int value;
+        union Data* next;
+    } element;
+    struct Allocate {
+        long size;
+        enum Code next;
+        enum Code after_append;
+        enum Code after_delete;
+        enum Code after_traverse;
+    } allocate;
+};