fixed div() and ldiv()
authoreck <none@none>
Thu, 1 Mar 1990 16:32:22 +0000 (16:32 +0000)
committereck <none@none>
Thu, 1 Mar 1990 16:32:22 +0000 (16:32 +0000)
lang/cem/libcc.ansi/stdlib/div.c
lang/cem/libcc.ansi/stdlib/ldiv.c

index bf27906..2430799 100644 (file)
@@ -6,12 +6,26 @@
 
 #include       <stdlib.h>
 
+static int tmp = -1;
+
 div_t
 div(register int numer, register int denom)
 {
        div_t r;
 
-       r.quot = numer / denom;
-       r.rem = numer % denom;
+       /* The assignment of tmp should not be optimized !! */
+       if (tmp == -1)
+               tmp = (tmp / 2 == 0);
+       }
+       if (numer == 0) {
+               r.quot = numer / denom;         /* might trap if denom == 0 */
+               r.rem = numer % denom;
+       } else if ( !tmp && ((numer < 0) != (denom < 0))) {
+               r.quot = (numer / denom) + 1;
+               r.rem = numer - (numer / denom + 1) * denom
+       } else {
+               r.quot = numer / denom;
+               r.rem = numer % denom;
+       }
        return r;
 }
index 7757464..25b842c 100644 (file)
@@ -6,12 +6,26 @@
 
 #include       <stdlib.h>
 
+static long tmp = -1;
+
 ldiv_t
 ldiv(register long numer, register long denom)
 {
        ldiv_t r;
 
-       r.quot = numer / denom;
-       r.rem = numer % denom;
+       /* The assignment of tmp should not be optimized !! */
+       if (tmp == -1)
+               tmp = (tmp / 2 == 0);
+       }
+       if (numer == 0) {
+               r.quot = numer / denom;         /* might trap if denom == 0 */
+               r.rem = numer % denom;
+       } else if ( !tmp && ((numer < 0) != (denom < 0))) {
+               r.quot = (numer / denom) + 1;
+               r.rem = numer - (numer / denom + 1) * denom
+       } else {
+               r.quot = numer / denom;
+               r.rem = numer % denom;
+       }
        return r;
 }