[Python-checkins] python/dist/src/Objects unicodeobject.c,2.161,2.162

lemburg@users.sourceforge.net lemburg@users.sourceforge.net
2002年8月11日 05:23:06 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv573/Objects
Modified Files:
	unicodeobject.c 
Log Message:
Add C API PyUnicode_FromOrdinal() which exposes unichr() at C level.
u'%c' will now raise a ValueError in case the argument is an
integer outside the valid range of Unicode code point ordinals.
Closes SF bug #593581.
Index: unicodeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/unicodeobject.c,v
retrieving revision 2.161
retrieving revision 2.162
diff -C2 -d -r2.161 -r2.162
*** unicodeobject.c	11 Aug 2002 04:24:11 -0000	2.161
--- unicodeobject.c	11 Aug 2002 12:23:04 -0000	2.162
***************
*** 391,394 ****
--- 391,433 ----
 #endif
 
+ PyObject *PyUnicode_FromOrdinal(int ordinal)
+ {
+ Py_UNICODE s[2];
+ 
+ #ifdef Py_UNICODE_WIDE
+ if (ordinal < 0 || ordinal > 0x10ffff) {
+ 	PyErr_SetString(PyExc_ValueError,
+ 			"unichr() arg not in range(0x110000) "
+ 			"(wide Python build)");
+ 	return NULL;
+ }
+ #else
+ if (ordinal < 0 || ordinal > 0xffff) {
+ 	PyErr_SetString(PyExc_ValueError,
+ 			"unichr() arg not in range(0x10000) "
+ 			"(narrow Python build)");
+ 	return NULL;
+ }
+ #endif
+ 
+ if (ordinal <= 0xffff) {
+ 	/* UCS-2 character */
+ 	s[0] = (Py_UNICODE) ordinal;
+ 	return PyUnicode_FromUnicode(s, 1);
+ }
+ else {
+ #ifndef Py_UNICODE_WIDE
+ 	/* UCS-4 character. store as two surrogate characters */
+ 	ordinal -= 0x10000L;
+ 	s[0] = 0xD800 + (Py_UNICODE) (ordinal >> 10);
+ 	s[1] = 0xDC00 + (Py_UNICODE) (ordinal & 0x03FF);
+ 	return PyUnicode_FromUnicode(s, 2);
+ #else
+ 	s[0] = (Py_UNICODE)ordinal;
+ 	return PyUnicode_FromUnicode(s, 1);
+ #endif
+ }
+ }
+ 
 PyObject *PyUnicode_FromObject(register PyObject *obj)
 {
***************
*** 5374,5378 ****
 	if (x == -1 && PyErr_Occurred())
 	 goto onError;
! 	buf[0] = (char) x;
 }
 buf[1] = '0円';
--- 5413,5432 ----
 	if (x == -1 && PyErr_Occurred())
 	 goto onError;
! #ifdef Py_UNICODE_WIDE
! 	if (x < 0 || x > 0x10ffff) {
! 	 PyErr_SetString(PyExc_ValueError,
! 			 "%c arg not in range(0x110000) "
! 			 "(wide Python build)");
! 	 return -1;
! 	}
! #else
! 	if (x < 0 || x > 0xffff) {
! 	 PyErr_SetString(PyExc_ValueError,
! 			 "%c arg not in range(0x10000) "
! 			 "(narrow Python build)");
! 	 return -1;
! 	}
! #endif
! 	buf[0] = (Py_UNICODE) x;
 }
 buf[1] = '0円';

AltStyle によって変換されたページ (->オリジナル) /