Advertisement
shiftdot515

wheel.c

Jul 17th, 2021 (edited)
1,100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.71 KB | None | 0 0
  1. /*
  2.  * Does it matter legally, if I share this without cause or license?
  3.  */
  4. int16_t wheel( int16_t a, unsigned char b)
  5. {
  6.   int16_t stack[7];
  7.   int16_t tmp;
  8.   int depth;
  9.   enum primitives { end, unfold, dup2, flip, swap, dup, mult, minus,
  10.                     add2, add1 };
  11.  
  12.   int code[] = { unfold,dup2,flip,swap,dup,mult,swap,dup,mult,
  13.                  minus,swap,minus,mult,add2,swap,add1,mult,flip, end };
  14.   int pc;
  15.  
  16.   depth=0;
  17.   stack[depth++]=a;
  18.   stack[depth++]=b;
  19.   for (pc=0;  end != code[pc] ; pc++ ) {
  20.     switch(code[pc]) {
  21.     case dup:      
  22.       tmp=stack[depth];
  23.       depth++;
  24.       stack[depth]=tmp;
  25.       break;
  26.     case dup2:      
  27.       tmp=stack[depth];
  28.       stack[depth+1]=stack[depth-1];
  29.       depth+=2;
  30.       stack[depth]=tmp;
  31.       break;
  32.     case swap:      
  33.       tmp=stack[depth];
  34.       stack[depth]=stack[depth-1];
  35.       stack[depth-1]=tmp;
  36.       break;
  37.     case unfold:    
  38.       tmp=stack[depth];
  39.       stack[depth]=stack[depth-1];
  40.       depth++;
  41.       stack[depth]=tmp;
  42.       break;
  43.     case flip:      
  44.       {
  45.         unsigned char uc;
  46.         union {
  47.           unsigned char uc[2];
  48.           int16_t i;
  49.         } f;
  50.         f.i=stack[depth];
  51.         uc=f.uc[0];
  52.         f.uc[0]=f.uc[1];
  53.         f.uc[1]=uc;
  54.         stack[depth]=f.i;
  55.       }
  56.       break;
  57.     case mult:      
  58.       tmp=(stack[depth-1] * stack[depth]);
  59.       depth--;
  60.       stack[depth]=tmp;
  61.       break;
  62.     case minus:      
  63.       tmp=(stack[depth-1] - stack[depth]);
  64.       depth--;
  65.       stack[depth]=tmp;
  66.       break;
  67.     case add1:      
  68.       stack[depth]++;
  69.       break;
  70.     case add2:      
  71.       stack[depth]+=2;
  72.     }
  73.   }
  74.   return stack[depth];
  75. }
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement