changeset 13:a765eb7f3b7c

implement delete, traverse
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 07 Apr 2015 15:39:14 +0900
parents 81411d8f9a77
children d98961bfd0f2
files src/include/allocate.h src/include/context.h src/include/origin_cs.h src/list/CMakeLists.txt src/list/list.c src/list/prototype.h
diffstat 6 files changed, 179 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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);
+}
--- /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;
--- /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);
+}
--- /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
+)
--- /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 <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);
+}
--- /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();