| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1995-01-04 19:10:35 +00:00
										 |  |  | Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							|  |  |  | The Netherlands. | 
					
						
							| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Permission to use, copy, modify, and distribute this software and its  | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted,  | 
					
						
							|  |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							|  |  |  | both that copyright notice and this permission notice appear in  | 
					
						
							|  |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							|  |  |  | Centrum or CWI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | 
					
						
							|  |  |  | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | 
					
						
							|  |  |  | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | 
					
						
							|  |  |  | FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
					
						
							|  |  |  | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 
					
						
							|  |  |  | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | 
					
						
							|  |  |  | OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Time module */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | #include "allobjects.h"
 | 
					
						
							|  |  |  | #include "modsupport.h"
 | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | #include "ceval.h"
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef macintosh
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							| 
									
										
										
										
											1993-01-04 09:09:59 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef QUICKWIN
 | 
					
						
							|  |  |  | #include <io.h>
 | 
					
						
							| 
									
										
										
										
											1992-08-14 13:49:30 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_UNISTD_H
 | 
					
						
							| 
									
										
										
										
											1992-03-27 17:22:13 +00:00
										 |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_SELECT
 | 
					
						
							|  |  |  | #include "myselect.h"
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #include "mytime.h"
 | 
					
						
							| 
									
										
										
										
											1993-11-23 17:53:17 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef HAVE_FTIME
 | 
					
						
							|  |  |  | #include <sys/timeb.h>
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef _M_IX86
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | #define timezone _timezone
 | 
					
						
							| 
									
										
										
										
											1995-03-14 15:05:41 +00:00
										 |  |  | #define tzname _tzname
 | 
					
						
							|  |  |  | #define daylight _daylight
 | 
					
						
							|  |  |  | #define altzone _altzone
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Forward declarations */ | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | static int floatsleep PROTO((double)); | 
					
						
							|  |  |  | static double floattime PROTO(()); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							|  |  |  | time_time(self, args) | 
					
						
							|  |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	double secs; | 
					
						
							| 
									
										
										
										
											1993-01-04 09:09:59 +00:00
										 |  |  | 	if (!getnoarg(args)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	secs = floattime(); | 
					
						
							|  |  |  | 	if (secs == 0.0) { | 
					
						
							| 
									
										
										
										
											1993-01-04 09:09:59 +00:00
										 |  |  | 		err_errno(IOError); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	return newfloatobject(secs); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_CLOCK
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifndef CLOCKS_PER_SEC
 | 
					
						
							|  |  |  | #define CLOCKS_PER_SEC 1000000
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | time_clock(self, args) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	if (!getnoarg(args)) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	return newfloatobject(((double)clock()) / CLOCKS_PER_SEC); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #endif /* HAVE_CLOCK */
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | time_sleep(self, args) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	double secs; | 
					
						
							|  |  |  | 	if (!getargs(args, "d", &secs)) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | 	BGN_SAVE | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	if (floatsleep(secs) != 0) { | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | 		RET_SAVE | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | 	END_SAVE | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	INCREF(None); | 
					
						
							|  |  |  | 	return None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | static object * | 
					
						
							|  |  |  | time_convert(when, function) | 
					
						
							|  |  |  | 	time_t when; | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	struct tm * (*function) PROTO((const time_t *)); | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	struct tm *p = function(&when); | 
					
						
							|  |  |  | 	return mkvalue("(iiiiiiiii)", | 
					
						
							|  |  |  | 		       p->tm_year + 1900, | 
					
						
							|  |  |  | 		       p->tm_mon + 1, /* Want January == 1 */ | 
					
						
							|  |  |  | 		       p->tm_mday, | 
					
						
							|  |  |  | 		       p->tm_hour, | 
					
						
							|  |  |  | 		       p->tm_min, | 
					
						
							|  |  |  | 		       p->tm_sec, | 
					
						
							|  |  |  | 		       (p->tm_wday + 6) % 7, /* Want Monday == 0 */ | 
					
						
							| 
									
										
										
										
											1993-06-24 11:10:19 +00:00
										 |  |  | 		       p->tm_yday + 1, /* Want January, 1 == 1 */ | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 		       p->tm_isdst); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							|  |  |  | time_gmtime(self, args) | 
					
						
							|  |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double when; | 
					
						
							|  |  |  | 	if (!getargs(args, "d", &when)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	return time_convert((time_t)when, gmtime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static object * | 
					
						
							|  |  |  | time_localtime(self, args) | 
					
						
							|  |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double when; | 
					
						
							|  |  |  | 	if (!getargs(args, "d", &when)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	return time_convert((time_t)when, localtime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-06-24 11:10:19 +00:00
										 |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | static object * | 
					
						
							|  |  |  | time_mktime(self, args) | 
					
						
							|  |  |  | 	object *self; | 
					
						
							|  |  |  | 	object *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct tm buf; | 
					
						
							| 
									
										
										
										
											1993-06-24 11:10:19 +00:00
										 |  |  | 	if (!gettmarg(args, &buf)) | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	return newintobject((long)mktime(&buf)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | static struct methodlist time_methods[] = { | 
					
						
							|  |  |  | 	{"time",	time_time}, | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_CLOCK
 | 
					
						
							|  |  |  | 	{"clock",	time_clock}, | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	{"sleep",	time_sleep}, | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	{"gmtime",	time_gmtime}, | 
					
						
							|  |  |  | 	{"localtime",	time_localtime}, | 
					
						
							| 
									
										
										
										
											1993-06-24 11:10:19 +00:00
										 |  |  | 	{"asctime",	time_asctime}, | 
					
						
							|  |  |  | 	{"ctime",	time_ctime}, | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	{"mktime",	time_mktime}, | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	{NULL,		NULL}		/* sentinel */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | ins(d, name, v) | 
					
						
							|  |  |  | 	object *d; | 
					
						
							|  |  |  | 	char *name; | 
					
						
							|  |  |  | 	object *v; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (v == NULL) | 
					
						
							|  |  |  | 		fatal("Can't initialize time module -- NULL value"); | 
					
						
							|  |  |  | 	if (dictinsert(d, name, v) != 0) | 
					
						
							|  |  |  | 		fatal("Can't initialize time module -- dictinsert failed"); | 
					
						
							|  |  |  | 	DECREF(v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | void | 
					
						
							|  |  |  | inittime() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 	object *m, *d, *v; | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	m = initmodule("time", time_methods); | 
					
						
							|  |  |  | 	d = getmoduledict(m); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_TZNAME
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	tzset(); | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 	ins(d, "timezone", newintobject((long)timezone)); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_ALTZONE
 | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 	ins(d, "altzone", newintobject((long)altzone)); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 	ins(d, "altzone", newintobject((long)timezone-3600)); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 	ins(d, "daylight", newintobject((long)daylight)); | 
					
						
							|  |  |  | 	ins(d, "tzname", mkvalue("(zz)", tzname[0], tzname[1])); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #else /* !HAVE_TZNAME */
 | 
					
						
							|  |  |  | #if HAVE_TM_ZONE
 | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | #define YEAR ((time_t)((365 * 24 + 6) * 3600))
 | 
					
						
							|  |  |  | 		time_t t; | 
					
						
							|  |  |  | 		struct tm *p; | 
					
						
							|  |  |  | 		long winterzone, summerzone; | 
					
						
							|  |  |  | 		char wintername[10], summername[10]; | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 		/* XXX This won't work on the southern hemisphere.
 | 
					
						
							|  |  |  | 		   XXX Anybody got a better idea? */ | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 		t = (time((time_t *)0) / YEAR) * YEAR; | 
					
						
							|  |  |  | 		p = localtime(&t); | 
					
						
							|  |  |  | 		winterzone = -p->tm_gmtoff; | 
					
						
							|  |  |  | 		strncpy(wintername, p->tm_zone ? p->tm_zone : "   ", 9); | 
					
						
							|  |  |  | 		wintername[9] = '\0'; | 
					
						
							|  |  |  | 		t += YEAR/2; | 
					
						
							|  |  |  | 		p = localtime(&t); | 
					
						
							|  |  |  | 		summerzone = -p->tm_gmtoff; | 
					
						
							|  |  |  | 		strncpy(summername, p->tm_zone ? p->tm_zone : "   ", 9); | 
					
						
							|  |  |  | 		summername[9] = '\0'; | 
					
						
							| 
									
										
										
										
											1995-01-22 00:49:01 +00:00
										 |  |  | 		ins(d, "timezone", newintobject(winterzone)); | 
					
						
							|  |  |  | 		ins(d, "altzone", newintobject(summerzone)); | 
					
						
							|  |  |  | 		ins(d, "daylight", newintobject((long)(winterzone != summerzone))); | 
					
						
							|  |  |  | 		ins(d, "tzname",  mkvalue("(zz)", wintername, summername)); | 
					
						
							| 
									
										
										
										
											1993-06-17 12:35:49 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #endif /* HAVE_TM_ZONE */
 | 
					
						
							|  |  |  | #endif /* !HAVE_TZNAME */
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | /* Implement floattime() for various platforms */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | static double | 
					
						
							|  |  |  | floattime() | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	/* There are three ways to get the time:
 | 
					
						
							|  |  |  | 	   (1) gettimeofday() -- resolution in microseconds | 
					
						
							|  |  |  | 	   (2) ftime() -- resolution in milliseconds | 
					
						
							|  |  |  | 	   (3) time() -- resolution in seconds | 
					
						
							|  |  |  | 	   In all cases the return value is a float in seconds. | 
					
						
							|  |  |  | 	   Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may | 
					
						
							|  |  |  | 	   fail, so we fall back on ftime() or time(). | 
					
						
							|  |  |  | 	   Note: clock resolution does not imply clock accuracy! */ | 
					
						
							|  |  |  | #ifdef HAVE_GETTIMEOFDAY
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 	struct timeval t; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  | #ifdef GETTIMEOFDAY_NO_TZ
 | 
					
						
							|  |  |  | 	if (gettimeofday(&t) == 0) | 
					
						
							|  |  |  | 		return (double)t.tv_sec + t.tv_usec*0.000001; | 
					
						
							|  |  |  | #else /* !GETTIMEOFDAY_NO_TZ */
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	if (gettimeofday(&t, (struct timezone *)NULL) == 0) | 
					
						
							|  |  |  | 		return (double)t.tv_sec + t.tv_usec*0.000001; | 
					
						
							| 
									
										
										
										
											1995-01-02 19:30:30 +00:00
										 |  |  | #endif /* !GETTIMEOFDAY_NO_TZ */
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif /* !HAVE_GETTIMEOFDAY */
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | #ifdef HAVE_FTIME
 | 
					
						
							|  |  |  | 	struct timeb t; | 
					
						
							|  |  |  | 	ftime(&t); | 
					
						
							| 
									
										
										
										
											1994-08-29 10:46:42 +00:00
										 |  |  | 	return (double)t.time + (double)t.millitm * (double)0.001; | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #else /* !HAVE_FTIME */
 | 
					
						
							|  |  |  | 	time_t secs; | 
					
						
							|  |  |  | 	time(&secs); | 
					
						
							|  |  |  | 	return (double)secs; | 
					
						
							|  |  |  | #endif /* !HAVE_FTIME */
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-02-19 12:27:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | /* Implement floatsleep() for various platforms.
 | 
					
						
							|  |  |  |    When interrupted (or when another error occurs), return -1 and | 
					
						
							|  |  |  |    set an exception; else return 0. */ | 
					
						
							| 
									
										
										
										
											1991-02-19 12:27:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											1995-03-09 12:14:15 +00:00
										 |  |  | #ifdef MPW
 | 
					
						
							|  |  |  | floatsleep(double secs) | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											1993-01-09 17:18:52 +00:00
										 |  |  | floatsleep(secs) | 
					
						
							|  |  |  | 	double secs; | 
					
						
							| 
									
										
										
										
											1995-03-09 12:14:15 +00:00
										 |  |  | #endif /* MPW */
 | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | #ifdef HAVE_SELECT
 | 
					
						
							| 
									
										
										
										
											1992-08-05 19:58:53 +00:00
										 |  |  | 	struct timeval t; | 
					
						
							| 
									
										
										
										
											1993-01-09 17:18:52 +00:00
										 |  |  | 	double frac; | 
					
						
							|  |  |  | 	extern double fmod PROTO((double, double)); | 
					
						
							|  |  |  | 	extern double floor PROTO((double)); | 
					
						
							|  |  |  | 	frac = fmod(secs, 1.0); | 
					
						
							|  |  |  | 	secs = floor(secs); | 
					
						
							|  |  |  | 	t.tv_sec = (long)secs; | 
					
						
							|  |  |  | 	t.tv_usec = (long)(frac*1000000.0); | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) { | 
					
						
							|  |  |  | 		err_errno(IOError); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else /* !HAVE_SELECT */
 | 
					
						
							|  |  |  | #ifdef macintosh
 | 
					
						
							|  |  |  | #define MacTicks	(* (long *)0x16A)
 | 
					
						
							|  |  |  | 	long deadline; | 
					
						
							|  |  |  | 	deadline = MacTicks + (long)(secs * 60.0); | 
					
						
							|  |  |  | 	while (MacTicks < deadline) { | 
					
						
							|  |  |  | 		if (sigcheck()) | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else /* !macintosh */
 | 
					
						
							| 
									
										
										
										
											1993-07-09 10:51:31 +00:00
										 |  |  | #ifdef MSDOS
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 	struct timeb t1, t2; | 
					
						
							|  |  |  | 	double frac; | 
					
						
							|  |  |  | 	extern double fmod PROTO((double, double)); | 
					
						
							|  |  |  | 	extern double floor PROTO((double)); | 
					
						
							|  |  |  | 	if (secs <= 0.0) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	frac = fmod(secs, 1.0); | 
					
						
							|  |  |  | 	secs = floor(secs); | 
					
						
							|  |  |  | 	ftime(&t1); | 
					
						
							|  |  |  | 	t2.time = t1.time + (int)secs; | 
					
						
							|  |  |  | 	t2.millitm = t1.millitm + (int)(frac*1000.0); | 
					
						
							|  |  |  | 	while (t2.millitm >= 1000) { | 
					
						
							|  |  |  | 		t2.time++; | 
					
						
							|  |  |  | 		t2.millitm -= 1000; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for (;;) { | 
					
						
							|  |  |  | #ifdef QUICKWIN
 | 
					
						
							|  |  |  | 		_wyield(); | 
					
						
							| 
									
										
										
										
											1991-04-16 08:47:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1994-08-01 11:34:53 +00:00
										 |  |  | 		if (sigcheck()) | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		ftime(&t1); | 
					
						
							|  |  |  | 		if (t1.time > t2.time || | 
					
						
							|  |  |  | 		    t1.time == t2.time && t1.millitm >= t2.millitm) | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else /* !MSDOS */
 | 
					
						
							|  |  |  | #ifdef _M_IX86
 | 
					
						
							|  |  |  | 	/* XXX Can't interrupt this sleep */ | 
					
						
							|  |  |  | 	Sleep((int)(secs*1000)); | 
					
						
							|  |  |  | #else /* _M_IX86 */
 | 
					
						
							|  |  |  | 	/* XXX Can't interrupt this sleep */ | 
					
						
							|  |  |  | 	sleep((int)secs); | 
					
						
							|  |  |  | #endif /* _M_IX86 */
 | 
					
						
							|  |  |  | #endif /* !MSDOS */
 | 
					
						
							|  |  |  | #endif /* !macintosh */
 | 
					
						
							|  |  |  | #endif /* !HAVE_SELECT */
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											1993-07-05 10:31:29 +00:00
										 |  |  | } |