use Py_CHARMASK; and don't check for neg. float to the float power here
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index c7bdbed..60dcca9 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -136,7 +136,7 @@
 	for (; *cp != '\0'; cp++) {
 		/* Any non-digit means it's not an integer;
 		   this takes care of NAN and INF as well. */
-		if (!isdigit(*cp))
+		if (!isdigit(Py_CHARMASK(*cp)))
 			break;
 	}
 	if (*cp == '\0') {
@@ -330,10 +330,6 @@
 		}
 		return newfloatobject(0.0);
 	}
-	if (iv < 0.0) {
-		err_setstr(ValueError, "negative float to float power");
-		return NULL;
-	}
 	errno = 0;
 	ix = pow(iv, iw);
 	CHECK(ix);
diff --git a/Objects/longobject.c b/Objects/longobject.c
index b9935b0..9c2dcf8 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -377,7 +377,7 @@
 		err_setstr(ValueError, "invalid base for long literal");
 		return NULL;
 	}
-	while (*str != '\0' && isspace(*str))
+	while (*str != '\0' && isspace(Py_CHARMASK(*str)))
 		str++;
 	if (*str == '+')
 		++str;
@@ -385,7 +385,7 @@
 		++str;
 		sign = -1;
 	}
-	while (*str != '\0' && isspace(*str))
+	while (*str != '\0' && isspace(Py_CHARMASK(*str)))
 		str++;
 	if (base == 0) {
 		if (str[0] != '0')
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index d9366ae..7df894e 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -749,10 +749,10 @@
 				if (--fmtcnt >= 0)
 					c = *fmt++;
 			}
-			else if (isdigit(c)) {
+			else if (c >= 0 && isdigit(c)) {
 				width = c - '0';
 				while (--fmtcnt >= 0) {
-					c = *fmt++;
+					c = Py_CHARMASK(*fmt++);
 					if (!isdigit(c))
 						break;
 					if ((width*10) / 10 != width) {
@@ -782,10 +782,10 @@
 					if (--fmtcnt >= 0)
 						c = *fmt++;
 				}
-				else if (isdigit(c)) {
+				else if (c >= 0 && isdigit(c)) {
 					prec = c - '0';
 					while (--fmtcnt >= 0) {
-						c = *fmt++;
+						c = Py_CHARMASK(*fmt++);
 						if (!isdigit(c))
 							break;
 						if ((prec*10) / 10 != prec) {
@@ -913,7 +913,7 @@
 				--rescnt;
 				*res++ = ' ';
 			}
-                        if (dict && (argidx < arglen)) {
+                        if (dict && (argidx < arglen) && c != '%') {
                                 err_setstr(TypeError,
                                            "not all arguments converted");
                                 goto error;