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