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

  1. #include "apl.h"
  2.  
  3. ex_rot0()
  4. {
  5.     fetch2();
  6.     rotk(0);
  7. }
  8.  
  9. ex_rotk()
  10. {
  11.     int k;
  12.  
  13.     k = topfix() - thread.iorg;
  14.     fetch2();
  15.     rotk(k);
  16. }
  17.  
  18. ex_rot()
  19. {
  20.     struct item *p;
  21.  
  22.     fetch2();
  23.     p = sp[-2];
  24.     rotk(p->rank-1);
  25. }
  26.  
  27. rotk(k)
  28. {
  29.     struct item *p, *q;
  30.     int param, rot1();
  31.  
  32.     p = sp[-1];
  33.     bidx(sp[-2]);
  34.     if(k < 0 || k >= idx.rank) error("rotate X");
  35.     param = 0;
  36.     colapse(k);
  37.     if(idx.size != p->size) {
  38.         if(p->size != 1) error("rotate C");
  39.         param++;
  40.         datum = getdat(p);
  41.     }
  42.     p = newdat(idx.type, 1, idx.dimk);
  43.     *sp++ = p;
  44.     forloop(rot1, param);
  45.     pop();
  46.     pop();
  47. }
  48.  
  49. rot1(param)
  50. {
  51.     struct item *p, *q;
  52.     int i;
  53.     int o, n;
  54.  
  55.     if(param == 0) datum = getdat(sp[-2]);
  56.     o = fix(datum);
  57.     if(o < 0) o = idx.dimk - (-o % idx.dimk);
  58.     q = sp[-1];
  59.     p = sp[-3];
  60.     q->index = 0;
  61.     n = access();
  62.     for(i=0; i<idx.dimk; i++) {
  63.         p->index = n + (o%idx.dimk)*idx.delk;
  64.         putdat(q, getdat(p));
  65.         o++;
  66.     }
  67.     for(i=0; i<idx.dimk; i++) {
  68.         p->index = n;
  69.         putdat(p, getdat(q));
  70.         n += idx.delk;
  71.     }
  72. }
  73.