diff options
author | Guido van Rossum <guido@python.org> | 1993-06-24 11:10:19 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1993-06-24 11:10:19 (GMT) |
commit | 9e90a672b44e2acfd5c6dabfb9435bb4bb46c845 (patch) | |
tree | f3904d6dfed9d57f98f9e90c93241cb23cb802ad | |
parent | 5ef74b8f8edbebe22d0b86c85f08b0c618d808f7 (diff) | |
download | cpython-9e90a672b44e2acfd5c6dabfb9435bb4bb46c845.zip cpython-9e90a672b44e2acfd5c6dabfb9435bb4bb46c845.tar.gz cpython-9e90a672b44e2acfd5c6dabfb9435bb4bb46c845.tar.bz2 |
* 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).
-rw-r--r-- | Modules/timemodule.c | 110 | ||||
-rw-r--r-- | Parser/listnode.c | 2 | ||||
-rw-r--r-- | Python/ceval.c | 8 | ||||
-rw-r--r-- | Python/frozenmain.c | 21 | ||||
-rw-r--r-- | Python/pythonmain.c | 36 |
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*/ |