12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- //-----------------------------------------------------------------------------
- //
- // Scan expr for vars, return in vector
- //
- // Input: Expression on stack
- //
- // Output: Vector
- //
- //-----------------------------------------------------------------------------
- #include "stdafx.h"
- #include "defs.h"
- static void scan(U *);
- static int __cmp(const void *, const void *);
- static int h;
- void
- variables(void)
- {
- int i, n;
- save();
- p1 = pop();
- h = tos;
- scan(p1);
- n = tos - h;
- if (n > 1)
- qsort(stack + h, n, sizeof (U *), __cmp);
- p1 = alloc_tensor(n);
- p1->u.tensor->ndim = 1;
- p1->u.tensor->dim[0] = n;
- for (i = 0; i < n; i++)
- p1->u.tensor->elem[i] = stack[i];
- tos = h;
- push(p1);
- restore();
- }
- static void
- scan(U *p)
- {
- int i;
- if (iscons(p)) {
- p = cdr(p);
- while (iscons(p)) {
- scan(car(p));
- p = cdr(p);
- }
- } else if (issymbol(p) && p != symbol(E)) {
- for (i = h; i < tos; i++)
- if (stack[i] == p)
- return;
- push(p);
- }
- }
- static int
- __cmp(const void *p1, const void *p2)
- {
- return cmp_expr(*((U **) p1), *((U **) p2));
- }
|