diff Python/compile.c @ 14382:2d6cf68aa64a legacy-trunk

changed \x to consume exactly two hex digits. implements PEP-223 for 8-bit strings.
author Fredrik Lundh <fredrik@pythonware.com>
date Sat, 02 Sep 2000 20:11:27 +0000
parents 6f6f965c5e2d
children c3c49859e80b
line wrap: on
line diff
--- a/Python/compile.c	Sat Sep 02 16:36:57 2000 +0000
+++ b/Python/compile.c	Sat Sep 02 20:11:27 2000 +0000
@@ -873,10 +873,11 @@
 			return PyUnicode_DecodeUnicodeEscape(
 				s, len, NULL);
 	}
-	else if (rawmode || strchr(s, '\\') == NULL) {
+	if (rawmode || strchr(s, '\\') == NULL)
 		return PyString_FromStringAndSize(s, len);
-	}
 	v = PyString_FromStringAndSize((char *)NULL, len);
+	if (v == NULL)
+		return NULL;
 	p = buf = PyString_AsString(v);
 	end = s + len;
 	while (s < end) {
@@ -909,24 +910,35 @@
 			*p++ = c;
 			break;
 		case 'x':
-			if (isxdigit(Py_CHARMASK(*s))) {
+			if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
 				unsigned int x = 0;
-				do {
-					c = Py_CHARMASK(*s);
-					s++;
-					x = (x<<4) & ~0xF;
-					if (isdigit(c))
-						x += c - '0';
-					else if (islower(c))
-						x += 10 + c - 'a';
-					else
-						x += 10 + c - 'A';
-				} while (isxdigit(Py_CHARMASK(*s)));
+				c = Py_CHARMASK(*s);
+				s++;
+				if (isdigit(c))
+					x = c - '0';
+				else if (islower(c))
+					x = 10 + c - 'a';
+				else
+					x = 10 + c - 'A';
+				x = x << 4;
+				c = Py_CHARMASK(*s);
+				s++;
+				if (isdigit(c))
+					x += c - '0';
+				else if (islower(c))
+					x += 10 + c - 'a';
+				else
+					x += 10 + c - 'A';
 				*p++ = x;
 				break;
 			}
-		/* FALLTHROUGH */
-		default: *p++ = '\\'; *p++ = s[-1]; break;
+			PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
+			Py_DECREF(v);
+			return NULL;
+		default:
+			*p++ = '\\';
+			*p++ = s[-1];
+			break;
 		}
 	}
 	_PyString_Resize(&v, (int)(p - buf));