diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 445049d..7d0a106 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -1098,70 +1098,70 @@
 
 
 #define CHECKSIZE(BUF, OFF, MIN) { \
-	int need = *(OFF) + MIN; \
-	if (need >= PyString_GET_SIZE(*(BUF))) { \
-		int newsize = PyString_GET_SIZE(*(BUF)) * 2; \
-		if (newsize < need) \
-			newsize = need; \
-		if (_PyString_Resize((BUF), newsize) < 0) \
-			return 0; \
-	} \
-} 
+        int need = *(OFF) + MIN; \
+        if (need >= PyString_GET_SIZE(*(BUF))) { \
+                int newsize = PyString_GET_SIZE(*(BUF)) * 2; \
+                if (newsize < need) \
+                        newsize = need; \
+                if (_PyString_Resize((BUF), newsize) < 0) \
+                        return 0; \
+        } \
+}
 
-static int 
+static int
 marshal_write_int(PyObject **buf, int *offset, int x)
 {
-	char *s;
+        char *s;
 
-	CHECKSIZE(buf, offset, 4)
-	s = PyString_AS_STRING(*buf) + (*offset);
-	s[0] = (x & 0xff);
-	s[1] = (x >> 8) & 0xff;
-	s[2] = (x >> 16) & 0xff;
-	s[3] = (x >> 24) & 0xff;
-	*offset += 4;
-	return 1;
+        CHECKSIZE(buf, offset, 4)
+        s = PyString_AS_STRING(*buf) + (*offset);
+        s[0] = (x & 0xff);
+        s[1] = (x >> 8) & 0xff;
+        s[2] = (x >> 16) & 0xff;
+        s[3] = (x >> 24) & 0xff;
+        *offset += 4;
+        return 1;
 }
 
-static int 
+static int
 marshal_write_bool(PyObject **buf, int *offset, bool b)
 {
-	if (b)
-		marshal_write_int(buf, offset, 1);
-	else
-		marshal_write_int(buf, offset, 0);
-	return 1;
+        if (b)
+                marshal_write_int(buf, offset, 1);
+        else
+                marshal_write_int(buf, offset, 0);
+        return 1;
 }
 
-static int 
+static int
 marshal_write_identifier(PyObject **buf, int *offset, identifier id)
 {
-	int l = PyString_GET_SIZE(id);
-	marshal_write_int(buf, offset, l);
-	CHECKSIZE(buf, offset, l);
-	memcpy(PyString_AS_STRING(*buf) + *offset,
-	       PyString_AS_STRING(id), l);
-	*offset += l;
-	return 1;
+        int l = PyString_GET_SIZE(id);
+        marshal_write_int(buf, offset, l);
+        CHECKSIZE(buf, offset, l);
+        memcpy(PyString_AS_STRING(*buf) + *offset,
+               PyString_AS_STRING(id), l);
+        *offset += l;
+        return 1;
 }
 
-static int 
+static int
 marshal_write_string(PyObject **buf, int *offset, string s)
 {
-	int len = PyString_GET_SIZE(s);
-	marshal_write_int(buf, offset, len);
-	CHECKSIZE(buf, offset, len);
-	memcpy(PyString_AS_STRING(*buf) + *offset,
-	       PyString_AS_STRING(s), len);
-	*offset += len;
-	return 1;
+        int len = PyString_GET_SIZE(s);
+        marshal_write_int(buf, offset, len);
+        CHECKSIZE(buf, offset, len);
+        memcpy(PyString_AS_STRING(*buf) + *offset,
+               PyString_AS_STRING(s), len);
+        *offset += len;
+        return 1;
 }
 
-static int 
+static int
 marshal_write_object(PyObject **buf, int *offset, object s)
 {
-	/* XXX */
-	return 0;
+        /* XXX */
+        return 0;
 }
 
 
