summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/timemodule.c110
-rw-r--r--Parser/listnode.c2
-rw-r--r--Python/ceval.c8
-rw-r--r--Python/frozenmain.c21
-rw-r--r--Python/pythonmain.c36
5 files changed, 118 insertions, 59 deletions
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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#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 @@ time_millitimer(self, args)
#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 @@ time_convert(when, function)
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 @@ time_localtime(self, args)
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 @@ time_mktime(self, args)
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 @@ static struct methodlist time_methods[] = {
{"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 @@ listtree(n)
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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define CHECKEXC 1 /* Double-check exception checking */
#endif
+/* Global option, may be set by main() */
+int killprint;
+
/* Forward declarations */
@@ -639,6 +642,11 @@ eval_code(co, globals, locals, owner, arg)
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 char *getenv();
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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#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 @@ main(argc, argv)
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 @@ main(argc, argv)
inspect++;
break;
+ case 'k':
+ killprint++;
+ break;
+
case 'v':
verbose++;
break;
@@ -85,8 +94,25 @@ main(argc, argv)
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*/