* pythonmain.c: -k option, usage message, more environment flags.
  (the latter also in frozenmain.c)
* ceval.c: global 'killprint' flag raises exception when printing an
  expression statement's value (useful for finding stray output)
* timemodule.c: add asctime() and ctime().  Change julian date to
  1-based origin (as intended and documented).
* Removed unused DO_TIMES stuff from timemodule.c.  Added 'epoch' and
  'day0' globals (year where time.time() == 0 and day of the week the
  epoch started).
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 3df0885..097c4da 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -71,13 +71,6 @@
 #include <time.h>
 #endif /* !unix */
 
-/* XXX This is bogus -- times() is defined in posixmodule.c */
-#ifdef DO_TIMES
-#include <sys/times.h>
-#include <sys/param.h>
-#include <errno.h>
-#endif
-
 #ifdef SYSV
 /* Access timezone stuff */
 #ifdef OLDTZ				/* ANSI prepends underscore to these */
@@ -227,32 +220,6 @@
 
 #endif /* DO_MILLI */
 
-#ifdef DO_TIMES
-
-static object *
-time_times(self, args)
-	object *self;
-	object *args;
-{
-	struct tms t;
-	clock_t c;
-	if (!getnoarg(args))
-		return NULL;
-	errno = 0;
-	c = times(&t);
-	if (c == (clock_t) -1) {
-		err_errno(IOError);
-		return NULL;
-	}
-	return mkvalue("(dddd)",
-		       (double)t.tms_utime / HZ,
-		       (double)t.tms_stime / HZ,
-		       (double)t.tms_cutime / HZ,
-		       (double)t.tms_cstime / HZ);
-}
-
-#endif
-
 
 static object *
 time_convert(when, function)
@@ -268,7 +235,7 @@
 		       p->tm_min,
 		       p->tm_sec,
 		       (p->tm_wday + 6) % 7, /* Want Monday == 0 */
-		       p->tm_yday,
+		       p->tm_yday + 1, /* Want January, 1 == 1 */
 		       p->tm_isdst);
 }
 
@@ -294,6 +261,62 @@
 	return time_convert((time_t)when, localtime);
 }
 
+static int
+gettmarg(args, p)
+	object *args;
+	struct tm *p;
+{
+	if (!getargs(args, "(iiiiiiiii)",
+		     &p->tm_year,
+		     &p->tm_mon,
+		     &p->tm_mday,
+		     &p->tm_hour,
+		     &p->tm_min,
+		     &p->tm_sec,
+		     &p->tm_wday,
+		     &p->tm_yday,
+		     &p->tm_isdst))
+		return 0;
+	if (p->tm_year >= 1900)
+		p->tm_year -= 1900;
+	p->tm_mon--;
+	p->tm_wday = (p->tm_wday + 1) % 7;
+	p->tm_yday--;
+	return 1;
+}
+
+static object *
+time_asctime(self, args)
+	object *self;
+	object *args;
+{
+	struct tm buf;
+	char *p;
+	if (!gettmarg(args, &buf))
+		return NULL;
+	p = asctime(&buf);
+	if (p[24] == '\n')
+		p[24] = '\0';
+	return newstringobject(p);
+}
+
+static object *
+time_ctime(self, args)
+	object *self;
+	object *args;
+{
+	double dt;
+	time_t tt;
+	char *p;
+	if (!getargs(args, "d", &dt))
+		return NULL;
+	tt = dt;
+	p = ctime(&tt);
+	if (p[24] == '\n')
+		p[24] = '\0';
+	return newstringobject(p);
+}
+
 /* Some very old systems may not have mktime().  Comment it out then! */
 
 static object *
@@ -302,20 +325,8 @@
 	object *args;
 {
 	struct tm buf;
-	if (!getargs(args, "(iiiiiiiii)",
-		     &buf.tm_year,
-		     &buf.tm_mon,
-		     &buf.tm_mday,
-		     &buf.tm_hour,
-		     &buf.tm_min,
-		     &buf.tm_sec,
-		     &buf.tm_wday,
-		     &buf.tm_yday,
-		     &buf.tm_isdst))
+	if (!gettmarg(args, &buf))
 		return NULL;
-	if (buf.tm_year >= 1900)
-		buf.tm_year -= 1900;
-	buf.tm_mon--;
 	return newintobject((long)mktime(&buf));
 }
 
@@ -324,13 +335,12 @@
 	{"millisleep",	time_millisleep},
 	{"millitimer",	time_millitimer},
 #endif /* DO_MILLI */
-#ifdef DO_TIMES
-	{"times",	time_times},
-#endif
 	{"sleep",	time_sleep},
 	{"time",	time_time},
 	{"gmtime",	time_gmtime},
 	{"localtime",	time_localtime},
+	{"asctime",	time_asctime},
+	{"ctime",	time_ctime},
 	{"mktime",	time_mktime},
 	{NULL,		NULL}		/* sentinel */
 };
diff --git a/Parser/listnode.c b/Parser/listnode.c
index 07c66ac..a914bab 100644
--- a/Parser/listnode.c
+++ b/Parser/listnode.c
@@ -40,7 +40,7 @@
 
 static int level, atbol;
 
-void
+static void
 listnode(fp, n)
 	FILE *fp;
 	node *n;
diff --git a/Python/ceval.c b/Python/ceval.c
index 1c12d9c..8ed4663 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -49,6 +49,9 @@
 #define CHECKEXC 1	/* Double-check exception checking */
 #endif
 
+/* Global option, may be set by main() */
+int killprint;
+
 
 /* Forward declarations */
 
@@ -639,6 +642,11 @@
 				softspace(x, 1);
 				err = writeobject(v, x, 0);
 				flushline();
+				if (killprint) {
+					err_setstr(RuntimeError,
+					      "printing expression statement");
+					x = 0;
+				}
 			}
 			DECREF(v);
 			break;
diff --git a/Python/frozenmain.c b/Python/frozenmain.c
index 90d1623..8bc136a 100644
--- a/Python/frozenmain.c
+++ b/Python/frozenmain.c
@@ -30,28 +30,43 @@
 
 extern int debugging;
 extern int verbose;
+extern int killprint;
 
 main(argc, argv)
 	int argc;
 	char **argv;
 {
 	char *p;
+	int n, inspect, sts;
 	int n;
+
 	if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
 		debugging = 1;
 	if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
 		verbose = 1;
-	initargs(&argc, &argv); /* Defined in config*.c */
+	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
+		inspect = 1;
+	if ((p = getenv("PYTHONKILLPRINT")) && *p != '\0')
+		killprint = 1;
+
+	initargs(&argc, &argv);
 	initall();
 	setpythonargv(argc, argv);
+
 	n = init_frozen("__main__");
 	if (n == 0)
 		fatal("__main__ not frozen");
 	if (n < 0) {
 		print_error();
-		goaway(1);
+		sts = 1;
 	}
 	else
-		goaway(0);
+		sts = 0;
+
+	if (inspect && isatty((int)fileno(stdin)) &&
+	    (filename != NULL || command != NULL))
+		sts = run(stdin, "<stdin>") != 0;
+
+	goaway(sts);
 	/*NOTREACHED*/
 }
diff --git a/Python/pythonmain.c b/Python/pythonmain.c
index 760e5da..ac1d86a 100644
--- a/Python/pythonmain.c
+++ b/Python/pythonmain.c
@@ -26,8 +26,9 @@
 
 #include "allobjects.h"
 
-extern int debugging; /* Needed by parser.c */
-extern int verbose; /* Needed by import.c */
+extern int debugging; /* Defined in parser.c */
+extern int verbose; /* Defined in import.c */
+extern int killprint; /* Defined in ceval.c */
 
 /* Interface to getopt(): */
 extern int optind;
@@ -52,10 +53,14 @@
 		debugging = 1;
 	if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
 		verbose = 1;
+	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
+		inspect = 1;
+	if ((p = getenv("PYTHONKILLPRINT")) && *p != '\0')
+		killprint = 1;
 	
-	initargs(&argc, &argv); /* Defined in config*.c */
+	initargs(&argc, &argv);
 
-	while ((c = getopt(argc, argv, "c:div")) != EOF) {
+	while ((c = getopt(argc, argv, "c:dikv")) != EOF) {
 		if (c == 'c') {
 			/* -c is the last option; following arguments
 			   that look like options are left for the
@@ -77,6 +82,10 @@
 			inspect++;
 			break;
 
+		case 'k':
+			killprint++;
+			break;
+
 		case 'v':
 			verbose++;
 			break;
@@ -85,8 +94,25 @@
 
 		default:
 			fprintf(stderr,
-				"usage: %s [-c cmd | file | -] [arg] ...\n",
+"usage: %s [-d] [-i] [-k] [-v] [-c cmd | file | -] [arg] ...\n",
 				argv[0]);
+			fprintf(stderr, "\
+\n\
+Options and arguments (and corresponding environment variables):\n\
+-d     : debug output from parser (also PYTHONDEBUG=x)\n\
+-i     : inspect interactively after running script (also PYTHONINSPECT=x)\n\
+-k     : kill printing expression statement (also PYTHONKILLPRINT=x)\n\
+-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
+-c cmd : program passed in as string (terminates option list)\n\
+file   : program read from script file\n\
+-      : program read from stdin (default; interactive mode if a tty)\n\
+arg ...: arguments passed to program in sys.argv[1:]\n\
+\n\
+Other environment variables:\n\
+PYTHONSTARTUP: file executed on interactive startup (no default)\n\
+PYTHONPATH   : colon-separated list of directories prefixed to the\n\
+               default module search path.  The result is sys.path.\n\
+");
 			exit(2);
 			/*NOTREACHED*/