Makefile uses $> more often; cgen supports filename argument; added
lower, upper and swapcase to strop; cosmetics.
diff --git a/Modules/cgen.py b/Modules/cgen.py
index d6e9c96..ea46263 100644
--- a/Modules/cgen.py
+++ b/Modules/cgen.py
@@ -376,6 +376,11 @@
 	return 'mknew' + type + 'object(' + arg + ')'
 
 
+# Open optional file argument
+if sys.argv[1:]:
+	sys.stdin = open(sys.argv[1], 'r')
+
+
 # Input line number
 lno = 0
 
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index cc2e26a..835c7db 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -181,13 +181,121 @@
 }
 
 
+#include <ctype.h>
+
+static object *
+strop_lower(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	char *s;
+	int i, n;
+	object *new;
+	int changed;
+
+	if (!getargs(args, "s#", &s, &n))
+		return NULL;
+	new = newsizedstringobject(s, n);
+	if (new == NULL)
+		return NULL;
+	s = getstringvalue(new);
+	changed = 0;
+	for (i = 0; i < n; i++) {
+		char c = s[i];
+		if (isupper(c)) {
+			changed = 1;
+			s[i] = tolower(c);
+		}
+	}
+	if (!changed) {
+		DECREF(new);
+		INCREF(args);
+		return args;
+	}
+	return new;
+}
+
+
+static object *
+strop_upper(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	char *s;
+	int i, n;
+	object *new;
+	int changed;
+
+	if (!getargs(args, "s#", &s, &n))
+		return NULL;
+	new = newsizedstringobject(s, n);
+	if (new == NULL)
+		return NULL;
+	s = getstringvalue(new);
+	changed = 0;
+	for (i = 0; i < n; i++) {
+		char c = s[i];
+		if (islower(c)) {
+			changed = 1;
+			s[i] = toupper(c);
+		}
+	}
+	if (!changed) {
+		DECREF(new);
+		INCREF(args);
+		return args;
+	}
+	return new;
+}
+
+
+static object *
+strop_swapcase(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	char *s;
+	int i, n;
+	object *new;
+	int changed;
+
+	if (!getargs(args, "s#", &s, &n))
+		return NULL;
+	new = newsizedstringobject(s, n);
+	if (new == NULL)
+		return NULL;
+	s = getstringvalue(new);
+	changed = 0;
+	for (i = 0; i < n; i++) {
+		char c = s[i];
+		if (islower(c)) {
+			changed = 1;
+			s[i] = toupper(c);
+		}
+		else if (isupper(c)) {
+			changed = 1;
+			s[i] = tolower(c);
+		}
+	}
+	if (!changed) {
+		DECREF(new);
+		INCREF(args);
+		return args;
+	}
+	return new;
+}
+
+
 /* List of functions defined in the module */
 
 static struct methodlist strop_methods[] = {
 	{"index",	strop_index},
+	{"lower",	strop_lower},
 	{"split",	strop_split},
 	{"splitfields",	strop_splitfields},
 	{"strip",	strop_strip},
+	{"swapcase",	strop_swapcase},
+	{"upper",	strop_upper},
 	{NULL,		NULL}	/* sentinel */
 };