Added doc string, provided by Charles Waldman (with some reformatting
and a little editing my me).
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index 6de624e..0f1ef95 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -31,6 +31,11 @@
 
 /* strop module */
 
+static char strop_module__doc__[] =
+"Common string manipulations, optimized for speed\n\
+Always use \"import string\" rather than referencing\n\
+this module directly";
+
 #include "Python.h"
 
 #ifdef HAVE_LIMITS_H
@@ -101,7 +106,6 @@
 
 				i = len;
 			}
-	
 		}
 	}
 	return list;
@@ -111,6 +115,17 @@
 }
 
 
+static char splitfields__doc__[] =
+"split(str [,sep [,maxsplit]]) -> list of strings\n\
+splitfields(str [,sep [,maxsplit]]) -> list of strings\n\
+\n\
+Return a list of the words in the string s, using sep as the\n\
+delimiter string.  If maxsplit is nonzero, splits into at most\n\
+maxsplit words If sep is not specified, any whitespace string\n\
+is a separator.  Maxsplit defaults to 0.\n\
+\n\
+(split and splitfields are synonymous)";
+
 static PyObject *
 strop_splitfields(self, args)
 	PyObject *self; /* Not used */
@@ -172,6 +187,16 @@
 }
 
 
+static char joinfields__doc__[] =
+"join(list [,sep]) -> string\n\
+joinfields(list [,sep]) -> string\n\
+\n\
+Return a string composed of the words in list, with\n\
+intervening occurences of sep.  The default separator is a\n\
+single space.\n\
+\n\
+(joinfields and join are synonymous)";
+
 static PyObject *
 strop_joinfields(self, args)
 	PyObject *self; /* Not used */
@@ -289,6 +314,16 @@
 	return res;
 }
 
+
+static char find__doc__[] =
+"find(s, sub [,start [,end]]) -> in\n\
+\n\
+Return the lowest index in s where substring sub is found,\n\
+such that sub is contained within s[start,end].  Optional\n\
+arguments start and end are interpreted as in slice notation.\n\
+\n\
+Return -1 on failure.";
+
 static PyObject *
 strop_find(self, args)
 	PyObject *self; /* Not used */
@@ -324,6 +359,15 @@
 }
 
 
+static char rfind__doc__[] =
+"rfind(s, sub [,start [,end]]) -> int\n\
+\n\
+Return the highest index in s where substring sub is found,\n\
+such that sub is contained within s[start,end].  Optional\n\
+arguments start and end are interpreted as in slice notation.\n\
+\n\
+Return -1 on failure.";
+
 static PyObject *
 strop_rfind(self, args)
 	PyObject *self; /* Not used */
@@ -358,6 +402,7 @@
 	return PyInt_FromLong(-1L);
 }
 
+
 static PyObject *
 do_strip(args, striptype)
 	PyObject *args;
@@ -376,7 +421,6 @@
 			i++;
 		}
 	}
-	
 
 	j = len;
 	if (striptype != LEFTSTRIP) {
@@ -395,6 +439,12 @@
 }
 
 
+static char strip__doc__[] =
+"strip(s) -> string\n\
+\n\
+Return a copy of the string s with leading and trailing\n\
+whitespace removed.";
+
 static PyObject *
 strop_strip(self, args)
 	PyObject *self; /* Not used */
@@ -403,6 +453,12 @@
 	return do_strip(args, BOTHSTRIP);
 }
 
+
+static char lstrip__doc__[] =
+"lstrip(s) -> string\n\
+\n\
+Return a copy of the string s with leading whitespace removed.";
+
 static PyObject *
 strop_lstrip(self, args)
 	PyObject *self; /* Not used */
@@ -411,6 +467,12 @@
 	return do_strip(args, LEFTSTRIP);
 }
 
+
+static char rstrip__doc__[] =
+"rstrip(s) -> string\n\
+\n\
+Return a copy of the string s with trailing whitespace removed.";
+
 static PyObject *
 strop_rstrip(self, args)
 	PyObject *self; /* Not used */
@@ -420,6 +482,11 @@
 }
 
 
+static char lower__doc__[] =
+"lower(s) -> string\n\
+\n\
+Return a copy of the string s converted to lowercase.";
+
 static PyObject *
 strop_lower(self, args)
 	PyObject *self; /* Not used */
@@ -455,6 +522,11 @@
 }
 
 
+static char upper__doc__[] =
+"upper(s) -> string\n\
+\n\
+Return a copy of the string s converted to uppercase.";
+
 static PyObject *
 strop_upper(self, args)
 	PyObject *self; /* Not used */
@@ -490,6 +562,12 @@
 }
 
 
+static char capitalize__doc__[] =
+"capitalize(s) -> string\n\
+\n\
+Return a copy of the string s with only its first character\n\
+capitalized.";
+
 static PyObject *
 strop_capitalize(self, args)
 	PyObject *self; /* Not used */
@@ -534,6 +612,12 @@
 }
 
 
+static char swapcase__doc__[] =
+"swapcase(s) -> string\n\
+\n\
+Return a copy of the string s with upper case characters\n\
+converted to lowercase and vice versa.";
+
 static PyObject *
 strop_swapcase(self, args)
 	PyObject *self; /* Not used */
@@ -574,6 +658,16 @@
 }
 
 
+static char atoi__doc__[] =
+"atoi(s [,base]) -> int\n\
+\n\
+Return the integer represented by the string s in the given\n\
+base, which defaults to 10.  The string s must consist of one\n\
+or more digits, possibly preceded by a sign.  If base is 0, it\n\
+is chosen from the leading characters of s, 0 for octal, 0x or\n\
+0X for hexadecimal.  If base is 16, a preceding 0x or 0X is\n\
+accepted.";
+
 static PyObject *
 strop_atoi(self, args)
 	PyObject *self; /* Not used */
@@ -622,6 +716,17 @@
 }
 
 
+static char atol__doc__[] =
+"atol(s [,base]) -> long\n\
+\n\
+Return the long integer represented by the string s in the\n\
+given base, which defaults to 10.  The string s must consist\n\
+of one or more digits, possibly preceded by a sign.  If base\n\
+is 0, it is chosen from the leading characters of s, 0 for\n\
+octal, 0x or 0X for hexadecimal.  If base is 16, a preceding\n\
+0x or 0X is accepted.  A trailing L or l is not accepted,\n\
+unless base is 0.";
+
 static PyObject *
 strop_atol(self, args)
 	PyObject *self; /* Not used */
@@ -663,6 +768,11 @@
 }
 
 
+static char atof__doc__[] =
+"atof(s) -> float\n\
+\n\
+Return the floating point number represented by the string s.";
+
 static PyObject *
 strop_atof(self, args)
 	PyObject *self; /* Not used */
@@ -701,6 +811,13 @@
 }
 
 
+static char maketrans__doc__[] =
+"maketrans(frm, to) -> string\n\
+\n\
+Return a translation table (a string of 256 bytes long)\n\
+suitable for use in string.translate.  The strings frm and to\n\
+must be of the same length.";
+
 static PyObject *
 strop_maketrans(self, args)
 	PyObject *self; /* Not used */
@@ -732,6 +849,14 @@
 }
 
 
+static char translate__doc__[] =
+"translate(s,table [,deletechars]) -> string\n\
+\n\
+Return a copy of the string s, where all characters occurring\n\
+in the optional argument deletechars are removed, and the\n\
+remaining characters have been mapped through the given\n\
+translation table, which must be a string of length 256.";
+
 static PyObject *
 strop_translate(self, args)
 	PyObject *self;
@@ -779,7 +904,7 @@
 	for (i = 0; i < 256; i++)
 		trans_table[i] = Py_CHARMASK(table[i]);
 
-	for (i = 0; i < dellen; i++) 
+	for (i = 0; i < dellen; i++)
 		trans_table[(int) Py_CHARMASK(del_table[i])] = -1;
 
 	for (i = inlen; --i >= 0; ) {
@@ -796,7 +921,7 @@
 	}
 	/* Fix the size of the resulting string */
 	if (inlen > 0 &&_PyString_Resize(&result, output-output_start))
-		return NULL; 
+		return NULL;
 	return result;
 }
 
@@ -811,7 +936,7 @@
   Locates the first occurance in the memory pointed to by MEM of the
   contents of memory pointed to by PAT.  Returns the index into MEM if
   found, or -1 if not found.  If len of PAT is greater than length of
-  MEM, the function returns -1. 
+  MEM, the function returns -1.
 */
 static int mymemfind(mem, len, pat, pat_len)
 	char *mem;
@@ -861,16 +986,16 @@
 	return nfound;
 }
 
-/* 
+/*
    mymemreplace
 
    Return a string in which all occurences of PAT in memory STR are
-   replaced with SUB. 
+   replaced with SUB.
 
    If length of PAT is less than length of STR or there are no occurences
    of PAT in STR, then the original string is returned. Otherwise, a new
    string is allocated here and returned.
-   
+
    on return, out_len is:
        the length of output string, or
        -1 if the input string is returned, or
@@ -942,7 +1067,14 @@
 }
 
 
-static PyObject*
+static char replace__doc__[] =
+"replace (str, old, new[, maxsplit]) -> string\n\
+\n\
+Return a copy of string str with all occurrences of substring\n\
+old replaced by new. If the optional argument maxsplit is\n\
+given, only the first maxsplit occurrences are replaced.";
+
+static PyObject *
 strop_replace(self, args)
 	PyObject *self;	/* Not used */
 	PyObject *args;
@@ -978,25 +1110,25 @@
 
 static PyMethodDef
 strop_methods[] = {
-	{"atof",	strop_atof},
-	{"atoi",	strop_atoi, 1},
-	{"atol",	strop_atol, 1},
-	{"capitalize",	strop_capitalize},
-	{"find",	strop_find, 1},
-	{"join",	strop_joinfields, 1},
-	{"joinfields",	strop_joinfields, 1},
-	{"lstrip",	strop_lstrip},
-	{"lower",	strop_lower},
-	{"maketrans",	strop_maketrans, 1},
-	{"replace",	strop_replace, 1},
-	{"rfind",	strop_rfind, 1},
-	{"rstrip",	strop_rstrip},
-	{"split",	strop_splitfields, 1},
-	{"splitfields",	strop_splitfields, 1},
-	{"strip",	strop_strip},
-	{"swapcase",	strop_swapcase},
-	{"translate",	strop_translate, 1},
-	{"upper",	strop_upper},
+	{"atof",	strop_atof, 1, atof__doc__},
+	{"atoi",	strop_atoi, 1, atoi__doc__},
+	{"atol",	strop_atol, 1, atol__doc__},
+	{"capitalize",	strop_capitalize, 1, capitalize__doc__},
+	{"find",	strop_find, 1, find__doc__},
+	{"join",	strop_joinfields, 1, joinfields__doc__},
+	{"joinfields",	strop_joinfields, 1, joinfields__doc__},
+	{"lstrip",	strop_lstrip, 1, lstrip__doc__},
+	{"lower",	strop_lower, 1, lower__doc__},
+	{"maketrans",	strop_maketrans, 1, maketrans__doc__},
+	{"replace",	strop_replace, 1, replace__doc__},
+	{"rfind",	strop_rfind, 1, rfind__doc__},
+	{"rstrip",	strop_rstrip, 1,rstrip__doc__},
+	{"split",	strop_splitfields, 1, splitfields__doc__},
+	{"splitfields",	strop_splitfields, 1, splitfields__doc__},
+	{"strip",	strop_strip, 1, strip__doc__},
+	{"swapcase",	strop_swapcase, 1, swapcase__doc__},
+	{"translate",	strop_translate, 1, translate__doc__},
+	{"upper",	strop_upper, 1, upper__doc__},
 	{NULL,		NULL}	/* sentinel */
 };
 
@@ -1007,7 +1139,8 @@
 	PyObject *m, *d, *s;
 	char buf[256];
 	int c, n;
-	m = Py_InitModule("strop", strop_methods);
+	m = Py_InitModule4("strop", strop_methods, strop_module__doc__,
+			   (PyObject*)NULL, PYTHON_API_VERSION);
 	d = PyModule_GetDict(m);
 
 	/* Create 'whitespace' object */