Add some necessary casts; use double quotes to represent strings in
some cases.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index f66a82c..61863b6 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -67,14 +67,14 @@
 		null_strings++;
 #endif
 		INCREF(op);
-		return op;
+		return (object *)op;
 	}
 	if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) {
 #ifdef COUNT_ALLOCS
 		one_strings++;
 #endif
 		INCREF(op);
-		return op;
+		return (object *)op;
 	}
 	op = (stringobject *)
 		malloc(sizeof(stringobject) + size * sizeof(char));
@@ -110,14 +110,14 @@
 		null_strings++;
 #endif
 		INCREF(op);
-		return op;
+		return (object *)op;
 	}
 	if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) {
 #ifdef COUNT_ALLOCS
 		one_strings++;
 #endif
 		INCREF(op);
-		return op;
+		return (object *)op;
 	}
 	op = (stringobject *)
 		malloc(sizeof(stringobject) + size * sizeof(char));
@@ -179,22 +179,29 @@
 {
 	int i;
 	char c;
+	int quote;
 	/* XXX Ought to check for interrupts when writing long strings */
 	if (flags & PRINT_RAW) {
 		fwrite(op->ob_sval, 1, (int) op->ob_size, fp);
 		return 0;
 	}
-	fprintf(fp, "'");
+
+	/* figure out which quote to use; single is prefered */
+	quote = '\'';
+	if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
+		quote = '"';
+
+	fputc(quote, fp);
 	for (i = 0; i < op->ob_size; i++) {
 		c = op->ob_sval[i];
-		if (c == '\'' || c == '\\')
+		if (c == quote || c == '\\')
 			fprintf(fp, "\\%c", c);
 		else if (c < ' ' || c >= 0177)
-			fprintf(fp, "\\%03o", c&0377);
+			fprintf(fp, "\\%03o", c & 0377);
 		else
-			putc(c, fp);
+			fputc(c, fp);
 	}
-	fprintf(fp, "'");
+	fputc(quote, fp);
 	return 0;
 }
 
@@ -212,22 +219,28 @@
 		register int i;
 		register char c;
 		register char *p;
+		int quote;
+
+		/* figure out which quote to use; single is prefered */
+		quote = '\'';
+		if (strchr(op->ob_sval, '\'') && !strchr(op->ob_sval, '"'))
+			quote = '"';
+
 		p = ((stringobject *)v)->ob_sval;
-		*p++ = '\'';
+		*p++ = quote;
 		for (i = 0; i < op->ob_size; i++) {
 			c = op->ob_sval[i];
-			if (c == '\'' || c == '\\')
+			if (c == quote || c == '\\')
 				*p++ = '\\', *p++ = c;
 			else if (c < ' ' || c >= 0177) {
-				sprintf(p, "\\%03o", c&0377);
+				sprintf(p, "\\%03o", c & 0377);
 				while (*p != '\0')
 					p++;
-				
 			}
 			else
 				*p++ = c;
 		}
-		*p++ = '\'';
+		*p++ = quote;
 		*p = '\0';
 		resizestring(&v, (int) (p - ((stringobject *)v)->ob_sval));
 		return v;