home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sa104os2.zip / SATHR104.ZIP / SATHER / SYSTEM / INT.C < prev    next >
C/C++ Source or Header  |  1994-10-25  |  2KB  |  69 lines

  1. #include "header.h"
  2.  
  3. /* INT functions which are "built-in" to the Sather system.  */
  4.  
  5. #define RAISE_OVERFLOW fprintf(stderr,"\nInteger overflow detected\n")
  6. #define RAISE_DIV_ZERO fprintf(stderr,"\nDivision by zero detected\n")
  7. #define RAISE_MOD_ZERO fprintf(stderr,"\nModulo by zero detected\n")
  8.  
  9. /*************** INT ****************/
  10.  
  11. INT c_INT_plus_INT_INT_chk(INT a, INT b) {   /* INT::plus(INT):INT   */
  12.     /* ADD OVERFLOW CHECK!!! */
  13.     return a+b;
  14. }
  15.  
  16. INT c_INT_minus_INT_INT_chk(INT a, INT b) {  /* INT::minus(INT):INT   */
  17.     /* ADD OVERFLOW CHECK!!! */
  18.     return a-b;
  19. }
  20.  
  21. INT c_INT_times_INT_INT_chk(INT a, INT b) {  /* INT::times(INT):INT   */
  22.     /* ADD OVERFLOW CHECK!!! */
  23.     return a*b;
  24. }
  25.  
  26. INT c_INT_div_INT_INT_chk(INT a, INT b) {    /* INT::div(INT):INT   */
  27.     int q;
  28.     if (b==0) RAISE_DIV_ZERO;
  29.     q = a/b;
  30.     return a < 0 && a != q*b ? q-1 : q;
  31. }
  32.  
  33. INT c_INT_mod_INT_INT_chk(INT a, INT b) {    /* INT::mod(INT):INT   */
  34.     int r;
  35.     if (b==0) RAISE_MOD_ZERO;
  36.     r = a%b;
  37.     return r < 0 ? r+b : r;
  38. }
  39.  
  40. INT c_INT_uplus_INT_INT_chk(INT a, INT b) {  /* INT::uplus(INT):INT   */
  41.     /* ADD OVERFLOW CHECK!!! */
  42.     return ((unsigned)a)+((unsigned)b);
  43. }
  44.  
  45. INT c_INT_uminus_INT_INT_chk(INT a, INT b) { /* INT::uminus(INT):INT   */
  46.     /* ADD OVERFLOW CHECK!!! */
  47.     return ((unsigned)a)-((unsigned)b);
  48. }
  49.  
  50. INT c_INT_utimes_INT_INT_chk(INT a, INT b) { /* INT::utimes(INT):INT   */
  51.     /* ADD OVERFLOW CHECK!!! */
  52.     return ((unsigned)a)*((unsigned)b);
  53. }
  54.  
  55. INT c_INT_udiv_INT_INT_chk(INT a, INT b) {   /* INT::udiv(INT):INT   */
  56.     if (((unsigned)b)==0) RAISE_DIV_ZERO;
  57.     return ((unsigned)a)/((unsigned)b);
  58. }
  59.  
  60. INT c_INT_umod_INT_INT_chk(INT a, INT b) {   /* INT::umod(INT):INT   */
  61.     if (((unsigned)b)==0) RAISE_MOD_ZERO;
  62.     return ((unsigned)a)%((unsigned)b);
  63. }
  64.  
  65. INT c_INT_rshift_INT_INT(INT a, INT b) {     /* INT::rshift(INT):INT */
  66.     if (a<0) return a>>b;
  67.     return ~((~a)>>b);
  68. }
  69.