Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / bake.cpp
blob054356a675f978d3825275db96d27488c2ee022f
1 // pretty print
3 #include "stdafx.h"
4 #include "defs.h"
6 void
7 bake(void)
9 int h, s, t, x, y, z;
11 expanding++;
13 save();
15 p1 = pop();
17 s = ispoly(p1, symbol(SYMBOL_S));
18 t = ispoly(p1, symbol(SYMBOL_T));
19 x = ispoly(p1, symbol(SYMBOL_X));
20 y = ispoly(p1, symbol(SYMBOL_Y));
21 z = ispoly(p1, symbol(SYMBOL_Z));
23 if (s == 1 && t == 0 && x == 0 && y == 0 && z == 0) {
24 p2 = symbol(SYMBOL_S);
25 bake_poly();
26 } else if (s == 0 && t == 1 && x == 0 && y == 0 && z == 0) {
27 p2 = symbol(SYMBOL_T);
28 bake_poly();
29 } else if (s == 0 && t == 0 && x == 1 && y == 0 && z == 0) {
30 p2 = symbol(SYMBOL_X);
31 bake_poly();
32 } else if (s == 0 && t == 0 && x == 0 && y == 1 && z == 0) {
33 p2 = symbol(SYMBOL_Y);
34 bake_poly();
35 } else if (s == 0 && t == 0 && x == 0 && y == 0 && z == 1) {
36 p2 = symbol(SYMBOL_Z);
37 bake_poly();
38 } else if (iscons(p1)) {
39 h = tos;
40 push(car(p1));
41 p1 = cdr(p1);
42 while (iscons(p1)) {
43 push(car(p1));
44 bake();
45 p1 = cdr(p1);
47 list(tos - h);
48 } else
49 push(p1);
51 restore();
53 expanding--;
56 void
57 polyform(void)
59 int h;
61 save();
63 p2 = pop();
64 p1 = pop();
66 if (ispoly(p1, p2))
67 bake_poly();
68 else if (iscons(p1)) {
69 h = tos;
70 push(car(p1));
71 p1 = cdr(p1);
72 while (iscons(p1)) {
73 push(car(p1));
74 push(p2);
75 polyform();
76 p1 = cdr(p1);
78 list(tos - h);
79 } else
80 push(p1);
82 restore();
85 void
86 bake_poly()
88 int h, i, k, n;
89 U **a;
90 a = stack + tos;
91 push(p1); // p(x)
92 push(p2); // x
93 k = coeff();
94 h = tos;
95 for (i = k - 1; i >= 0; i--) {
96 p1 = a[i];
97 bake_poly_term(i);
99 n = tos - h;
100 if (n > 1) {
101 list(n);
102 push(symbol(ADD));
103 swap();
104 cons();
106 p1 = pop();
107 tos -= k;
108 push(p1);
111 // p1 points to coefficient of p2 ^ k
113 void
114 bake_poly_term(int k)
116 int h, n;
118 if (iszero(p1))
119 return;
121 // constant term?
123 if (k == 0) {
124 if (car(p1) == symbol(ADD)) {
125 p1 = cdr(p1);
126 while (iscons(p1)) {
127 push(car(p1));
128 p1 = cdr(p1);
130 } else
131 push(p1);
132 return;
135 h = tos;
137 // coefficient
139 if (car(p1) == symbol(MULTIPLY)) {
140 p1 = cdr(p1);
141 while (iscons(p1)) {
142 push(car(p1));
143 p1 = cdr(p1);
145 } else if (!equaln(p1, 1))
146 push(p1);
148 // x ^ k
150 if (k == 1)
151 push(p2);
152 else {
153 push(symbol(POWER));
154 push(p2);
155 push_integer(k);
156 list(3);
159 n = tos - h;
161 if (n > 1) {
162 list(n);
163 push(symbol(MULTIPLY));
164 swap();
165 cons();