started migration stack->tree

This commit is contained in:
2021-01-21 19:09:41 +01:00
parent 0b6c839b4d
commit 9f14b5e076
8 changed files with 649 additions and 159 deletions

166
stack.c
View File

@@ -3,6 +3,9 @@
#include <string.h>
#include "lceb.h"
static STACK *stacks=NULL;
static int nstacks=NULL;
void print_stack(stack, details)
STACK *stack;
int details;
@@ -11,77 +14,97 @@ void print_stack(stack, details)
if (details) {
printf("Stack [%s] dump: %d/%d used\n", stack->name, stack->last, stack->size);
printf("\tValue: %4d\n", stack->eval);
//printf("\tValue: %4d\n", stack->eval);
for (i=0; i<stack->last; ++i)
printf("\t%02d: Op=%s Val=%4d\n",
i, (char *)stack->stack[i].op, stack->stack[i].val);
printf("\t%02d: Val=%4d\n",
i, stack->stack[i]);
} else {
printf("Stack [%s] : ", stack->name);
for (i=0; i<stack->last; ++i) {
printf("%d[%s] ", stack->stack[i].val, (char *)stack->stack[i].op);
printf("%d ", stack->stack[i]);
}
printf("\n");
}
}
STACK *new_stack(size, name)
print_stacks()
{
STACK *stack=stacks;
printf("nstacks=%d\n", nstacks);
while (stack) {
print_stack(stack, 1);
stack=stack->next;
}
}
int keep_stack(stack)
STACK *stack;
{
stack->next=stacks;
stacks=stack;
nstacks++;
}
STACK *new_stack(size, name, keep)
int size; /* 0 if empty */
char *name;
int keep;
{
STACK *stack;
STACKELT *pelt;
int *pelt;
int i;
stack=malloc(sizeof (STACK));
stack->stack=NULL;
stack->size=0;
stack->last=0;
stack->eval=0;
//stack->eval=0;
strncpy(stack->name, name? name: "No name", sizeof(stack->name));
if (size) {
pelt=malloc(size*sizeof(STACKELT));
pelt=malloc(size*sizeof(int));
stack->size=size;
stack->stack=pelt;
if (keep)
keep_stack(stack);
for (i=0; i<size; ++i) {
(pelt+i)->nop=0;
(pelt+i)->curop=0;
(pelt+i)->op[0]=End;
(pelt+i)->val=-1;
(pelt+i)->next=i+1;
(pelt+i+1)->prev=i;
//(pelt+i)->nop=0;
//(pelt+i)->curop=0;
//(pelt+i)->op[0]=End;
pelt[i]=-1;
//(pelt+i)->next=i+1;
//(pelt+i+1)->prev=i;
}
(pelt+i-1)->next=-1;
//(pelt+i-1)->next=-1;
}
return stack;
}
STACKELT *push_stack(stack, op, val)
int *push_stack(stack, val)
STACK *stack;
OPER op;
int val;
{
int pos=stack->last;
int size=stack->size;
STACKELT *pelt=stack->stack+stack->last;
int *pelt=stack->stack+stack->last;
if (pos >= size) {
fprintf(stderr, "stack overflow: size=%d last=%d\n", size, pos);
return NULL;
}
pelt->nop=0;
pelt->curop=0;
//pelt->nop=0;
//pelt->curop=0;
//pelt->op[0]=op;
pelt->val=val;
*pelt=val;
stack->last++;
return pelt;
}
STACKELT *pop_stack(stack)
int *pop_stack(stack)
STACK *stack;
{
int pos=stack->last+1;
int size=stack->size;
STACKELT *pelt=stack->stack+stack->last;
int *pelt=stack->stack+stack->last;
if (pos==0) {
fprintf(stderr, "stack empty: size=%d last=%d\n", size, pos);
@@ -96,40 +119,42 @@ STACK *dup_stack(stack, name)
char *name;
{
STACK *new;
STACKELT *src=stack->stack, *dst;
int *src=stack->stack, *dst;
int size=stack->size, last=stack->last, i;
new=new_stack(size, name);
new=new_stack(size, name, 0);
new->last=stack->last;
dst=new->stack;
for (i=0; i<last; ++i) {
dst->nop=src->nop;
dst->curop=src->curop;
dst->val=src->val;
memcpy(dst->op, src->op, sizeof(src->op));
dst[i]=stack->stack[i];
//dst->nop=src->nop;
//dst->curop=src->curop;
//dst->val=src->val;
//memcpy(dst->op, src->op, sizeof(src->op));
}
stack->last++;
//stack->last++;
return new;
}
void swap(elts, i, j)
STACKELT *elts;
int *elts;
int i, j;
{
STACKELT tmp=elts[i];
int tmp=elts[i];
elts[i] = elts[j];
elts[j] = tmp;
}
int permute_stack(array, n)
STACKELT *array;
int *array;
int n;
{
int i, j, start, end;
for(i=n-2; i>-1; i--) {
if(array[i+1].val > array[i].val) {
if(array[i+1] > array[i]) {
for(j=n-1; j>i; j--){
if(array[j].val > array[i].val){
if(array[j] > array[i]){
// swap
swap(array, i, j);
// reverse
@@ -143,20 +168,44 @@ int permute_stack(array, n)
return 0;
}
int gen_stacks(stack)
STACK *stack;
{
char name[80];
int last=stack->last;
int n=1;
STACK *new=stack;
int exists=1;
printf("sorting stack...\n");
mergesort_stack(stack->stack, 0, last-1);
//print_stack(stack, 1);
while (exists) {
sprintf(name, "Stack copy %d", n);
new=dup_stack(new, name);
exists=permute_stack(new->stack, new->last);
if (exists) {
//print_stack(new, 1);
keep_stack(new);
}
n++;
}
}
void mergesort_stack(array, left, right)
STACKELT *array;
int *array;
int left, right;
{
int mid = (left+right)/2;
int pos=0, l=left, r=mid+1, i;
STACKELT tmp[right-left+1];
int tmp[right-left+1];
if(left < right) {
mergesort_stack(array, left, mid);
mergesort_stack(array, mid+1,right);
while (l <= mid && r <= right) {
if (array[l].val < array[r].val) {
if (array[l] < array[r]) {
tmp[pos++] = array[l++];
}
else {
@@ -172,41 +221,18 @@ void mergesort_stack(array, left, right)
}
}
STACKELT *set_op_stack(stack, pos, op)
STACK *stack;
int pos;
OPER op;
STACK *nth_stack(n)
int n;
{
int size=stack->size;
STACKELT *pelt=stack->stack+pos;
if (pos >= size) {
fprintf(stderr, "set_op: stack overflow: size=%d last=%d\n", size, pos);
return NULL;
int i;
STACK *stack=stacks;
for (i=0; i<n && stack; ++i) {
stack=stack->next;
}
pelt->op[pelt->nop++]=op;
pelt->op[pelt->nop]=End;
//pelt->val=val;
//stack->last++;
return pelt;
return stack;
}
STACKELT *set_ops_stack(stack, ops)
STACK *stack;
char *ops;
int n_stacks()
{
//int size=stack->size;
int last=stack->last;
int i, j; /* 1st operator in on second number */
STACKELT *pelt=stack->stack;
printf("setting ops [%s]\n", (char *)ops);
for (i=1, j=0; i<last; ++i, ++j) {
pelt[i].nop=1;
pelt[i].curop=0;
printf("setting op [%c-%x] to pos %d[%d]\n", ops[j], ops[j], i, pelt[i].nop);
pelt[i].op[0]=ops[j];
pelt[i].op[1]=End;
}
return pelt;
return nstacks;
}