diff options
| author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-12-04 03:38:46 +0000 | 
|---|---|---|
| committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-12-04 03:38:46 +0000 | 
| commit | 942af5a9a45b7b4976bea2e794eccaaf2b3b5c09 (patch) | |
| tree | f621bdffa16dd0b04d7bf60d6a32f198fc7b3ec8 /Objects/unicodeobject.c | |
| parent | 36526bf3d95763afa6d4efe402b8840b1532d637 (diff) | |
| download | cpython-git-942af5a9a45b7b4976bea2e794eccaaf2b3b5c09.tar.gz | |
Issue #10557: Fixed error messages from float() and other numeric
types.  Added a new API function, PyUnicode_TransformDecimalToASCII(),
which transforms non-ASCII decimal digits in a Unicode string to their
ASCII equivalents.
Diffstat (limited to 'Objects/unicodeobject.c')
| -rw-r--r-- | Objects/unicodeobject.c | 35 | 
1 files changed, 33 insertions, 2 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index d3a2d1b715..751da30e42 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6206,6 +6206,30 @@ PyObject *PyUnicode_Translate(PyObject *str,      return NULL;  } +PyObject * +PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, +                                  Py_ssize_t length) +{ +    PyObject *result; +    Py_UNICODE *p; /* write pointer into result */ +    Py_ssize_t i; +    /* Copy to a new string */ +    result = (PyObject *)_PyUnicode_New(length); +    Py_UNICODE_COPY(PyUnicode_AS_UNICODE(result), s, length); +    if (result == NULL) +        return result; +    p = PyUnicode_AS_UNICODE(result); +    /* Iterate over code points */ +    for (i = 0; i < length; i++) { +        Py_UNICODE ch =s[i]; +        if (ch > 127) { +            int decimal = Py_UNICODE_TODECIMAL(ch); +            if (decimal >= 0) +                p[i] = '0' + decimal; +        } +    } +    return result; +}  /* --- Decimal Encoder ---------------------------------------------------- */  int PyUnicode_EncodeDecimal(Py_UNICODE *s, @@ -8967,6 +8991,13 @@ unicode_freelistsize(PyUnicodeObject *self)  {      return PyLong_FromLong(numfree);  } + +static PyObject * +unicode__decimal2ascii(PyObject *self) +{ +    return PyUnicode_TransformDecimalToASCII(PyUnicode_AS_UNICODE(self), +                                             PyUnicode_GET_SIZE(self)); +}  #endif  PyDoc_STRVAR(startswith__doc__, @@ -9108,7 +9139,6 @@ unicode_getnewargs(PyUnicodeObject *v)      return Py_BuildValue("(u#)", v->str, v->length);  } -  static PyMethodDef unicode_methods[] = {      /* Order is according to common usage: often used methods should @@ -9170,8 +9200,9 @@ static PyMethodDef unicode_methods[] = {  #endif  #if 0 -    /* This one is just used for debugging the implementation. */ +    /* These methods are just used for debugging the implementation. */      {"freelistsize", (PyCFunction) unicode_freelistsize, METH_NOARGS}, +    {"_decimal2ascii", (PyCFunction) unicode__decimal2ascii, METH_NOARGS},  #endif      {"__getnewargs__",  (PyCFunction)unicode_getnewargs, METH_NOARGS},  | 
