Ka-Ping Yee <ping@lfw.org>:
Changes to error messages to increase consistency & clarity.

This (mostly) closes SourceForge patch #101839.
diff --git a/Modules/dbmmodule.c b/Modules/dbmmodule.c
index 7e16d9b..6847364 100644
--- a/Modules/dbmmodule.c
+++ b/Modules/dbmmodule.c
@@ -140,7 +140,7 @@
 		if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
 			dbm_clearerr(dp->di_dbm);
 			PyErr_SetString(DbmError,
-					"Cannot add item to database");
+					"cannot add item to database");
 			return -1;
 		}
 	}
@@ -255,7 +255,7 @@
 	val.dsize = PyString_GET_SIZE(defvalue);
 	if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) {
 		dbm_clearerr(dp->di_dbm);
-		PyErr_SetString(DbmError, "Cannot add item to database");
+		PyErr_SetString(DbmError, "cannot add item to database");
 		return NULL;
 	}
 	return defvalue;
@@ -325,7 +325,7 @@
 		iflags = O_RDWR|O_CREAT|O_TRUNC;
 	else {
 		PyErr_SetString(DbmError,
-				"Flags should be one of 'r', 'w', 'c' or 'n'");
+				"arg 2 to open should be 'r', 'w', 'c', or 'n'");
 		return NULL;
 	}
         return newdbmobject(name, iflags, mode);
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index 3ffe693..e6e1456 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -508,7 +508,7 @@
         if (n != 0)
             res = parser_newastobject(n, type);
         else
-            err_string("Could not parse string.");
+            err_string("could not parse string");
     }
     return (res);
 }
@@ -611,14 +611,14 @@
         else {
             /*  This is a fragment, at best. */
             PyNode_Free(tree);
-            err_string("Parse tree does not use a valid start symbol.");
+            err_string("parse tree does not use a valid start symbol");
         }
     }
     /*  Make sure we throw an exception on all errors.  We should never
      *  get this, but we'd do well to be sure something is done.
      */
     if ((ast == 0) && !PyErr_Occurred())
-        err_string("Unspecified ast error occurred.");
+        err_string("unspecified AST error occurred");
 
     return (ast);
 }
@@ -670,7 +670,7 @@
             PyObject *temp;
 
             if ((len != 2) && (len != 3)) {
-                err_string("Terminal nodes must have 2 or 3 entries.");
+                err_string("terminal nodes must have 2 or 3 entries");
                 return 0;
             }
             temp = PySequence_GetItem(elem, 1);
@@ -678,8 +678,8 @@
                 return 0;
             if (!PyString_Check(temp)) {
                 PyErr_Format(parser_error,
-                             "Second item in terminal node must be a string,"
-                             " found %s.",
+                             "second item in terminal node must be a string,"
+                             " found %s",
                              ((PyTypeObject*)PyObject_Type(temp))->tp_name);
                 Py_DECREF(temp);
                 return 0;
@@ -691,8 +691,8 @@
                         *line_num = PyInt_AS_LONG(o);
                     else {
                         PyErr_Format(parser_error,
-                                     "Third item in terminal node must be an"
-                                     " integer, found %s.",
+                                     "third item in terminal node must be an"
+                                     " integer, found %s",
                                 ((PyTypeObject*)PyObject_Type(temp))->tp_name);
                         Py_DECREF(o);
                         Py_DECREF(temp);
@@ -713,7 +713,7 @@
              *  Throw an exception.
              */
             PyErr_SetObject(parser_error,
-                            Py_BuildValue("os", elem, "Unknown node type."));
+                            Py_BuildValue("os", elem, "unknown node type."));
             Py_XDECREF(elem);
             return (0);
         }
@@ -1566,7 +1566,7 @@
                    && validate_name(CHILD(tree, 2), NULL));
         else {
             res = 0;
-            err_string("Illegal number of children for dotted_as_name.");
+            err_string("illegal number of children for dotted_as_name");
         }
     }
     return res;
@@ -1655,7 +1655,7 @@
                && validate_expr(CHILD(tree, 1)));
 
     if (!res && !PyErr_Occurred())
-        err_string("Illegal exec statement.");
+        err_string("illegal exec statement");
     if (res && (nch > 2))
         res = (validate_name(CHILD(tree, 2), "in")
                && validate_test(CHILD(tree, 3)));
@@ -1682,7 +1682,7 @@
                && validate_test(CHILD(tree, 1)));
 
     if (!res && !PyErr_Occurred())
-        err_string("Illegal assert statement.");
+        err_string("illegal assert statement");
     if (res && (nch > 2))
         res = (validate_comma(CHILD(tree, 2))
                && validate_test(CHILD(tree, 3)));
@@ -1778,7 +1778,7 @@
                 res = ((strcmp(STR(CHILD(tree, pos)), "except") == 0)
                        || (strcmp(STR(CHILD(tree, pos)), "else") == 0));
                 if (!res)
-                    err_string("Illegal trailing triple in try statement.");
+                    err_string("illegal trailing triple in try statement");
             }
             else if (nch == (pos + 6)) {
                 res = (validate_name(CHILD(tree, pos), "except")
@@ -1912,11 +1912,11 @@
                      || (strcmp(STR(tree), "is") == 0));
               if (!res) {
                   PyErr_Format(parser_error,
-                               "Illegal operator: '%s'.", STR(tree));
+                               "illegal operator '%s'", STR(tree));
               }
               break;
           default:
-              err_string("Illegal comparison operator type.");
+              err_string("illegal comparison operator type");
               break;
         }
     }
@@ -1928,7 +1928,7 @@
                    || ((strcmp(STR(CHILD(tree, 0)), "not") == 0)
                        && (strcmp(STR(CHILD(tree, 1)), "in") == 0))));
         if (!res && !PyErr_Occurred())
-            err_string("Unknown comparison operator.");
+            err_string("unknown comparison operator");
     }
     return (res);
 }
@@ -2075,7 +2075,7 @@
         res = validate_trailer(CHILD(tree, pos++));
     if (res && (pos < nch)) {
         if (!is_even(nch - pos)) {
-            err_string("Illegal number of nodes for 'power'.");
+            err_string("illegal number of nodes for 'power'");
             return (0);
         }
         for ( ; res && (pos < (nch - 1)); pos += 2)
@@ -2532,7 +2532,7 @@
             if (res)
                 next = CHILD(tree, 0);
             else if (nch == 1)
-                err_string("Illegal flow_stmt type.");
+                err_string("illegal flow_stmt type");
             break;
             /*
              *  Compound statements.
@@ -2654,7 +2654,7 @@
 
           default:
             /* Hopefully never reached! */
-            err_string("Unrecogniged node type.");
+            err_string("unrecognized node type");
             res = 0;
             break;
         }
@@ -2670,7 +2670,7 @@
     int res = validate_eval_input(tree);
 
     if (!res && !PyErr_Occurred())
-        err_string("Could not validate expression tuple.");
+        err_string("could not validate expression tuple");
 
     return (res);
 }
@@ -2698,7 +2698,7 @@
      *  this, we have some debugging to do.
      */
     if (!res && !PyErr_Occurred())
-        err_string("VALIDATION FAILURE: report this to the maintainer!.");
+        err_string("VALIDATION FAILURE: report this to the maintainer!");
 
     return (res);
 }
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 8544f6a..a2251b1 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1226,7 +1226,7 @@
 	}
 	else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
 		PyErr_SetString(PyExc_TypeError,
-			      "Second argument must be a 2-tuple of numbers.");
+				"utime() arg 2 must be a tuple (atime, mtime)");
 		return NULL;
 	}
 	else {
@@ -1294,12 +1294,12 @@
 		getitem = PyTuple_GetItem;
 	}
 	else {
-		PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
+		PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
 		return NULL;
 	}
 
 	if (argc == 0) {
-		PyErr_SetString(PyExc_ValueError, "empty argument list");
+		PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
 		return NULL;
 	}
 
@@ -1310,7 +1310,7 @@
 		if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
 			PyMem_DEL(argvlist);
 			PyErr_SetString(PyExc_TypeError, 
-					"all arguments must be strings");
+					"execv() arg 2 must contain only strings");
 			return NULL;
 			
 		}
@@ -1364,17 +1364,17 @@
 		getitem = PyTuple_GetItem;
 	}
 	else {
-		PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
+		PyErr_SetString(PyExc_TypeError, "execve() arg 2 must be a tuple or list");
 		return NULL;
 	}
 	if (!PyMapping_Check(env)) {
-		PyErr_SetString(PyExc_TypeError, "env must be mapping object");
+		PyErr_SetString(PyExc_TypeError, "execve() arg 3 must be a mapping object");
 		return NULL;
 	}
 
 	if (argc == 0) {
 		PyErr_SetString(PyExc_ValueError, 
-				"empty argument list");
+				"execve() arg 2 must not be empty");
 		return NULL;
 	}
 
@@ -1385,7 +1385,7 @@
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
-				 "s;argv must be list of strings",
+				 "s;execve() arg 2 must contain only strings",
 				 &argvlist[i]))
 		{
 			goto fail_1;
@@ -1413,8 +1413,8 @@
 		if (!key || !val)
 			goto fail_2;
 		
-		if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
-		    !PyArg_Parse(val, "s;non-string value in env", &v))
+		if (!PyArg_Parse(key, "s;execve() arg 3 contains a non-string key", &k) ||
+		    !PyArg_Parse(val, "s;execve() arg 3 contains a non-string value", &v))
 		{
 			goto fail_2;
 		}
@@ -1493,7 +1493,7 @@
 		getitem = PyTuple_GetItem;
 	}
 	else {
-		PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
+		PyErr_SetString(PyExc_TypeError, "spawmv() arg 2 must be a tuple or list");
 		return NULL;
 	}
 
@@ -1504,7 +1504,7 @@
 		if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
 			PyMem_DEL(argvlist);
 			PyErr_SetString(PyExc_TypeError, 
-					"all arguments must be strings");
+					"spawnv() arg 2 must contain only strings");
 			return NULL;
 		}
 	}
@@ -1563,11 +1563,11 @@
 		getitem = PyTuple_GetItem;
 	}
 	else {
-		PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
+		PyErr_SetString(PyExc_TypeError, "spawnve() arg 2 must be a tuple or list");
 		return NULL;
 	}
 	if (!PyMapping_Check(env)) {
-		PyErr_SetString(PyExc_TypeError, "env must be mapping object");
+		PyErr_SetString(PyExc_TypeError, "spawnve() arg 3 must be a mapping object");
 		return NULL;
 	}
 
@@ -1578,7 +1578,7 @@
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
-				 "s;argv must be list of strings",
+				 "s;spawnve() arg 2 must contain only strings",
 				 &argvlist[i]))
 		{
 			goto fail_1;
@@ -1606,8 +1606,8 @@
 		if (!key || !val)
 			goto fail_2;
 		
-		if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
-		    !PyArg_Parse(val, "s;non-string value in env", &v))
+		if (!PyArg_Parse(key, "s;spawnve() arg 3 contains a non-string key", &k) ||
+		    !PyArg_Parse(val, "s;spawnve() arg 3 contains a non-string value", &v))
 		{
 			goto fail_2;
 		}
@@ -2150,13 +2150,13 @@
 	if (*mode == 'r')
 		tm = _O_RDONLY;
 	else if (*mode != 'w') {
-		PyErr_SetString(PyExc_ValueError, "mode must be 'r' or 'w'");
+		PyErr_SetString(PyExc_ValueError, "popen() arg 2 must be 'r' or 'w'");
 		return NULL;
 	} else
 		tm = _O_WRONLY;
 	 
 	if (bufsize != -1) {
-		PyErr_SetString(PyExc_ValueError, "bufsize must be -1");
+		PyErr_SetString(PyExc_ValueError, "popen() arg 3 must be -1");
 		return NULL;
 	}
 
@@ -2191,13 +2191,13 @@
 	if (*mode == 't')
 		tm = _O_TEXT;
 	else if (*mode != 'b') {
-		PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
+		PyErr_SetString(PyExc_ValueError, "popen2() arg 2 must be 't' or 'b'");
 		return NULL;
 	} else
 		tm = _O_BINARY;
   
 	if (bufsize != -1) {
-		PyErr_SetString(PyExc_ValueError, "bufsize must be -1");
+		PyErr_SetString(PyExc_ValueError, "popen2() arg 3 must be -1");
 		return NULL;
 	}
 
@@ -2228,13 +2228,13 @@
 	if (*mode == 't')
 		tm = _O_TEXT;
 	else if (*mode != 'b') {
-		PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
+		PyErr_SetString(PyExc_ValueError, "popen3() arg 2 must be 't' or 'b'");
 		return NULL;
 	} else
 		tm = _O_BINARY;
   
 	if (bufsize != -1) {
-		PyErr_SetString(PyExc_ValueError, "bufsize must be -1");
+		PyErr_SetString(PyExc_ValueError, "popen3() arg 3 must be -1");
 		return NULL;
 	}
 
@@ -2265,13 +2265,13 @@
 	if (*mode == 't')
 		tm = _O_TEXT;
 	else if (*mode != 'b') {
-		PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
+		PyErr_SetString(PyExc_ValueError, "popen4() arg 2 must be 't' or 'b'");
 		return NULL;
 	} else
 		tm = _O_BINARY;
 
 	if (bufsize != -1) {
-		PyErr_SetString(PyExc_ValueError, "bufsize must be -1");
+		PyErr_SetString(PyExc_ValueError, "popen4() arg 3 must be -1");
 		return NULL;
 	}
 
@@ -2727,13 +2727,13 @@
 		 * an exception.  Just die.
 		 */
 		 Py_FatalError("unable to allocate interpreter state "
-		 	       "when closing popen object.");
+		 	       "when closing popen object");
 		 return -1;  /* unreachable */
 	}
 	pThreadState = PyThreadState_New(pInterpreterState);
 	if (!pThreadState) {
 		 Py_FatalError("unable to allocate thread state "
-		 	       "when closing popen object.");
+		 	       "when closing popen object");
 		 return -1;  /* unreachable */
 	}
 	/* Grab the global lock.  Note that this will deadlock if the
@@ -3761,7 +3761,7 @@
 	message = strerror(code);
 	if (message == NULL) {
 		PyErr_SetString(PyExc_ValueError,
-				"strerror code out of range");
+				"strerror() argument out of range");
 		return NULL;
 	}
 	return PyString_FromString(message);