[Python-checkins] CVS: python/dist/src/Objects abstract.c,2.32,2.33 fileobject.c,2.70,2.71 floatobject.c,2.54,2.55 intobject.c,2.38,2.39 object.c,2.62,2.63 stringobject.c,2.57,2.58
Guido van Rossum
guido@cnri.reston.va.us
Fri, 10 Mar 2000 17:55:22 -0500 (EST)
Update of /projects/cvsroot/python/dist/src/Objects
In directory eric:/home/guido/hp/mal/py-patched/Objects
Modified Files:
abstract.c fileobject.c floatobject.c intobject.c object.c
stringobject.c
Log Message:
Many changes for Unicode, by Marc-Andre Lemburg.
Index: abstract.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/abstract.c,v
retrieving revision 2.32
retrieving revision 2.33
diff -C2 -r2.32 -r2.33
*** abstract.c 2000/03/07 15:54:45 2.32
--- abstract.c 2000/03/10 22:55:18 2.33
***************
*** 200,203 ****
--- 200,311 ----
}
+ int PyObject_AsCharBuffer(PyObject *obj,
+ const char **buffer,
+ int *buffer_len)
+ {
+ PyBufferProcs *pb;
+ const char *pp;
+ int len;
+
+ if (obj == NULL || buffer == NULL || buffer_len == NULL) {
+ null_error();
+ return -1;
+ }
+ pb = obj->ob_type->tp_as_buffer;
+ if ( pb == NULL ||
+ pb->bf_getcharbuffer == NULL ||
+ pb->bf_getsegcount == NULL ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a character buffer object");
+ goto onError;
+ }
+ if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a single-segment buffer object");
+ goto onError;
+ }
+ len = (*pb->bf_getcharbuffer)(obj,0,&pp);
+ if (len < 0)
+ goto onError;
+ *buffer = pp;
+ *buffer_len = len;
+ return 0;
+
+ onError:
+ return -1;
+ }
+
+ int PyObject_AsReadBuffer(PyObject *obj,
+ const void **buffer,
+ int *buffer_len)
+ {
+ PyBufferProcs *pb;
+ void *pp;
+ int len;
+
+ if (obj == NULL || buffer == NULL || buffer_len == NULL) {
+ null_error();
+ return -1;
+ }
+ pb = obj->ob_type->tp_as_buffer;
+ if ( pb == NULL ||
+ pb->bf_getreadbuffer == NULL ||
+ pb->bf_getsegcount == NULL ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a readable buffer object");
+ goto onError;
+ }
+ if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a single-segment buffer object");
+ goto onError;
+ }
+ len = (*pb->bf_getreadbuffer)(obj,0,&pp);
+ if (len < 0)
+ goto onError;
+ *buffer = pp;
+ *buffer_len = len;
+ return 0;
+
+ onError:
+ return -1;
+ }
+
+ int PyObject_AsWriteBuffer(PyObject *obj,
+ void **buffer,
+ int *buffer_len)
+ {
+ PyBufferProcs *pb;
+ void*pp;
+ int len;
+
+ if (obj == NULL || buffer == NULL || buffer_len == NULL) {
+ null_error();
+ return -1;
+ }
+ pb = obj->ob_type->tp_as_buffer;
+ if ( pb == NULL ||
+ pb->bf_getwritebuffer == NULL ||
+ pb->bf_getsegcount == NULL ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a writeable buffer object");
+ goto onError;
+ }
+ if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected a single-segment buffer object");
+ goto onError;
+ }
+ len = (*pb->bf_getwritebuffer)(obj,0,&pp);
+ if (len < 0)
+ goto onError;
+ *buffer = pp;
+ *buffer_len = len;
+ return 0;
+
+ onError:
+ return -1;
+ }
+
/* Operations on numbers */
***************
*** 448,451 ****
--- 556,561 ----
if (PyString_Check(v))
return PyString_Format(v, w);
+ else if (PyUnicode_Check(v))
+ return PyUnicode_Format(v, w);
BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
if (v->ob_type->tp_as_number != NULL) {
***************
*** 622,625 ****
--- 732,737 ----
{
PyNumberMethods *m;
+ const char *buffer;
+ int buffer_len;
if (o == NULL)
***************
*** 630,633 ****
--- 742,747 ----
if (m && m->nb_int)
return m->nb_int(o);
+ if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
+ return PyInt_FromString((char*)buffer, NULL, 10);
return type_error("object can't be converted to int");
***************
*** 656,670 ****
*/
static PyObject *
! long_from_string(v)
! PyObject *v;
{
! char *s, *end;
PyObject *x;
char buffer[256]; /* For errors */
! s = PyString_AS_STRING(v);
while (*s && isspace(Py_CHARMASK(*s)))
s++;
! x = PyLong_FromString(s, &end, 10);
if (x == NULL) {
if (PyErr_ExceptionMatches(PyExc_ValueError))
--- 770,786 ----
*/
static PyObject *
! long_from_string(s, len)
! const char *s;
! int len;
{
! const char *start;
! char *end;
PyObject *x;
char buffer[256]; /* For errors */
! start = s;
while (*s && isspace(Py_CHARMASK(*s)))
s++;
! x = PyLong_FromString((char*)s, &end, 10);
if (x == NULL) {
if (PyErr_ExceptionMatches(PyExc_ValueError))
***************
*** 681,685 ****
return NULL;
}
! else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for long()");
--- 797,801 ----
return NULL;
}
! else if (end != start + len) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for long()");
***************
*** 694,697 ****
--- 810,815 ----
{
PyNumberMethods *m;
+ const char *buffer;
+ int buffer_len;
if (o == NULL)
***************
*** 702,709 ****
* exception, not truncate the float.
*/
! return long_from_string(o);
m = o->ob_type->tp_as_number;
if (m && m->nb_long)
return m->nb_long(o);
return type_error("object can't be converted to long");
--- 820,830 ----
* exception, not truncate the float.
*/
! return long_from_string(PyString_AS_STRING(o),
! PyString_GET_SIZE(o));
m = o->ob_type->tp_as_number;
if (m && m->nb_long)
return m->nb_long(o);
+ if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
+ return long_from_string(buffer, buffer_len);
return type_error("object can't be converted to long");
***************
*** 718,728 ****
if (o == NULL)
return null_error();
! if (PyString_Check(o))
! return PyFloat_FromString(o, NULL);
! m = o->ob_type->tp_as_number;
! if (m && m->nb_float)
! return m->nb_float(o);
!
! return type_error("object can't be converted to float");
}
--- 839,848 ----
if (o == NULL)
return null_error();
! if (!PyString_Check(o)) {
! m = o->ob_type->tp_as_number;
! if (m && m->nb_float)
! return m->nb_float(o);
! }
! return PyFloat_FromString(o, NULL);
}
Index: fileobject.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.70
retrieving revision 2.71
diff -C2 -r2.70 -r2.71
*** fileobject.c 2000/02/29 13:59:28 2.70
--- fileobject.c 2000/03/10 22:55:18 2.71
***************
*** 76,79 ****
--- 76,81 ----
int (*f_close) Py_PROTO((FILE *));
int f_softspace; /* Flag used by 'print' command */
+ int f_binary; /* Flag which indicates whether the file is open
+ open in binary (1) or test (0) mode */
} PyFileObject;
***************
*** 113,116 ****
--- 115,122 ----
f->f_close = close;
f->f_softspace = 0;
+ if (strchr(mode,'b') != NULL)
+ f->f_binary = 1;
+ else
+ f->f_binary = 0;
if (f->f_name == NULL || f->f_mode == NULL) {
Py_DECREF(f);
***************
*** 864,868 ****
if (f->f_fp == NULL)
return err_closed();
! if (!PyArg_Parse(args, "s#", &s, &n))
return NULL;
f->f_softspace = 0;
--- 870,874 ----
if (f->f_fp == NULL)
return err_closed();
! if (!PyArg_Parse(args, f->f_binary ? "s#" : "t#", &s, &n))
return NULL;
f->f_softspace = 0;
Index: floatobject.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/floatobject.c,v
retrieving revision 2.54
retrieving revision 2.55
diff -C2 -r2.54 -r2.55
*** floatobject.c 2000/01/20 22:32:54 2.54
--- floatobject.c 2000/03/10 22:55:18 2.55
***************
*** 156,168 ****
{
extern double strtod Py_PROTO((const char *, char **));
! char *s, *last, *end;
double x;
char buffer[256]; /* For errors */
! if (!PyString_Check(v))
return NULL;
! s = PyString_AS_STRING(v);
! last = s + PyString_GET_SIZE(v);
while (*s && isspace(Py_CHARMASK(*s)))
s++;
--- 156,175 ----
{
extern double strtod Py_PROTO((const char *, char **));
! const char *s, *last, *end;
double x;
char buffer[256]; /* For errors */
+ int len;
! if (PyString_Check(v)) {
! s = PyString_AS_STRING(v);
! len = PyString_GET_SIZE(v);
! }
! else if (PyObject_AsCharBuffer(v, &s, &len)) {
! PyErr_SetString(PyExc_TypeError,
! "float() needs a string argument");
return NULL;
! }
! last = s + len;
while (*s && isspace(Py_CHARMASK(*s)))
s++;
***************
*** 173,177 ****
errno = 0;
PyFPE_START_PROTECT("PyFloat_FromString", return 0)
! x = strtod(s, &end);
PyFPE_END_PROTECT(x)
/* Believe it or not, Solaris 2.6 can move end *beyond* the null
--- 180,184 ----
errno = 0;
PyFPE_START_PROTECT("PyFloat_FromString", return 0)
! x = strtod((char *)s, (char **)&end);
PyFPE_END_PROTECT(x)
/* Believe it or not, Solaris 2.6 can move end *beyond* the null
***************
*** 186,190 ****
return NULL;
}
! else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for float()");
--- 193,197 ----
return NULL;
}
! else if (end != last) {
PyErr_SetString(PyExc_ValueError,
"null byte in argument for float()");
***************
*** 197,201 ****
}
if (pend)
! *pend = end;
return PyFloat_FromDouble(x);
}
--- 204,208 ----
}
if (pend)
! *pend = (char *)end;
return PyFloat_FromDouble(x);
}
***************
*** 786,790 ****
fprintf(stderr,
"# <float at %lx, refcnt=%d, val=%s>\n",
! p, p->ob_refcnt, buf);
}
}
--- 793,797 ----
fprintf(stderr,
"# <float at %lx, refcnt=%d, val=%s>\n",
! (long)p, p->ob_refcnt, buf);
}
}
Index: intobject.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/intobject.c,v
retrieving revision 2.38
retrieving revision 2.39
diff -C2 -r2.38 -r2.39
*** intobject.c 2000/02/15 14:51:46 2.38
--- intobject.c 2000/03/10 22:55:18 2.39
***************
*** 943,947 ****
fprintf(stderr,
"# <int at %lx, refcnt=%d, val=%ld>\n",
! p, p->ob_refcnt, p->ob_ival);
}
list = list->next;
--- 943,947 ----
fprintf(stderr,
"# <int at %lx, refcnt=%d, val=%ld>\n",
! (long)p, p->ob_refcnt, p->ob_ival);
}
list = list->next;
Index: object.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/object.c,v
retrieving revision 2.62
retrieving revision 2.63
diff -C2 -r2.62 -r2.63
*** object.c 2000/01/20 22:32:54 2.62
--- object.c 2000/03/10 22:55:18 2.63
***************
*** 190,198 ****
if (s == NULL)
ret = -1;
- else if (!PyString_Check(s)) {
- PyErr_SetString(PyExc_TypeError,
- "repr not string");
- ret = -1;
- }
else {
ret = PyObject_Print(s, fp,
--- 190,193 ----
***************
*** 235,240 ****
return PyString_FromString(buf);
}
! else
! return (*v->ob_type->tp_repr)(v);
}
--- 230,247 ----
return PyString_FromString(buf);
}
! else {
! PyObject *res;
! res = (*v->ob_type->tp_repr)(v);
! if (res == NULL)
! return NULL;
! if (!PyString_Check(res)) {
! PyErr_Format(PyExc_TypeError,
! "__repr__ returned non-string (type %s)",
! res->ob_type->tp_name);
! Py_DECREF(res);
! return NULL;
! }
! return res;
! }
}
***************
*** 243,246 ****
--- 250,255 ----
PyObject *v;
{
+ PyObject *res;
+
if (v == NULL)
return PyString_FromString("<NULL>");
***************
*** 250,257 ****
}
else if (v->ob_type->tp_str != NULL)
! return (*v->ob_type->tp_str)(v);
else {
PyObject *func;
- PyObject *res;
if (!PyInstance_Check(v) ||
(func = PyObject_GetAttrString(v, "__str__")) == NULL) {
--- 259,265 ----
}
else if (v->ob_type->tp_str != NULL)
! res = (*v->ob_type->tp_str)(v);
else {
PyObject *func;
if (!PyInstance_Check(v) ||
(func = PyObject_GetAttrString(v, "__str__")) == NULL) {
***************
*** 261,266 ****
res = PyEval_CallObject(func, (PyObject *)NULL);
Py_DECREF(func);
- return res;
}
}
--- 269,283 ----
res = PyEval_CallObject(func, (PyObject *)NULL);
Py_DECREF(func);
}
+ if (res == NULL)
+ return NULL;
+ if (!PyString_Check(res)) {
+ PyErr_Format(PyExc_TypeError,
+ "__str__ returned non-string (type %s)",
+ res->ob_type->tp_name);
+ Py_DECREF(res);
+ return NULL;
+ }
+ return res;
}
***************
*** 331,334 ****
--- 348,353 ----
}
}
+ else if (PyUnicode_Check(v) || PyUnicode_Check(w))
+ return PyUnicode_Compare(v, w);
else if (vtp->tp_as_number != NULL)
vname = "";
***************
*** 653,657 ****
{
#ifdef SLOW_UNREF_CHECK
! register PyObject *p;
#endif
if (op->ob_refcnt < 0)
--- 672,676 ----
{
#ifdef SLOW_UNREF_CHECK
! register PyObject *p;
#endif
if (op->ob_refcnt < 0)
Index: stringobject.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.57
retrieving revision 2.58
diff -C2 -r2.57 -r2.58
*** stringobject.c 2000/03/07 15:53:43 2.57
--- stringobject.c 2000/03/10 22:55:18 2.58
***************
*** 292,295 ****
--- 292,297 ----
register PyStringObject *op;
if (!PyString_Check(bb)) {
+ if (PyUnicode_Check(bb))
+ return PyUnicode_Concat((PyObject *)a, bb);
PyErr_BadArgument();
return NULL;
***************
*** 561,566 ****
int maxsplit;
[...1356 lines suppressed...]
{"lstrip", (PyCFunction)string_lstrip, 1, lstrip__doc__},
{"replace", (PyCFunction)string_replace, 1, replace__doc__},
{"rfind", (PyCFunction)string_rfind, 1, rfind__doc__},
{"rindex", (PyCFunction)string_rindex, 1, rindex__doc__},
{"rstrip", (PyCFunction)string_rstrip, 1, rstrip__doc__},
{"startswith", (PyCFunction)string_startswith, 1, startswith__doc__},
{"strip", (PyCFunction)string_strip, 1, strip__doc__},
{"swapcase", (PyCFunction)string_swapcase, 1, swapcase__doc__},
! {"translate", (PyCFunction)string_translate, 1, translate__doc__},
! {"title", (PyCFunction)string_title, 1, title__doc__},
! {"ljust", (PyCFunction)string_ljust, 1, ljust__doc__},
! {"rjust", (PyCFunction)string_rjust, 1, rjust__doc__},
! {"center", (PyCFunction)string_center, 1, center__doc__},
! {"expandtabs", (PyCFunction)string_expandtabs, 1, expandtabs__doc__},
! {"splitlines", (PyCFunction)string_splitlines, 1, splitlines__doc__},
! #if 0
! {"zfill", (PyCFunction)string_zfill, 1, zfill__doc__},
! #endif
{NULL, NULL} /* sentinel */
};