Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: Changeset: r46665:917774b30aaa Date: 2011-08-20 14:40 +0200 http://bitbucket.org/pypy/pypy/changeset/917774b30aaa/
Log: Implement Py_UNICODE_TOTITLE, Py_UNICODE_TODECIMAL, Py_UNICODE_TONUMBER, Py_UNICODE_TODIGIT. 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 @@ -2193,29 +2193,6 @@ """Return 1 or 0 depending on whether ch is an alphabetic character.""" raise NotImplementedError -@cpython_api([Py_UNICODE], Py_UNICODE, error=CANNOT_FAIL) -def Py_UNICODE_TOTITLE(space, ch): - """Return the character ch converted to title case.""" - raise NotImplementedError - -@cpython_api([Py_UNICODE], rffi.INT_real, error=CANNOT_FAIL) -def Py_UNICODE_TODECIMAL(space, ch): - """Return the character ch converted to a decimal positive integer. Return - -1 if this is not possible. This macro does not raise exceptions.""" - raise NotImplementedError - -@cpython_api([Py_UNICODE], rffi.INT_real, error=CANNOT_FAIL) -def Py_UNICODE_TODIGIT(space, ch): - """Return the character ch converted to a single digit integer. Return -1 if - this is not possible. This macro does not raise exceptions.""" - raise NotImplementedError - -@cpython_api([Py_UNICODE], rffi.DOUBLE, error=CANNOT_FAIL) -def Py_UNICODE_TONUMERIC(space, ch): - """Return the character ch converted to a double. Return -1.0 if this is not - possible. This macro does not raise exceptions.""" - raise NotImplementedError - @cpython_api([rffi.CCHARP], PyObject) def PyUnicode_FromFormat(space, format): """Take a C printf()-style format string and a variable number of 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 @@ -219,6 +219,24 @@ assert api.Py_UNICODE_TOUPPER(u'�') == u'�' assert api.Py_UNICODE_TOUPPER(u'�') == u'�' + def test_TOTITLE(self, space, api): + assert api.Py_UNICODE_TOTITLE(u'/') == u'/' + assert api.Py_UNICODE_TOTITLE(u'�') == u'�' + assert api.Py_UNICODE_TOTITLE(u'�') == u'�' + + def test_TODECIMAL(self, space, api): + assert api.Py_UNICODE_TODECIMAL(u'6') == 6 + assert api.Py_UNICODE_TODECIMAL(u'A') == -1 + + def test_TODIGIT(self, space, api): + assert api.Py_UNICODE_TODIGIT(u'6') == 6 + assert api.Py_UNICODE_TODIGIT(u'A') == -1 + + def test_TONUMERIC(self, space, api): + assert api.Py_UNICODE_TONUMERIC(u'6') == 6.0 + assert api.Py_UNICODE_TONUMERIC(u'A') == -1.0 + assert api.Py_UNICODE_TONUMERIC(u'\N{VULGAR FRACTION ONE HALF}') == .5 + def test_fromobject(self, space, api): w_u = space.wrap(u'a') assert api.PyUnicode_FromObject(w_u) is w_u 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 @@ -122,6 +122,38 @@ """Return the character ch converted to upper case.""" return unichr(unicodedb.toupper(ord(ch))) +@cpython_api([Py_UNICODE], Py_UNICODE, error=CANNOT_FAIL) +def Py_UNICODE_TOTITLE(space, ch): + """Return the character ch converted to title case.""" + return unichr(unicodedb.totitle(ord(ch))) + +@cpython_api([Py_UNICODE], rffi.INT_real, error=CANNOT_FAIL) +def Py_UNICODE_TODECIMAL(space, ch): + """Return the character ch converted to a decimal positive integer. Return + -1 if this is not possible. This macro does not raise exceptions.""" + try: + return unicodedb.decimal(ord(ch)) + except KeyError: + return -1 + +@cpython_api([Py_UNICODE], rffi.INT_real, error=CANNOT_FAIL) +def Py_UNICODE_TODIGIT(space, ch): + """Return the character ch converted to a single digit integer. Return -1 if + this is not possible. This macro does not raise exceptions.""" + try: + return unicodedb.digit(ord(ch)) + except KeyError: + return -1 + +@cpython_api([Py_UNICODE], rffi.DOUBLE, error=CANNOT_FAIL) +def Py_UNICODE_TONUMERIC(space, ch): + """Return the character ch converted to a double. Return -1.0 if this is not + possible. This macro does not raise exceptions.""" + try: + return unicodedb.numeric(ord(ch)) + except KeyError: + return -1.0 + @cpython_api([PyObject], rffi.CCHARP, error=CANNOT_FAIL) def PyUnicode_AS_DATA(space, ref): """Return a pointer to the internal buffer of the object. o has to be a _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit