Author: Amaury Forgeot d'Arc <amaur...@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 -@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) + +@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit