/*------------------------------------------------------------*/ void set_grey (void) { assert (dstack_size >= 1); colour_set_grey (&given_colour, dstack [dstack_size - 1]); pop_dstack (1); if (invalid_colour (&given_colour)) return; assert (colour_valid_state (&given_colour)); }
/*------------------------------------------------------------*/ void set_hsb (void) { assert (dstack_size >= 3); colour_set_hsb (&given_colour, dstack [dstack_size - 3], dstack [dstack_size - 2], dstack [dstack_size - 1]); pop_dstack (3); if (invalid_colour (&given_colour)) return; assert (colour_valid_state (&given_colour)); }
double stack_eval(double t, double *c_in, double *x_in, D_Stack *d_stack, StackExpr expr ) { // I_Stack *serial = new_istack(); // I_Stack istack; // I_Stack *serial = &istack; clear_dstack(d_stack); int* serial = expr.serial; #ifdef print_stack_eval printf("Serial: |%d|", expr.s_len); #endif int s; for( s=0; s < expr.s_len; s++ ) { // #ifdef print_stack_eval // printf( "%d ", expr.serial[s]); // #endif // push_istack(serial,expr.serial[expr.s_len-s-1]); // } // #ifdef print_stack_eval // printf("\n"); // #endif // clear_dstack(d_stack); // // fill i_stack with cmds and d_stack with leaves // while ( !is_empty_istack(serial) ) { // // printf( "processing serial\n"); // int val = top_istack(serial); // pop_istack(serial); int val = serial[s]; #ifdef print_stack_eval int dlen = len_dstack(d_stack); int slen = len_istack(serial); printf( "S: %d val: %d \n", slen, val ); printf( "serial(%d): [ ", slen); for( i=0; i < slen; i++ ) printf( "%d ", get_istack(serial,i) ); printf(" ]\n"); printf( "d_stack(%d): [ ", dlen); for( i=0; i < dlen; i++ ) printf( "%.2f ", get_dstack(d_stack,i) ); printf(" ]\n"); #endif switch (val) { // CONSTANT: 2 case 2: { s++; int p = serial[s]; // int p = top_istack(serial); // pop_istack(serial); push_dstack(d_stack,c_in[p]); } break; // HACK*** // CONSTANTF: 3 case 3: { s++; int p = serial[s]; // int p = top_istack(serial); // pop_istack(serial); push_dstack(d_stack,p); } break; // TIME: 4 case 4: push_dstack(d_stack,t); break; // SYSTEM: 5 // case 5: // s++; // push_dstack(d_stack,sys_in[serial[s]]); // VAR: 6 should already be transformed, but just in case case 6: { s++; int p = serial[s]; // int p = top_istack(serial); // pop_istack(serial); push_dstack(d_stack,x_in[p]); break; } // NEG: 9 case 9: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, -top); } break; // ABS: 10 case 10: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, fabs(top)); } break; // SQRT: 11 case 11: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, sqrt(top)); } break; // SIN: 12 case 12: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, sin(top)); } break; // COS: 13 case 13: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, cos(top)); } break; // TAN: 14 case 14: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, tan(top)); } break; // EXP: 15 case 15: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, exp(top)); } break; // LOG: 16 case 16: { double top = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, log(top)); } break; // POWI: 18 case 18: { double top = top_dstack(d_stack); pop_dstack(d_stack); s++; int pwr = serial[s]; // int pwr = top_istack(serial); // pop_istack(serial); push_dstack(d_stack, pow(top,pwr)); } break; // POWE: 20 case 20: { double top = top_dstack(d_stack); pop_dstack(d_stack); double pwr = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, pow(top,pwr)); } break; // DIV: 21 case 21: { double denom = top_dstack(d_stack); pop_dstack(d_stack); double numer = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, numer / denom); } break; // ADD: 22 case 22: { double lhs = top_dstack(d_stack); pop_dstack(d_stack); double rhs = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, lhs + rhs); // printf( "%f + %f = %f\n", lhs, rhs, top_dstack(d_stack)); } break; // MUL: 23 case 23: { double lhs = top_dstack(d_stack); pop_dstack(d_stack); double rhs = top_dstack(d_stack); pop_dstack(d_stack); push_dstack(d_stack, lhs * rhs); // printf( "%f * %f = %f\n", lhs, rhs, top_dstack(d_stack)); } break; case 0: default: // STARTVAR: 25 if (val >= 25) { push_dstack(d_stack,x_in[val-25]); // x_dim_of_var = val - STARTVAR } else { printf("pushing unknown cmd %d\n", val); int s; for( s=0; s < expr.s_len; s++ ) { printf( "%d ", expr.serial[s]); } printf( "\n"); abort(); } } #ifdef print_stack_eval dlen = len_dstack(d_stack); printf( "S: %d val: %d\n", s, val); printf( "d_stack(%d): [ ", dlen); for( i=0; i < dlen; i++ ) printf( "%.2f ", get_dstack(d_stack,i) ); printf(" ]\n\n"); #endif } // free(serial); return top_dstack(d_stack); }