* pythonrun.c: Print exception type+arg *after* stack trace instead of
  before it.
* ceval.c, object.c: moved testbool() to object.c (now extern visible)
* stringobject.c: fix bugs in and rationalize string resize in formatstring()
* tokenizer.[ch]: fix non-working code for lines longer than BUFSIZ
diff --git a/Objects/object.c b/Objects/object.c
index 9a8d4b3..e28158e 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -213,6 +213,29 @@
 	}
 }
 
+/* Test a value used as condition, e.g., in a for or if statement.
+   Return -1 if an error occurred */
+
+int
+testbool(v)
+	object *v;
+{
+	int res;
+	if (v == None)
+		res = 0;
+	else if (v->ob_type->tp_as_number != NULL)
+		res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
+	else if (v->ob_type->tp_as_mapping != NULL)
+		res = (*v->ob_type->tp_as_mapping->mp_length)(v);
+	else if (v->ob_type->tp_as_sequence != NULL)
+		res = (*v->ob_type->tp_as_sequence->sq_length)(v);
+	else
+		res = 1;
+	if (res > 0)
+		res = 1;
+	return res;
+}
+
 
 /*
 NoObject is usable as a non-NULL undefined value, used by the macro None.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 5c7345d..33fe485 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -491,13 +491,13 @@
 		err_badcall();
 		return NULL;
 	}
-	reslen = rescnt = 100;
+	fmt = getstringvalue(format);
+	fmtcnt = getstringsize(format);
+	reslen = rescnt = fmtcnt + 100;
 	result = newsizedstringobject((char *)NULL, reslen);
 	if (result == NULL)
 		return NULL;
 	res = getstringvalue(result);
-	fmt = getstringvalue(format);
-	fmtcnt = getstringsize(format);
 	if (is_tupleobject(args)) {
 		arglen = gettuplesize(args);
 		argidx = 0;
@@ -509,12 +509,11 @@
 	while (--fmtcnt >= 0) {
 		if (*fmt != '%') {
 			if (--rescnt < 0) {
-				rescnt = reslen;
-				reslen = reslen * 2; /* Maybe less when big? */
+				rescnt = fmtcnt + 100;
+				reslen += rescnt;
 				if (resizestring(&result, reslen) < 0)
 					return NULL;
-				res = getstringvalue(result) + rescnt;
-				rescnt = reslen - rescnt;
+				res = getstringvalue(result) + reslen - rescnt;
 			}
 			*res++ = *fmt++;
 		}
@@ -692,12 +691,12 @@
 			if (width < len)
 				width = len;
 			if (rescnt < width + (sign != '\0')) {
-				rescnt = reslen;
-				reslen = reslen + width + 100;
+				reslen -= rescnt;
+				rescnt = width + fmtcnt + 100;
+				reslen += rescnt;
 				if (resizestring(&result, reslen) < 0)
 					return NULL;
-				res = getstringvalue(result) + rescnt;
-				rescnt = reslen - rescnt;
+				res = getstringvalue(result) + reslen - rescnt;
 			}
 			if (sign) {
 				*res++ = sign;
diff --git a/Objects/xxobject.c b/Objects/xxobject.c
index 2d03cfd..64e0228 100644
--- a/Objects/xxobject.c
+++ b/Objects/xxobject.c
@@ -137,4 +137,5 @@
 	0,			/*tp_as_number*/
 	0,			/*tp_as_sequence*/
 	0,			/*tp_as_mapping*/
+	0,			/*tp_hash*/
 };