# HG changeset patch # User kent # Date 1255600059 -32400 # Node ID f37d7058d1ce6514300ab1da9923b2a2ae38aabb # Parent 775dfe89866275a860795162195fd89b1440e612 bit modifing. diff -r 775dfe898662 -r f37d7058d1ce CbC-examples/quicksort/quicksort_cbc.cbc --- a/CbC-examples/quicksort/quicksort_cbc.cbc Wed Oct 14 12:12:51 2009 +0900 +++ b/CbC-examples/quicksort/quicksort_cbc.cbc Thu Oct 15 18:47:39 2009 +0900 @@ -6,19 +6,22 @@ typedef struct { int size; void *interface; - void (*code)(void*, stack); + __code (*code)(void*, stack); } frame, *framep; /* quickstart main routine. */ -struct qs_if { +typedef struct { int *v; int s; int e; -}; +} QS_IF ; typedef __code (*RET)(void*); #include"quicksort_cbc.h" +/* for check. */ +void *mustbefreed; + __code returner(stack sp) { framep fp = (framep)sp; @@ -28,7 +31,7 @@ __code quicksort_start(void *arg, stack sp) { - struct qs_if *recvif = arg; + QS_IF *recvif = arg; int a,b,c,p; a = recvif->v[recvif->s]; b = recvif->v[recvif->e]; @@ -58,11 +61,11 @@ /* main routine end. */ /* divide routine. */ -__code quicksort_divider(struct qs_if *recvif, int s, int e, int p, stack sp) +__code quicksort_divider(QS_IF *recvif, int s, int e, int p, stack sp) { goto quicksort_divider_s(recvif, s, e, p, sp); } -__code quicksort_divider_s(struct qs_if *recvif, int s, int e, int p, stack sp) +__code quicksort_divider_s(QS_IF *recvif, int s, int e, int p, stack sp) { if (recvif->v[s]v[e]) { e--; @@ -78,7 +81,7 @@ } else goto quicksort_swapper(recvif, s, e, p, sp); } -__code quicksort_swapper(struct qs_if *recvif, int s, int e, int p, stack sp) +__code quicksort_swapper(QS_IF *recvif, int s, int e, int p, stack sp) { if (sv = recvif->v; outif->s = recvif->s; outif->e = e; fp = (sp-=sizeof(frame)); fp->code = quicksort_start; fp->interface = recvif; - fp->size = sizeof(frame)+sizeof(struct qs_if); + fp->size = sizeof(frame)+sizeof(QS_IF); /* recvif is used by second quicksort_start. */ recvif->s = e+1; @@ -119,29 +122,31 @@ /* recursive call routine end. */ #define STACK_SIZE 10240 -int v[100]; -struct qs_if *outif; -struct qs { +typedef struct { __code (*ret)(void*); void *ret_arg; stack *sp; -}; +} QS_FINISH; __code quicksort(int *v, int s, int e, RET ret, void *arg ) { framep fp; - stack sp = malloc(STACK_SIZE)+STACK_SIZE; - struct qs *finish_if; + stack sp0, sp; + sp0 = malloc(STACK_SIZE); + mustbefreed = sp0; + sp = sp0 + STACK_SIZE; + QS_FINISH *finish_if; + QS_IF *outif; /* interface for quicksort_finish. */ - finish_if = (sp -= sizeof(*finish_if)); + finish_if = (sp -= sizeof(QS_FINISH)); finish_if->ret = ret; finish_if->ret_arg = arg; - finish_if->sp = sp -STACK_SIZE + sizeof(*finish_if); + finish_if->sp = sp0; /* interface for quicksort_start. */ - outif = (sp -= sizeof(*outif)); + outif = (sp -= sizeof(QS_IF)); outif->v = v; outif->s = s; outif->e = e; @@ -149,14 +154,15 @@ fp = (sp -= sizeof(frame)); fp->code = quicksort_finish; fp->interface = finish_if; - fp->size = sizeof(frame)+sizeof(outif); + fp->size = sizeof(frame)+sizeof(QS_IF); goto quicksort_start(outif, sp); } __code quicksort_finish(void *arg, stack sp) { - struct qs interface = *(struct qs*)arg; + QS_FINISH interface = *(QS_FINISH*)arg; + assert(interface.sp==mustbefreed); free(interface.sp); goto interface.ret(interface.ret_arg); }