variables.cpp 1.0 KB

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