summaryrefslogtreecommitdiffstats
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2000-03-10 23:00:52 (GMT)
committerGuido van Rossum <guido@python.org>2000-03-10 23:00:52 (GMT)
commit09095f3f61b5672a529a9c5d7e17bf3e307a0364 (patch)
tree78d86f017681df87f79ff70641e8ec49a9f6a08b /Python/bltinmodule.c
parentfeee4b994fa4e1ee3d86670f488d75ee94440da0 (diff)
downloadcpython-09095f3f61b5672a529a9c5d7e17bf3e307a0364.zip
cpython-09095f3f61b5672a529a9c5d7e17bf3e307a0364.tar.gz
cpython-09095f3f61b5672a529a9c5d7e17bf3e307a0364.tar.bz2
Marc-Andre Lemburg: added new builtin functions unicode() and
unichr(); changed ord() to support Unicode strings; added new exception UnicodeError; fixed a typo in doc string for buffer().
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r--Python/bltinmodule.c83
1 files changed, 78 insertions, 5 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 3fafa5d..90af888 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -152,7 +152,7 @@ builtin_buffer(self, args)
}
static char buffer_doc[] =
-"buffer(object [, offset[, size]) -> object\n\
+"buffer(object [, offset[, size]]) -> object\n\
\n\
Creates a new buffer object which references the given object.\n\
The buffer will reference a slice of the target object from the\n\
@@ -161,6 +161,30 @@ extend to the end of the target object (or with the specified size).";
static PyObject *
+builtin_unicode(self, args)
+ PyObject *self;
+ PyObject *args;
+{
+ char *s;
+ int len;
+ char *encoding = NULL;
+ char *errors = NULL;
+
+ if ( !PyArg_ParseTuple(args, "s#|ss:unicode", &s, &len,
+ &encoding, &errors) )
+ return NULL;
+ return PyUnicode_Decode(s, len, encoding, errors);
+}
+
+static char unicode_doc[] =
+"unicode(string [, encoding[, errors]]) -> object\n\
+\n\
+Creates a new unicode object from the given encoded string.\n\
+encoding defaults to 'utf-8' and errors, defining the error handling,\n\
+to 'strict'.";
+
+
+static PyObject *
builtin_callable(self, args)
PyObject *self;
PyObject *args;
@@ -312,6 +336,31 @@ Return a string of one character with ordinal i; 0 <= i < 256.";
static PyObject *
+builtin_unichr(self, args)
+ PyObject *self;
+ PyObject *args;
+{
+ long x;
+ Py_UNICODE s[1];
+
+ if (!PyArg_ParseTuple(args, "l:unichr", &x))
+ return NULL;
+ if (x < 0 || x >= 65536) {
+ PyErr_SetString(PyExc_ValueError,
+ "unichr() arg not in range(65536)");
+ return NULL;
+ }
+ s[0] = (Py_UNICODE)x;
+ return PyUnicode_FromUnicode(s, 1);
+}
+
+static char unichr_doc[] =
+"unichr(i) -> unicode character\n\
+\n\
+Return a unicode string of one character with ordinal i; 0 <= i < 65536.";
+
+
+static PyObject *
builtin_cmp(self, args)
PyObject *self;
PyObject *args;
@@ -1541,17 +1590,29 @@ builtin_ord(self, args)
PyObject *self;
PyObject *args;
{
- char c;
+ PyObject *obj;
+ long ord;
- if (!PyArg_ParseTuple(args, "c:ord", &c))
+ if (!PyArg_ParseTuple(args, "O:ord", &obj))
return NULL;
- return PyInt_FromLong((long)(c & 0xff));
+
+ if (PyString_Check(obj) && PyString_GET_SIZE(obj) == 1)
+ ord = (long)((unsigned char)*PyString_AS_STRING(obj));
+ else if (PyUnicode_Check(obj) && PyUnicode_GET_SIZE(obj) == 1)
+ ord = (long)*PyUnicode_AS_UNICODE(obj);
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a string or unicode character");
+ return NULL;
+ }
+
+ return PyInt_FromLong(ord);
}
static char ord_doc[] =
"ord(c) -> integer\n\
\n\
-Return the integer ordinal of a one character string.";
+Return the integer ordinal of a one character [unicode] string.";
static PyObject *
@@ -2227,6 +2288,8 @@ static PyMethodDef builtin_methods[] = {
{"str", builtin_str, 1, str_doc},
{"tuple", builtin_tuple, 1, tuple_doc},
{"type", builtin_type, 1, type_doc},
+ {"unicode", builtin_unicode, 1, unicode_doc},
+ {"unichr", builtin_unichr, 1, unichr_doc},
{"vars", builtin_vars, 1, vars_doc},
{"xrange", builtin_xrange, 1, xrange_doc},
{NULL, NULL},
@@ -2259,6 +2322,7 @@ PyObject *PyExc_SyntaxError;
PyObject *PyExc_SystemError;
PyObject *PyExc_SystemExit;
PyObject *PyExc_UnboundLocalError;
+PyObject *PyExc_UnicodeError;
PyObject *PyExc_TypeError;
PyObject *PyExc_ValueError;
PyObject *PyExc_ZeroDivisionError;
@@ -2304,6 +2368,7 @@ bltin_exc[] = {
{"SystemError", &PyExc_SystemError, 1},
{"SystemExit", &PyExc_SystemExit, 1},
{"UnboundLocalError", &PyExc_UnboundLocalError, 1},
+ {"UnicodeError", &PyExc_UnicodeError, 1},
{"TypeError", &PyExc_TypeError, 1},
{"ValueError", &PyExc_ValueError, 1},
#ifdef MS_WINDOWS
@@ -2467,6 +2532,14 @@ initerrors(dict)
PyExc_NameError) != 0)
Py_FatalError("Cannot create string-based exceptions");
+ /* Make UnicodeError an alias for ValueError */
+ Py_INCREF(PyExc_ValueError);
+ Py_DECREF(PyExc_UnicodeError);
+ PyExc_UnicodeError = PyExc_ValueError;
+ if (PyDict_SetItemString(dict, "UnicodeError",
+ PyExc_ValueError) != 0)
+ Py_FatalError("Cannot create string-based exceptions");
+
/* missing from the StandardError tuple: Exception, StandardError,
* and SystemExit
*/