summaryrefslogtreecommitdiff
path: root/pith/osdep/debugtime.c
blob: be1e3b33e9a02cf31223f128ab0d0b2b60ea2472 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * ========================================================================
 * Copyright 2013-2022 Eduardo Chappa
 * Copyright 2006 University of Washington
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * ========================================================================
 */

#include <stdio.h>

#include <system.h>
#include "debugtime.h"

#ifdef DEBUG

/*
 * Returns a pointer to static string for a timestamp.
 *
 * If timestamp is set .subseconds are added if available.
 * If include_date is set the date is appended.
 */
char *
debug_time(int include_date, int include_subseconds, int signal_in_progress)
{
    time_t          t;
    struct tm      *tm_now;
#if     HAVE_GETTIMEOFDAY
    struct timeval  tp;
    struct timezone tzp;
#else
    struct _timeb   timebuffer;
#endif
    static char     timestring[23];
    char            subsecond[8];
    char            datestr[7];

    if(signal_in_progress)
      return _("Time Unavailable");

    timestring[0] = '\0';

#if	HAVE_GETTIMEOFDAY
    if(gettimeofday(&tp, &tzp) == 0){
	t = (time_t)tp.tv_sec;
	if(include_date){
	    tm_now = localtime(&t);
 	    snprintf(datestr, sizeof(datestr), " %d/%d", tm_now->tm_mon+1, tm_now->tm_mday);
	}
	else
	  datestr[0] = '\0';

	if(include_subseconds)
 	  snprintf(subsecond, sizeof(subsecond), ".%06ld", tp.tv_usec);
	else
	  subsecond[0] = '\0';

 	snprintf(timestring, sizeof(timestring), "%.8s%.7s%.6s", ctime(&t)+11, subsecond, datestr);
    }
#else /* !HAVE_GETTIMEOFDAY */
    /* Should be _WINDOWS */
    t = time((time_t *)0);
    if(include_date){
	tm_now = localtime(&t);
	snprintf(datestr, sizeof(datestr), " %d/%d", tm_now->tm_mon+1, tm_now->tm_mday);
    }
    else
      datestr[0] = '\0';

    if(include_subseconds){
	_ftime(&timebuffer);
	snprintf(subsecond, sizeof(subsecond), ".%03ld", timebuffer.millitm);
    }
    else
      subsecond[0] = '\0';

    snprintf(timestring, sizeof(timestring), "%.8s%.7s%.6s", ctime(&t)+11, subsecond, datestr);
#endif /* HAVE_GETTIMEOFDAY */

    return(timestring);
}
#endif /* DEBUG */


/*
 * Fills in the passed in structure with the current time.
 *
 * Returns 0 if ok
 *        -1 if can't do it
 */
int
get_time(TIMEVAL_S *our_time_val)
{
#if	HAVE_GETTIMEOFDAY
    struct timeval  tp;
    struct timezone tzp;

    if(gettimeofday(&tp, &tzp) == 0){
	our_time_val->sec  = tp.tv_sec;
	our_time_val->usec = tp.tv_usec;
	return 0;
    }
#else /* !HAVE_GETTIMEOFDAY */
#ifdef	_WINDOWS
    struct _timeb timebuffer;

    _ftime(&timebuffer);
    our_time_val->sec  = (long)timebuffer.time;
    our_time_val->usec = 1000L * (long)timebuffer.millitm;
    return 0;
#endif
#endif

    return -1;
}


/*
 * Returns the difference between the two values, in microseconds.
 * Value returned is first - second.
 */
long
time_diff(TIMEVAL_S *first, TIMEVAL_S *second)
{
    return(1000000L*(first->sec - second->sec) + (first->usec - second->usec));
}