home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 13 / MA_Cover_13.bin / source / c / apl / aa.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-23  |  1.5 KB  |  118 lines

  1. #include "apl.h"
  2.  
  3. int    gdu();
  4. int    gdd();
  5.  
  6. ex_gdu()
  7. {
  8.     struct item *p;
  9.  
  10.     p = fetch1();
  11.     gd0(p->rank-1, gdu);
  12. }
  13.  
  14. ex_gduk()
  15. {
  16.     int k;
  17.  
  18.     k = topfix() - thread.iorg;
  19.     fetch1();
  20.     gd0(k, gdu);
  21. }
  22.  
  23. ex_gdd()
  24. {
  25.     struct item *p;
  26.  
  27.     p = fetch1();
  28.     gd0(p->rank-1, gdd);
  29. }
  30.  
  31. ex_gddk()
  32. {
  33.     int k;
  34.  
  35.     k = topfix() - thread.iorg;
  36.     fetch1();
  37.     gd0(k, gdd);
  38. }
  39.  
  40. gd0(k, f)
  41. int (*f)();
  42. {
  43.     struct item *p;
  44.     char *param[2];
  45.     int gd1();
  46.  
  47.     bidx(sp[-1]);
  48.     if(k < 0 || k >= idx.rank) error("grade X");
  49.     p = newdat(DA, idx.rank, idx.size);
  50.     copy(IN, idx.dim, p->dim, idx.rank);
  51.     *sp++ = p;
  52.     colapse(k);
  53.     param[0] = alloc(idx.dimk*SINT);
  54.     param[1] = (char *)f;
  55.     forloop(gd1, param);
  56.     aplfree(param[0]);
  57.     p = sp[-1];
  58.     sp--;
  59.     pop();
  60.     *sp++ = p;
  61. }
  62.  
  63. gd1(param)
  64. int *param[];
  65. {
  66.     struct item *p;
  67.     int i, *m;
  68.  
  69.     integ = access();
  70.     m = param[0];
  71.     for(i=0; i<idx.dimk; i++) *m++ = i;
  72.     m = param[0];
  73.     qsort(m, idx.dimk, SINT, param[1]);
  74.     p = sp[-1];
  75.     for(i=0; i<idx.dimk; i++) {
  76.         p->index = integ;
  77.         datum = *m++ + thread.iorg;
  78.         putdat(p, datum);
  79.         integ += idx.delk;
  80.     }
  81. }
  82.  
  83. gdu(p1, p2)
  84. int *p1, *p2;
  85. {
  86.     struct item *p;
  87.     data d1, d2;
  88.  
  89.     p = sp[-2];
  90.     p->index = integ + *p1 * idx.delk;
  91.     d1 = getdat(p);
  92.     p->index = integ + *p2 * idx.delk;
  93.     d2 = getdat(p);
  94.     if(fuzz(d1, d2) != 0) {
  95.         if(d1 > d2) return(1);
  96.         return(-1);
  97.     }
  98.     return(*p1 - *p2);
  99. }
  100.  
  101. gdd(p1, p2)
  102. int *p1, *p2;
  103. {
  104.     struct item *p;
  105.     data d1, d2;
  106.  
  107.     p = sp[-2];
  108.     p->index = integ + *p1 * idx.delk;
  109.     d1 = getdat(p);
  110.     p->index = integ + *p2 * idx.delk;
  111.     d2 = getdat(p);
  112.     if(fuzz(d1, d2) != 0) {
  113.         if(d1 > d2) return(-1);
  114.         return(1);
  115.     }
  116.     return(*p1 - *p2);
  117. }
  118.