# include <setjmp.h>
# include <signal.h>
# include <sys/time.h>
# include <math.h>

static jmp_buf	jbuf;
void catchalarm() { longjmp(jbuf, 1); }

fsleep(interval)
	float interval;	/* time in seconds */
/*
 * Floating point sleep: sleep for 'interval' seconds,
 * including fractional part.  Precise to microsecond,
 * accurate only to system clock rate.
 * `Note:` Depends on 4.2bsd.
 */
{
	extern void catchalarm();
	struct itimerval val, oval;
	register long tmp;

	signal(SIGALRM, catchalarm);
	if (setjmp(jbuf)) return;
	val.it_interval.tv_sec = 0;
	val.it_interval.tv_usec = 0;
	val.it_value.tv_sec = tmp = interval;
	val.it_value.tv_usec = (interval - tmp) * 1000000.0;
	setitimer(ITIMER_REAL, &val, &oval);
	pause();
}

/*
 * main(argc, argv)
 * 	char **argv;
 * {
 * 	extern char *ctime();
 * 	struct timeval timeval; 
 * 	struct timezone timezone;
 * 	printf("!\n");
 * 	if (argc > 1) {
 * 		gettimeofday(&timeval, &timezone);
 * 		printf(ctime(&timeval.tv_sec));
 * 		isleep(atof(argv[1]));
 * 		gettimeofday(&timeval, &timezone);
 * 		printf(ctime(&timeval.tv_sec));
 * 	}
 * }
 */
