summaryrefslogtreecommitdiffstats
path: root/clockB/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'clockB/util.c')
-rw-r--r--clockB/util.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/clockB/util.c b/clockB/util.c
new file mode 100644
index 000000000..8a1a6060c
--- /dev/null
+++ b/clockB/util.c
@@ -0,0 +1,120 @@
+/**************************************************************************
+
+ This is a component of the hwclock program.
+
+ This file contains the code for various basic utility routines
+ needed by the other modules.
+
+****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "hwclock.h"
+
+bool
+is_in_cpuinfo(const char * const fmt, const char * const str) {
+/*----------------------------------------------------------------------------
+ Return true iff the /proc/cpuinfo file shows the value 'str' for the
+ keyword 'fmt'. Both arguments are null-terminated strings.
+
+ If for any reason we can't read /proc/cpuinfo, return false.
+-----------------------------------------------------------------------------*/
+ FILE *cpuinfo;
+ char field[256];
+ char format[256];
+ bool found;
+
+ sprintf(format, "%s : %s", fmt, "%255s");
+
+ found = FALSE; /* initial value */
+ if ((cpuinfo = fopen ("/proc/cpuinfo", "r")) != NULL) {
+ while (!feof(cpuinfo)) {
+ if (fscanf (cpuinfo, format, field) == 1) {
+ if (strncmp(field, str, strlen(str)) == 0)
+ found = TRUE;
+ break;
+ }
+ fgets (field, 256, cpuinfo);
+ }
+ fclose(cpuinfo);
+ }
+ return found;
+}
+
+
+
+char *
+ctime2(const time_t time) {
+/*----------------------------------------------------------------------------
+ Same as ctime() from the standard C library, except it takes a time_t
+ as an argument instead of a pointer to a time_t, so it is much more
+ useful.
+
+ Also, don't include a newline at the end of the returned string. If
+ the user wants a newline, he can provide it himself.
+
+ return value is in static storage within.
+-----------------------------------------------------------------------------*/
+ static char retval[30];
+
+ strncpy(retval, ctime(&time), sizeof(retval));
+ retval[sizeof(retval)-1] = '\0';
+
+ /* Now chop off the last character, which is the newline */
+ if (strlen(retval) >= 1) /* for robustness */
+ retval[strlen(retval)-1] = '\0';
+ return(retval);
+
+}
+
+
+
+struct timeval
+t2tv(time_t argument) {
+/*----------------------------------------------------------------------------
+ Convert from "time_t" format to "timeval" format.
+-----------------------------------------------------------------------------*/
+ struct timeval retval;
+
+ retval.tv_sec = argument;
+ retval.tv_usec = 0;
+ return(retval);
+}
+
+
+
+float
+time_diff(struct timeval subtrahend, struct timeval subtractor) {
+/*---------------------------------------------------------------------------
+ The difference in seconds between two times in "timeval" format.
+----------------------------------------------------------------------------*/
+ return( (subtrahend.tv_sec - subtractor.tv_sec)
+ + (subtrahend.tv_usec - subtractor.tv_usec) / 1E6 );
+}
+
+
+struct timeval
+time_inc(struct timeval addend, float increment) {
+/*----------------------------------------------------------------------------
+ The time, in "timeval" format, which is <increment> seconds after
+ the time <addend>. Of course, <increment> may be negative.
+-----------------------------------------------------------------------------*/
+ struct timeval newtime;
+
+ newtime.tv_sec = addend.tv_sec + (int) increment;
+ newtime.tv_usec = addend.tv_usec + (increment - (int) increment) * 1E6;
+
+ /* Now adjust it so that the microsecond value is between 0 and 1 million */
+ if (newtime.tv_usec < 0) {
+ newtime.tv_usec += 1E6;
+ newtime.tv_sec -= 1;
+ } else if (newtime.tv_usec >= 1E6) {
+ newtime.tv_usec -= 1E6;
+ newtime.tv_sec += 1;
+ }
+ return(newtime);
+}
+
+
+