Implement divide and divmod methods.
authorjbj <devnull@localhost>
Sun, 8 Dec 2002 21:50:36 +0000 (21:50 +0000)
committerjbj <devnull@localhost>
Sun, 8 Dec 2002 21:50:36 +0000 (21:50 +0000)
CVS patchset: 5925
CVS date: 2002/12/08 21:50:36

python/rpmbc-py.c

index fc65eb5..cf2246a 100644 (file)
@@ -155,27 +155,80 @@ static PyObject *
 rpmbc_divide(rpmbcObject * a, rpmbcObject * b)
        /*@*/
 {
+    rpmbcObject * z = NULL;
+    uint32 * wksp;
+
 if (_rpmbc_debug)
 fprintf(stderr, "*** rpmbc_divide(%p,%p)\n", a, b);
-    return NULL;
+
+    if (mp32z(b->n.size, b->n.data)) {
+       PyErr_SetString(PyExc_ZeroDivisionError, "rpmbc_divide by zero");
+       return NULL;
+    }
+
+    if ((z = rpmbc_new()) == NULL
+     || (wksp = malloc(b->n.size+1)) == NULL) {
+       Py_XDECREF(z);
+       return NULL;
+    }
+
+    mp32nsize(&z->n, a->n.size+1);
+    mp32ndivmod(z->n.data, a->n.size, a->n.data, b->n.size, b->n.data, wksp);
+
+    return (PyObject *)z;
 }
 
 static PyObject *
 rpmbc_remainder(rpmbcObject * a, rpmbcObject * b)
        /*@*/
 {
+    rpmbcObject * z;
+
 if (_rpmbc_debug)
 fprintf(stderr, "*** rpmbc_remainder(%p,%p)\n", a, b);
-    return NULL;
+
+    if ((z = rpmbc_new()) != NULL) {
+       uint32 * wksp = malloc(a->n.size+1);
+       mp32nsize(&z->n, a->n.size);
+       mp32nmod(z->n.data, a->n.size, a->n.data, b->n.size, b->n.data, wksp);
+       free(wksp);
+    }
+    return (PyObject *)z;
 }
 
 static PyObject *
 rpmbc_divmod(rpmbcObject * a, rpmbcObject * b)
        /*@*/
 {
+    PyObject * z = NULL;
+    rpmbcObject * d = NULL;
+    rpmbcObject * r = NULL;
+
 if (_rpmbc_debug)
 fprintf(stderr, "*** rpmbc_divmod(%p,%p)\n", a, b);
-    return NULL;
+
+    if (mp32z(b->n.size, b->n.data)) {
+       PyErr_SetString(PyExc_ZeroDivisionError, "rpmbc_divmod by zero");
+       return NULL;
+    }
+
+    if ((z = PyTuple_New(2)) == NULL
+     || (d = rpmbc_new()) == NULL
+     || (r = rpmbc_new()) == NULL) {
+       Py_XDECREF(z);
+       Py_XDECREF(d);
+       Py_XDECREF(r);
+       return NULL;
+    }
+
+    mp32nsize(&d->n, a->n.size+1);
+    mp32nsize(&r->n, b->n.size+1);
+
+    mp32ndivmod(d->n.data, a->n.size, a->n.data, b->n.size, b->n.data, r->n.data);
+
+    (void) PyTuple_SetItem(z, 0, (PyObject *)d);
+    (void) PyTuple_SetItem(z, 1, (PyObject *)r);
+    return (PyObject *)z;
 }
 
 static PyObject *