[pypy-commit] pypy default: cpyext: Add PyUnicode_Find
amauryfa
noreply at buildbot.pypy.org
Tue Apr 10 23:55:14 CEST 2012
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r54278:10ee763df5ba
Date: 2012-04-10 22:42 +0200
http://bitbucket.org/pypy/pypy/changeset/10ee763df5ba/
Log: cpyext: Add PyUnicode_Find
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -2287,19 +2287,6 @@
use the default error handling."""
raise NotImplementedError
- at cpython_api([PyObject, PyObject, Py_ssize_t, Py_ssize_t, rffi.INT_real], Py_ssize_t, error=-2)
-def PyUnicode_Find(space, str, substr, start, end, direction):
- """Return the first position of substr in str*[*start:end] using the given
- direction (direction == 1 means to do a forward search, direction == -1 a
- backward search). The return value is the index of the first match; a value of
- -1 indicates that no match was found, and -2 indicates that an error
- occurred and an exception has been set.
-
- This function used an int type for start and end. This
- might require changes in your code for properly supporting 64-bit
- systems."""
- raise NotImplementedError
-
@cpython_api([PyObject, PyObject, rffi.INT_real], PyObject)
def PyUnicode_RichCompare(space, left, right, op):
"""Rich compare two unicode strings and return one of the following:
diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py
--- a/pypy/module/cpyext/test/test_unicodeobject.py
+++ b/pypy/module/cpyext/test/test_unicodeobject.py
@@ -460,6 +460,15 @@
def test_count(self, space, api):
w_str = space.wrap(u"abcabdab")
- assert api.PyUnicode_Count(w_str, space.wrap("ab"), 0, -1) == 2
- assert api.PyUnicode_Count(w_str, space.wrap("ab"), 0, 2) == 1
- assert api.PyUnicode_Count(w_str, space.wrap("ab"), -5, 30) == 2
+ assert api.PyUnicode_Count(w_str, space.wrap(u"ab"), 0, -1) == 2
+ assert api.PyUnicode_Count(w_str, space.wrap(u"ab"), 0, 2) == 1
+ assert api.PyUnicode_Count(w_str, space.wrap(u"ab"), -5, 30) == 2
+
+ def test_find(self, space, api):
+ w_str = space.wrap(u"abcabcd")
+ assert api.PyUnicode_Find(w_str, space.wrap(u"c"), 0, 7, 1) == 2
+ assert api.PyUnicode_Find(w_str, space.wrap(u"c"), 3, 7, 1) == 5
+ assert api.PyUnicode_Find(w_str, space.wrap(u"c"), 0, 7, -1) == 5
+ assert api.PyUnicode_Find(w_str, space.wrap(u"c"), 3, 7, -1) == 5
+ assert api.PyUnicode_Find(w_str, space.wrap(u"c"), 0, 4, -1) == 2
+ assert api.PyUnicode_Find(w_str, space.wrap(u"z"), 0, 4, -1) == -1
diff --git a/pypy/module/cpyext/unicodeobject.py b/pypy/module/cpyext/unicodeobject.py
--- a/pypy/module/cpyext/unicodeobject.py
+++ b/pypy/module/cpyext/unicodeobject.py
@@ -605,3 +605,20 @@
w_count = space.call_method(w_str, "count", w_substr,
space.wrap(start), space.wrap(end))
return space.int_w(w_count)
+
+ at cpython_api([PyObject, PyObject, Py_ssize_t, Py_ssize_t, rffi.INT_real],
+ Py_ssize_t, error=-2)
+def PyUnicode_Find(space, w_str, w_substr, start, end, direction):
+ """Return the first position of substr in str*[*start:end] using
+ the given direction (direction == 1 means to do a forward search,
+ direction == -1 a backward search). The return value is the index
+ of the first match; a value of -1 indicates that no match was
+ found, and -2 indicates that an error occurred and an exception
+ has been set."""
+ if rffi.cast(lltype.Signed, direction) > 0:
+ w_pos = space.call_method(w_str, "find", w_substr,
+ space.wrap(start), space.wrap(end))
+ else:
+ w_pos = space.call_method(w_str, "rfind", w_substr,
+ space.wrap(start), space.wrap(end))
+ return space.int_w(w_pos)
More information about the pypy-commit
mailing list