Doc strings by Chris Petrilli.
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 6920cbf..5f44107 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -711,6 +711,12 @@
 	return ins(self, i, v);
 }
 
+static char insert_doc [] =
+"insert (i,x)\n\
+\n\
+Insert a new item x into the array before position i.";
+
+
 static PyObject *
 array_buffer_info(self, args)
 	arrayobject *self;
@@ -720,6 +726,13 @@
 			     (long)(self->ob_item), (long)(self->ob_size));
 }
 
+static char buffer_info_doc [] =
+"buffer_info -> (address, length)\n\
+\n\
+Return a tuple (address, length) giving the current memory address and\n\
+the length in bytes of the buffer used to hold array's contents.";
+
+
 static PyObject *
 array_append(self, args)
 	arrayobject *self;
@@ -731,6 +744,12 @@
 	return ins(self, (int) self->ob_size, v);
 }
 
+static char append_doc [] =
+"append(x)\n\
+\n\
+Append new value x to the end of the array.";
+
+
 static PyObject *
 array_byteswap(self, args)
 	arrayobject *self;
@@ -783,6 +802,12 @@
 	return Py_None;
 }
 
+static char byteswap_doc [] =
+"byteswap(x)\n\
+\n\
+Byteswap all items of the array.  This is only supported for integer\n\
+values of x, which determines the size of the blocks swapped.";
+
 static PyObject *
 array_reverse(self, args)
 	arrayobject *self;
@@ -812,6 +837,11 @@
 	return Py_None;
 }
 
+static char reverse_doc [] =
+"reverse()\n\
+\n\
+Reverse the order of the items in the array.";
+
 /* The following routines were adapted from listobject.c but not converted.
    To make them work you will have to work! */
 
@@ -927,6 +957,13 @@
 	return Py_None;
 }
 
+static char fromfile_doc [] =
+"fromfile(f, n)\n\
+\n\
+Read n objects from the file object f and append them to the end of the\n\
+array.  Also called as read.";
+
+
 static PyObject *
 array_tofile(self, args)
 	arrayobject *self;
@@ -953,6 +990,13 @@
 	return Py_None;
 }
 
+static char tofile_doc [] =
+"tofile(f)\n\
+\n\
+Write all items (as machine values) to the file object f.  Also called as\n\
+write.";
+
+
 static PyObject *
 array_fromlist(self, args)
 	arrayobject *self;
@@ -994,6 +1038,12 @@
 	return Py_None;
 }
 
+static char fromlist_doc [] =
+"fromlist(list)\n\
+\n\
+Append items to array from list.";
+
+
 static PyObject *
 array_tolist(self, args)
 	arrayobject *self;
@@ -1014,6 +1064,12 @@
 	return list;
 }
 
+static char tolist_doc [] =
+"tolist() -> list
+\n\
+Convert array to an ordinary list with the same items.";
+
+
 static PyObject *
 array_fromstring(self, args)
 	arrayobject *self;
@@ -1046,6 +1102,13 @@
 	return Py_None;
 }
 
+static char fromstring_doc [] =
+"fromstring(string)\n\
+\n\
+Appends items from the string, interpreting it as an array of machine\n\
+values,as if it had been read from a file using the fromfile() method).";
+
+
 static PyObject *
 array_tostring(self, args)
 	arrayobject *self;
@@ -1057,24 +1120,30 @@
 				    self->ob_size * self->ob_descr->itemsize);
 }
 
-static PyMethodDef array_methods[] = {
-	{"append",	(PyCFunction)array_append},
-	{"buffer_info", (PyCFunction)array_buffer_info},
-	{"byteswap",	(PyCFunction)array_byteswap},
+static char tostring_doc [] =
+"tostring() -> string\n\
+\n\
+Convert the array to an array of machine values and return the string\n\
+representation.";
+
+PyMethodDef array_methods[] = {
+	{"append",	(PyCFunction)array_append, 0, append_doc},
+	{"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
+	{"byteswap",	(PyCFunction)array_byteswap, 0, byteswap_doc},
 /*	{"count",	(method)array_count},*/
-	{"fromfile",	(PyCFunction)array_fromfile},
-	{"fromlist",	(PyCFunction)array_fromlist},
-	{"fromstring",	(PyCFunction)array_fromstring},
+	{"fromfile",	(PyCFunction)array_fromfile, 0, fromfile_doc},
+	{"fromlist",	(PyCFunction)array_fromlist, 0, fromlist_doc},
+	{"fromstring",	(PyCFunction)array_fromstring, 0, fromstring_doc},
 /*	{"index",	(method)array_index},*/
-	{"insert",	(PyCFunction)array_insert},
-	{"read",	(PyCFunction)array_fromfile},
+	{"insert",	(PyCFunction)array_insert, 0, insert_doc},
+	{"read",	(PyCFunction)array_fromfile, 0, fromfile_doc},
 /*	{"remove",	(method)array_remove},*/
-	{"reverse",	(PyCFunction)array_reverse},
+	{"reverse",	(PyCFunction)array_reverse, 0, reverse_doc},
 /*	{"sort",	(method)array_sort},*/
-	{"tofile",	(PyCFunction)array_tofile},
-	{"tolist",	(PyCFunction)array_tolist},
-	{"tostring",	(PyCFunction)array_tostring},
-	{"write",	(PyCFunction)array_tofile},
+	{"tofile",	(PyCFunction)array_tofile, 0, tofile_doc},
+	{"tolist",	(PyCFunction)array_tolist, 0, tolist_doc},
+	{"tostring",	(PyCFunction)array_tostring, 0, tostring_doc},
+	{"write",	(PyCFunction)array_tofile, 0, tofile_doc},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -1186,7 +1255,8 @@
 	const void **ptr;
 {
 	if ( index != 0 ) {
-		PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
+		PyErr_SetString(PyExc_SystemError,
+				"Accessing non-existent array segment");
 		return -1;
 	}
 	*ptr = (void *)self->ob_item;
@@ -1200,7 +1270,8 @@
 	const void **ptr;
 {
 	if ( index != 0 ) {
-		PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
+		PyErr_SetString(PyExc_SystemError,
+				"Accessing non-existent array segment");
 		return -1;
 	}
 	*ptr = (void *)self->ob_item;
@@ -1234,30 +1305,6 @@
 };
 
 
-statichere PyTypeObject Arraytype = {
-	PyObject_HEAD_INIT(&PyType_Type)
-	0,
-	"array",
-	sizeof(arrayobject),
-	0,
-	(destructor)array_dealloc,	/*tp_dealloc*/
-	(printfunc)array_print,		/*tp_print*/
-	(getattrfunc)array_getattr,	/*tp_getattr*/
-	0,				/*tp_setattr*/
-	(cmpfunc)array_compare,		/*tp_compare*/
-	(reprfunc)array_repr,		/*tp_repr*/
-	0,				/*tp_as_number*/
-	&array_as_sequence,		/*tp_as_sequence*/
-	0,				/*tp_as_mapping*/
-	0, 				/*tp_hash*/
-	0,				/*tp_call*/
-	0,				/*tp_str*/
-	0,				/*tp_getattro*/
-	0,				/*tp_setattro*/
-	&array_as_buffer,		/*tp_as_buffer*/
-	0,				/*tp_xxx4*/
-	0,				/*tp_doc*/
-};
 
 
 static PyObject *
@@ -1317,16 +1364,104 @@
 	return NULL;
 }
 
+static char a_array_doc [] =
+"array(typecode [, initializer]) -> array\n\
+\n\
+Return a new array whose items are restricted by typecode, and\n\
+initialized from the optional initializer value, which must be a list\n\
+or a string.";
+
 static PyMethodDef a_methods[] = {
-	{"array",	a_array},
+	{"array",	a_array, 0, a_array_doc},
 	{NULL,		NULL}		/* sentinel */
 };
 
+static char module_doc [] =
+"This module defines a new object type which can efficiently represent\n\
+an array of basic values: characters, integers, floating point\n\
+numbers.  Arrays are sequence types and behave very much like lists,\n\
+except that the type of objects stored in them is constrained.  The\n\
+type is specified at object creation time by using a type code, which\n\
+is a single character.  The following type codes are defined:\n\
+\n\
+    Type code   C Type             Minimum size in bytes \n\
+    'c'         character          1 \n\
+    'b'         signed integer     1 \n\
+    'B'         unsigned integer   1 \n\
+    'h'         signed integer     2 \n\
+    'H'         unsigned integer   2 \n\
+    'i'         signed integer     2 \n\
+    'I'         unsigned integer   2 \n\
+    'l'         signed integer     4 \n\
+    'L'         unsigned integer   4 \n\
+    'f'         floating point     4 \n\
+    'd'         floating point     8 \n\
+\n\
+Functions:\n\
+\n\
+array(typecode [, initializer]) -- create a new array\n\
+\n\
+Special Objects:\n\
+\n\
+ArrayType -- type object for array objects\n\
+";
+
+static char arraytype_doc [] =
+"An array represents basic values and behave very much like lists, except\n\
+the type of objects stored in them is constrained.\n\
+\n\
+Methods:\n\
+\n\
+append() -- append a new item to the end of the array\n\
+buffer_info() -- return information giving the current memory info\n\
+byteswap() -- byteswap all the items of the array\n\
+fromfile() -- read items from a file object\n\
+fromlist() -- append items from the list\n\
+fromstring() -- append items from the string\n\
+insert() -- insert a new item into the array at a provided position\n\
+read() -- DEPRECATED, use fromfile()\n\
+reverse() -- reverse the order of the items in the array\n\
+tofile() -- write all items to a file object\n\
+tolist() -- return the array converted to an ordinary list\n\
+tostring() -- return the array converted to a string\n\
+write() -- DEPRECATED, use tofile()\n\
+\n\
+Variables:\n\
+\n\
+typecode -- the typecode character used to create the array\n\
+itemsize -- the length in bytes of one array item\n\
+";
+
+statichere PyTypeObject Arraytype = {
+	PyObject_HEAD_INIT(&PyType_Type)
+	0,
+	"array",
+	sizeof(arrayobject),
+	0,
+	(destructor)array_dealloc,	/*tp_dealloc*/
+	(printfunc)array_print,		/*tp_print*/
+	(getattrfunc)array_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	(cmpfunc)array_compare,		/*tp_compare*/
+	(reprfunc)array_repr,		/*tp_repr*/
+	0,				/*tp_as_number*/
+	&array_as_sequence,		/*tp_as_sequence*/
+	0,				/*tp_as_mapping*/
+	0, 				/*tp_hash*/
+	0,				/*tp_call*/
+	0,				/*tp_str*/
+	0,				/*tp_getattro*/
+	0,				/*tp_setattro*/
+	&array_as_buffer,		/*tp_as_buffer*/
+	0,				/*tp_xxx4*/
+	arraytype_doc,			/*tp_doc*/
+};
+
 void
 initarray()
 {
 	PyObject *m, *d;
-	m = Py_InitModule("array", a_methods);
+	m = Py_InitModule3("array", a_methods, module_doc);
 	d = PyModule_GetDict(m);
 	if (PyDict_SetItemString(d, "ArrayType",
 				 (PyObject *)&Arraytype) != 0)