xref: /plan9/sys/src/cmd/cwfs/time.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1*01a344a2SDavid du Colombier #include "all.h"
2*01a344a2SDavid du Colombier 
3*01a344a2SDavid du Colombier Timet
toytime(void)4*01a344a2SDavid du Colombier toytime(void)
5*01a344a2SDavid du Colombier {
6*01a344a2SDavid du Colombier 	return time(nil);
7*01a344a2SDavid du Colombier }
8*01a344a2SDavid du Colombier 
9*01a344a2SDavid du Colombier void
datestr(char * s,Timet t)10*01a344a2SDavid du Colombier datestr(char *s, Timet t)
11*01a344a2SDavid du Colombier {
12*01a344a2SDavid du Colombier 	Tm *tm;
13*01a344a2SDavid du Colombier 
14*01a344a2SDavid du Colombier 	tm = localtime(t);
15*01a344a2SDavid du Colombier 	sprint(s, "%.4d%.2d%.2d", tm->year+1900, tm->mon+1, tm->mday);
16*01a344a2SDavid du Colombier }
17*01a344a2SDavid du Colombier 
18*01a344a2SDavid du Colombier void
prdate(void)19*01a344a2SDavid du Colombier prdate(void)
20*01a344a2SDavid du Colombier {
21*01a344a2SDavid du Colombier 	print("%T\n", time(nil));
22*01a344a2SDavid du Colombier }
23*01a344a2SDavid du Colombier 
24*01a344a2SDavid du Colombier static void
ct_numb(char * cp,int n)25*01a344a2SDavid du Colombier ct_numb(char *cp, int n)
26*01a344a2SDavid du Colombier {
27*01a344a2SDavid du Colombier 	if(n >= 10)
28*01a344a2SDavid du Colombier 		cp[0] = (n/10)%10 + '0';
29*01a344a2SDavid du Colombier 	else
30*01a344a2SDavid du Colombier 		cp[0] = ' ';
31*01a344a2SDavid du Colombier 	cp[1] = n%10 + '0';
32*01a344a2SDavid du Colombier }
33*01a344a2SDavid du Colombier 
34*01a344a2SDavid du Colombier int
Tfmt(Fmt * fmt)35*01a344a2SDavid du Colombier Tfmt(Fmt* fmt)
36*01a344a2SDavid du Colombier {
37*01a344a2SDavid du Colombier 	char s[30];
38*01a344a2SDavid du Colombier 	char *cp;
39*01a344a2SDavid du Colombier 	Timet t;
40*01a344a2SDavid du Colombier 	Tm *tm;
41*01a344a2SDavid du Colombier 
42*01a344a2SDavid du Colombier 	t = va_arg(fmt->args, Timet);
43*01a344a2SDavid du Colombier 	if(t == 0)
44*01a344a2SDavid du Colombier 		return fmtstrcpy(fmt, "The Epoch");
45*01a344a2SDavid du Colombier 
46*01a344a2SDavid du Colombier 	tm = localtime(t);
47*01a344a2SDavid du Colombier 	strcpy(s, "Day Mon 00 00:00:00 1900");
48*01a344a2SDavid du Colombier 	cp = &"SunMonTueWedThuFriSat"[tm->wday*3];
49*01a344a2SDavid du Colombier 	s[0] = cp[0];
50*01a344a2SDavid du Colombier 	s[1] = cp[1];
51*01a344a2SDavid du Colombier 	s[2] = cp[2];
52*01a344a2SDavid du Colombier 	cp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[tm->mon*3];
53*01a344a2SDavid du Colombier 	s[4] = cp[0];
54*01a344a2SDavid du Colombier 	s[5] = cp[1];
55*01a344a2SDavid du Colombier 	s[6] = cp[2];
56*01a344a2SDavid du Colombier 	ct_numb(s+8, tm->mday);
57*01a344a2SDavid du Colombier 	ct_numb(s+11, tm->hour+100);
58*01a344a2SDavid du Colombier 	ct_numb(s+14, tm->min+100);
59*01a344a2SDavid du Colombier 	ct_numb(s+17, tm->sec+100);
60*01a344a2SDavid du Colombier 	if(tm->year >= 100) {
61*01a344a2SDavid du Colombier 		s[20] = '2';
62*01a344a2SDavid du Colombier 		s[21] = '0';
63*01a344a2SDavid du Colombier 	}
64*01a344a2SDavid du Colombier 	ct_numb(s+22, tm->year+100);
65*01a344a2SDavid du Colombier 
66*01a344a2SDavid du Colombier 	return fmtstrcpy(fmt, s);
67*01a344a2SDavid du Colombier }
68*01a344a2SDavid du Colombier 
69*01a344a2SDavid du Colombier /*
70*01a344a2SDavid du Colombier  * compute the next time after t
71*01a344a2SDavid du Colombier  * that has hour hr and is not on
72*01a344a2SDavid du Colombier  * day in bitpattern --
73*01a344a2SDavid du Colombier  * for automatic dumps
74*01a344a2SDavid du Colombier  */
75*01a344a2SDavid du Colombier Timet
nextime(Timet t,int hr,int day)76*01a344a2SDavid du Colombier nextime(Timet t, int hr, int day)
77*01a344a2SDavid du Colombier {
78*01a344a2SDavid du Colombier 	int nhr;
79*01a344a2SDavid du Colombier 	Tm *tm;
80*01a344a2SDavid du Colombier 
81*01a344a2SDavid du Colombier 	if(hr < 0 || hr >= 24)
82*01a344a2SDavid du Colombier 		hr = 5;
83*01a344a2SDavid du Colombier 	if((day&0x7f) == 0x7f)
84*01a344a2SDavid du Colombier 		day = 0;
85*01a344a2SDavid du Colombier 	for (;;) {
86*01a344a2SDavid du Colombier 		tm = localtime(t);
87*01a344a2SDavid du Colombier 		t -= tm->sec;
88*01a344a2SDavid du Colombier 		t -= tm->min*60;
89*01a344a2SDavid du Colombier 		nhr = tm->hour;
90*01a344a2SDavid du Colombier 		do {
91*01a344a2SDavid du Colombier 			t += 60*60;
92*01a344a2SDavid du Colombier 			nhr++;
93*01a344a2SDavid du Colombier 		} while(nhr%24 != hr);
94*01a344a2SDavid du Colombier 		tm = localtime(t);
95*01a344a2SDavid du Colombier 		if(tm->hour != hr) {
96*01a344a2SDavid du Colombier 			t += 60*60;
97*01a344a2SDavid du Colombier 			tm = localtime(t);
98*01a344a2SDavid du Colombier 			if(tm->hour != hr) {
99*01a344a2SDavid du Colombier 				t -= 60*60;
100*01a344a2SDavid du Colombier 				tm = localtime(t);
101*01a344a2SDavid du Colombier 			}
102*01a344a2SDavid du Colombier 		}
103*01a344a2SDavid du Colombier 		if(day & (1<<tm->wday))
104*01a344a2SDavid du Colombier 			t += 12*60*60;
105*01a344a2SDavid du Colombier 		else
106*01a344a2SDavid du Colombier 			return t;
107*01a344a2SDavid du Colombier 	}
108*01a344a2SDavid du Colombier }
109*01a344a2SDavid du Colombier 
110*01a344a2SDavid du Colombier /*
111*01a344a2SDavid du Colombier  *  delay for l milliseconds more or less.
112*01a344a2SDavid du Colombier  */
113*01a344a2SDavid du Colombier void
delay(int l)114*01a344a2SDavid du Colombier delay(int l)
115*01a344a2SDavid du Colombier {
116*01a344a2SDavid du Colombier 	sleep(l);
117*01a344a2SDavid du Colombier }
118