+static PyObject *meth_ctstreq(PyObject *me, PyObject *arg)
+{
+ char *p, *q;
+ Py_ssize_t psz, qsz;
+ if (!PyArg_ParseTuple(arg, "s#s#:ctstreq", &p, &psz, &q, &qsz))
+ goto end;
+ if (psz == qsz && ct_memeq(p, q, psz)) RETURN_TRUE;
+ else RETURN_FALSE;
+end:
+ return (0);
+}
+
+static PyObject *meth__ByteString_zero(PyObject *me, PyObject *arg)
+{
+ size_t sz;
+ PyObject *rc = 0;
+ if (!PyArg_ParseTuple(arg, "OO&:zero", &me, convszt, &sz)) goto end;
+ rc = bytestring_pywrap(0, sz);
+ memset(PyString_AS_STRING(rc), 0, sz);
+end:
+ return (rc);
+}
+
+static PyObject *bytestring_pyrichcompare(PyObject *me,
+ PyObject *you, int op)
+{
+ int b;
+ void *mystr, *yourstr;
+ Py_ssize_t mylen, yourlen, minlen;
+
+ if (!PyString_Check(me) || !PyString_Check(you)) RETURN_NOTIMPL;
+ mystr = PyString_AS_STRING(me); mylen = PyString_GET_SIZE(me);
+ yourstr = PyString_AS_STRING(you); yourlen = PyString_GET_SIZE(you);
+
+ switch (op) {
+ case Py_EQ:
+ b = mylen == yourlen && ct_memeq(mystr, yourstr, mylen);
+ break;
+ case Py_NE:
+ b = mylen != yourlen || !ct_memeq(mystr, yourstr, mylen);
+ break;
+ default:
+ minlen = mylen < yourlen ? mylen : yourlen;
+ b = memcmp(mystr, yourstr, minlen);
+ if (!b) b = mylen < yourlen ? -1 : mylen > yourlen ? +1 : 0;
+ switch (op) {
+ case Py_LT: b = b < 0; break;
+ case Py_LE: b = b <= 0; break;
+ case Py_GE: b = b >= 0; break;
+ case Py_GT: b = b > 0; break;
+ default: abort();
+ }
+ }
+ if (b) RETURN_TRUE;
+ else RETURN_FALSE;
+}
+