home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume11 / rpl / part02 / relcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-03-10  |  3.6 KB  |  209 lines

  1. /****************************************************************
  2.  
  3. Module:
  4.     RelCmd
  5.  
  6. Description:
  7.     Commands implementing relational operations
  8.  
  9.  
  10. Modification history:
  11.  
  12. 0.0    hjp    89-07-14
  13.  
  14.     initial version
  15.  
  16. 0.1    hjp    89-09-04
  17.  
  18.     destroy added after push to prevent memory loss.
  19.  
  20. 0.2    hjp    89-10-01
  21.  
  22.     link count added. destroy now superfluos - removed.
  23.  
  24. 0.3    hjp    90-03-03
  25.  
  26.     malloc replaced by mallocobj (at last!).
  27.  
  28. 0.4    hjp    90-03-07
  29.  
  30.     argument checking fixed in all functions.
  31.  
  32. ****************************************************************/
  33.  
  34. #include "rpl.h"
  35. #include "relcmd.h"
  36. #include "globvar.h"
  37. #include "errors.h"
  38. #include "intcmd.h"
  39. #include "stackcmd.h"
  40.  
  41. #include "debug.h"
  42.  
  43. /*
  44.     Level 2 > Level 1 ?
  45. */
  46.  
  47. void c_gt (void)
  48. {
  49.     genobj * a, * b, * c;
  50.  
  51.     if (! stack || ! stack->next) {
  52.         error (">", ERR_2FEWARG);
  53.         return;
  54.     }
  55.  
  56.     b = stack->obj; a = stack->next->obj;
  57.  
  58.     if (a->id == REAL && b->id == REAL) {
  59.         c = mallocobj (REAL);
  60.         ((realobj *)c)->val = ((realobj *) a)->val > ((realobj *) b)->val;
  61.         c_drop ();
  62.         c_drop ();
  63.         push (c);
  64.     } else {
  65.         if (a->id != REAL) error (">", ERR_WRTYPE, id2str (a->id));
  66.         if (b->id != REAL) error (">", ERR_WRTYPE, id2str (b->id));
  67.     }
  68. }
  69.  
  70.  
  71. /*
  72.     Level 2 >= Level 1 ?
  73. */
  74.  
  75. void c_ge (void)
  76. {
  77.     genobj * a, * b, * c;
  78.  
  79.     if (! stack || ! stack->next) {
  80.         error (">=", ERR_2FEWARG);
  81.         return;
  82.     }
  83.  
  84.     b = stack->obj; a = stack->next->obj;
  85.  
  86.     if (a->id == REAL && b->id == REAL) {
  87.         c = mallocobj (REAL);
  88.         ((realobj *)c)->val = ((realobj *) a)->val >= ((realobj *) b)->val;
  89.         c_drop ();
  90.         c_drop ();
  91.         push (c);
  92.     } else {
  93.         if (a->id != REAL) error (">=", ERR_WRTYPE, id2str (a->id));
  94.         if (b->id != REAL) error (">=", ERR_WRTYPE, id2str (b->id));
  95.     }
  96. }
  97.  
  98.  
  99. /*
  100.     Level 2 == Level 1 ?
  101. */
  102.  
  103. void c_eq (void)
  104. {
  105.     genobj * a, * b, * c;
  106.  
  107.     if (! stack || ! stack->next) {
  108.         error ("==", ERR_2FEWARG);
  109.         return;
  110.     }
  111.  
  112.     b = stack->obj; a = stack->next->obj;
  113.  
  114.     if (a->id == REAL && b->id == REAL) {
  115.         c = mallocobj (REAL);
  116.         ((realobj *)c)->val = ((realobj *) a)->val == ((realobj *) b)->val;
  117.         c_drop ();
  118.         c_drop ();
  119.         push (c);
  120.     } else {
  121.         if (a->id != REAL) error ("==", ERR_WRTYPE, id2str (a->id));
  122.         if (b->id != REAL) error ("==", ERR_WRTYPE, id2str (b->id));
  123.     }
  124. }
  125.  
  126.  
  127. /*
  128.     Level 2 <= Level 1 ?
  129. */
  130.  
  131. void c_le (void)
  132. {
  133.     genobj * a, * b, * c;
  134.  
  135.     if (! stack || ! stack->next) {
  136.         error ("<=", ERR_2FEWARG);
  137.         return;
  138.     }
  139.  
  140.     b = stack->obj; a = stack->next->obj;
  141.  
  142.     if (a->id == REAL && b->id == REAL) {
  143.         c = mallocobj (REAL);
  144.         ((realobj *)c)->val = ((realobj *) a)->val <= ((realobj *) b)->val;
  145.         c_drop ();
  146.         c_drop ();
  147.         push (c);
  148.     } else {
  149.         if (a->id != REAL) error ("<=", ERR_WRTYPE, id2str (a->id));
  150.         if (b->id != REAL) error ("<=", ERR_WRTYPE, id2str (b->id));
  151.     }
  152. }
  153.  
  154.  
  155. /*
  156.     Level 2 < Level 1 ?
  157. */
  158.  
  159. void c_lt (void)
  160. {
  161.     genobj * a, * b, * c;
  162.  
  163.     if (! stack || ! stack->next) {
  164.         error ("<", ERR_2FEWARG);
  165.         return;
  166.     }
  167.  
  168.     b = stack->obj; a = stack->next->obj;
  169.  
  170.     if (a->id == REAL && b->id == REAL) {
  171.         c = mallocobj (REAL);
  172.         ((realobj *)c)->val = ((realobj *) a)->val < ((realobj *) b)->val;
  173.         c_drop ();
  174.         c_drop ();
  175.         push (c);
  176.     } else {
  177.         if (a->id != REAL) error ("<", ERR_WRTYPE, id2str (a->id));
  178.         if (b->id != REAL) error ("<", ERR_WRTYPE, id2str (b->id));
  179.     }
  180. }
  181.  
  182.  
  183. /*
  184.     Level 2 != Level 1 ?
  185. */
  186.  
  187. void c_ne (void)
  188. {
  189.     genobj * a, * b, * c;
  190.  
  191.     if (! stack || ! stack->next) {
  192.         error ("!=", ERR_2FEWARG);
  193.         return;
  194.     }
  195.  
  196.     b = stack->obj; a = stack->next->obj;
  197.  
  198.     if (a->id == REAL && b->id == REAL) {
  199.         c = mallocobj (REAL);
  200.         ((realobj *)c)->val = ((realobj *) a)->val != ((realobj *) b)->val;
  201.         c_drop ();
  202.         c_drop ();
  203.         push (c);
  204.     } else {
  205.         if (a->id != REAL) error ("!=", ERR_WRTYPE, id2str (a->id));
  206.         if (b->id != REAL) error ("!=", ERR_WRTYPE, id2str (b->id));
  207.     }
  208. }
  209.