[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 */
  };