xenocara/app/xlockmore/xlock/util.c
2006-11-26 11:07:42 +00:00

201 lines
5.0 KiB
C

#if !defined( lint ) && !defined( SABER )
static const char sccsid[] = "@(#)util.c 4.10 98/04/23 xlockmore";
#endif
/*-
* util.c - various utilities - usleep, seconds, strdup, matherr
*
* Copyright (c) 1991 by Patrick J. Naughton.
*
* Revision History:
*
* Changes maintained by David Bagley <bagleyd@tux.org>
* 23-Apr-98: Separated stuff out of this file, changed name to util.c
* 08-Jul-96: Bug in strcat_firstword fixed thanks to
* <Jeffrey_Doggett@caradon.com>. Fix for ":not found" text
* that appears after about 40 minutes.
* 04-Apr-96: Added procedures to handle wildcards on filenames
* J. Jansen <joukj@hrem.stm.tudelft.nl>
* 15-May-95: random number generator added, moved hsbramp.c to utils.c .
* Also renamed file from usleep.c to utils.c .
* 14-Mar-95: patches for rand and seconds for VMS
* 27-Feb-95: fixed nanosleep for times >= 1 second
* 05-Jan-95: nanosleep for Solaris 2.3 and greater Greg Onufer
* <Greg.Onufer@Eng.Sun.COM>
* 22-Jun-94: Fudged for VMS by Anthony Clarke
* <Anthony.D.Clarke@Support.Hatfield.Raytheon.bae.eurokom.ie>
* 10-Jun-94: patch for BSD from Victor Langeveld <vic@mbfys.kun.nl>
* 02-May-94: patch for Linux, got ideas from Darren Senn's xlock
* <sinster@scintilla.capitola.ca.us>
* 21-Mar-94: patch fix for HP from <R.K.Lloyd@csc.liv.ac.uk>
* 01-Dec-93: added patch for HP
*
* Changes of Patrick J. Naughton
* 30-Aug-90: written.
*
*/
#include "xlock.h"
#include "util.h"
#include <sys/stat.h>
#if 1
/* def USE_OLD_EVENT_LOOP */
#if !defined( VMS ) || defined( XVMSUTILS ) || ( __VMS_VER >= 70000000 )
#ifdef USE_XVMSUTILS
#include <X11/unix_time.h>
#endif
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#else
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#endif
#else
#include <starlet.h>
#endif
#ifndef WIN32
#if defined( SYSV ) || defined( SVR4 )
#ifdef LESS_THAN_AIX3_2
#include <sys/poll.h>
#else /* !LESS_THAN_AIX3_2 */
#include <poll.h>
#endif /* !LESS_THAN_AIX3_2 */
#endif /* defined( SYSV ) || defined( SVR4 ) */
#endif /* !WIN32 */
#ifndef HAVE_USLEEP
/* usleep should be defined */
int
usleep(unsigned long usec)
{
#ifndef WIN32
#if (defined( SYSV ) || defined( SVR4 )) && !defined( __hpux )
#ifdef HAVE_NANOSLEEP
{
struct timespec rqt;
rqt.tv_nsec = 1000 * (usec % (unsigned long) 1000000);
rqt.tv_sec = usec / (unsigned long) 1000000;
return nanosleep(&rqt, NULL);
}
#else /* !HAVE_NANOSLEEP */
#ifdef SunCplusplus
(void) poll((pollfd *) 0, (int) 0, usec / 1000); /* ms resolution */
#else
(void) poll((void *) 0, (int) 0, usec / 1000); /* ms resolution */
#endif
#endif /* !HAVE_NANOSLEEP */
#else /* !SYSV */
#if HAVE_GETTIMEOFDAY
struct timeval time_out;
time_out.tv_usec = usec % (unsigned long) 1000000;
time_out.tv_sec = usec / (unsigned long) 1000000;
(void) select(0, (void *) 0, (void *) 0, (void *) 0, &time_out);
#else
long timadr[2];
if (usec != 0) {
timadr[0] = -usec * 10;
timadr[1] = -1;
sys$setimr(4, &timadr, 0, 0, 0);
sys$waitfr(4);
}
#endif
#endif /* !SYSV */
#endif /* !WIN32 */
return 0;
}
#endif /* !HAVE_USLEEP */
#endif /* USE_OLD_EVENT_LOOP */
/*-
* returns the number of seconds since 01-Jan-70.
* This is used to control rate and timeout in many of the animations.
*/
unsigned long
seconds(void)
{
#if HAVE_GETTIMEOFDAY
struct timeval now;
GETTIMEOFDAY(&now);
return (unsigned long) now.tv_sec;
#else
return (unsigned long) time((time_t *) 0);
#endif
}
#if (! HAVE_STRDUP )
char *
strdup(char *str)
{
register char *ptr;
ptr = (char *) malloc(strlen(str) + 1);
(void) strcpy(ptr, str);
return ptr;
}
#endif
#ifdef USE_MATHERR
extern Bool debug;
/* Handle certain math exception errors */
int
matherr(register struct
#ifdef __cplusplus
__exception
#else
exception
#endif
*x)
{
switch (x->type) {
case DOMAIN:
/* Suppress "asin: DOMAIN error" stderr message */
if (!strcmp(x->name, "asin")) {
x->retval = 0.0;
return ((debug) ? 0 : 1); /* suppress message unless debugging */
}
/* Suppress "acos: DOMAIN error" stderr message */
if (!strcmp(x->name, "acos")) {
x->retval = 0.0;
return ((debug) ? 0 : 1); /* suppress message unless debugging */
}
/* Suppress "atan2: DOMAIN error" stderr message */
if (!strcmp(x->name, "atan2")) {
x->retval = 0.0;
return ((debug) ? 0 : 1); /* suppress message unless debugging */
}
/* change sqrt to return sqrt(-arg1), not NaN */
if (!strcmp(x->name, "sqrt")) {
x->retval = sqrt(-x->arg1);
/* x->retval = 0.0; */
return ((debug) ? 0 : 1); /* suppress message unless debugging */
}
break;
#ifdef __hpux
/* Fix how HP-UX does not like sin and cos of angles >= 360. */
case TLOSS:
if (!strcmp(x->name, "cos")) {
x->retval = cos(fmod(x->arg1, 360.0));
return (1); /* suppress message */
}
if (!strcmp(x->name, "sin")) {
x->retval = sin(fmod(x->arg1, 360.0));
return (1); /* suppress message */
}
break;
case PLOSS:
return (1);
break;
#endif
}
return (0); /* all other exceptions, execute default procedure */
}
#endif