Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / variables.cpp
bloba5a87050670a3b6eb4f063762a09e1efa687b18f
1 //-----------------------------------------------------------------------------
2 //
3 // Scan expr for vars, return in vector
4 //
5 // Input: Expression on stack
6 //
7 // Output: Vector
8 //
9 //-----------------------------------------------------------------------------
11 #include "stdafx.h"
12 #include "defs.h"
13 static void scan(U *);
14 static int __cmp(const void *, const void *);
15 static int h;
17 void
18 variables(void)
20 int i, n;
21 save();
22 p1 = pop();
23 h = tos;
24 scan(p1);
25 n = tos - h;
26 if (n > 1)
27 qsort(stack + h, n, sizeof (U *), __cmp);
28 p1 = alloc_tensor(n);
29 p1->u.tensor->ndim = 1;
30 p1->u.tensor->dim[0] = n;
31 for (i = 0; i < n; i++)
32 p1->u.tensor->elem[i] = stack[i];
33 tos = h;
34 push(p1);
35 restore();
38 static void
39 scan(U *p)
41 int i;
42 if (iscons(p)) {
43 p = cdr(p);
44 while (iscons(p)) {
45 scan(car(p));
46 p = cdr(p);
48 } else if (issymbol(p) && p != symbol(E)) {
49 for (i = h; i < tos; i++)
50 if (stack[i] == p)
51 return;
52 push(p);
56 static int
57 __cmp(const void *p1, const void *p2)
59 return cmp_expr(*((U **) p1), *((U **) p2));