aboutsummaryrefslogtreecommitdiff
path: root/gtimelog-stats.sno
blob: 63df8433c840f2442806df1e0764b238c692eb6e (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
#!/usr/local/bin/snobol4 -b
# ./gtimelog-stats.sno <pattern> <begin> <end>

-INCLUDE 'time.sno'

	input(.log, 100,, host(4, "HOME") "/.local/share/gtimelog/timelog.txt")
	data('entry(entry_date_str,entry_date,entry_msg)')

	param.pattern = eval(host(2, host(3))) :f(end)
	param.begin = (mktime(strptime(host(2, host(3) + 1), "%d.%m.%Y")), 0)
	param.end = (mktime(strptime(host(2, host(3) + 2), "%d.%m.%Y")),
+		     tv_sec(gettimeofday()))
*	Length of day in seconds
	day_length = 24 * 60 * 60

	entries = table()
	entries[0] = 0
next	line = log :f(next.end)
	line pos(0) (break(" ") . date " " arb) . date_time ": " rem . msg :f(next)
	entries[entries[0] = entries[0] + 1] = entry(date, strptime(date_time, "%Y-%m-%d %R"), msg) :(next)
next.end
	
	i = 2

*	Skip slack lines and arrived lines
l	entry_msg(entries[i]) "**" rpos(0) :s(l.c)
*	Skip entries not containing <keywords> and before <begin> or after <end>
	lt(mktime(entry_date(entries[i])), param.begin) :s(l.c)

	ident(entry_date_str(entries[i]), entry_date_str(entries[i - 1])) :s(l.f)
	eq(stats.sum_day) :s(l.f)
*	Print stats of last day
*	FIXME: does not always print last day
	output = entry_date_str(entries[i - 1]) ": "
+		 (stats.sum_day / (60 * 60)) " hours, "
+		 (remdr(stats.sum_day, 60 * 60) / 60) " minutes, "
+		 remdr(stats.sum_day, 60) " seconds"
	stats.sum_day = 0

*	Skip "arrived" lines
l.f	entry_msg(entries[i]) pos(0) "arrived" :s(l.c)

	ge(mktime(entry_date(entries[i])), param.end + day_length) :s(print_total)

	replace(entry_msg(entries[i]), &ucase, &lcase) pos(0) param.pattern :f(l.c)
*	output = tm_yday(entry_date(entries[i])) ": " mktime(entry_date(entries[i])) ": " entry_msg(entries[i])

	stats.sum_day = stats.sum_day + mktime(entry_date(entries[i])) -
+					mktime(entry_date(entries[i - 1]))
	stats.sum = stats.sum + mktime(entry_date(entries[i])) -
+				mktime(entry_date(entries[i - 1]))
l.c	le(i = i + 1, entries[0]) :s(l)

print_total
	output = "Sum: " (stats.sum / (60 * 60)) " hours, "
+			 (remdr(stats.sum, 60 * 60) / 60) " minutes, "
+			 remdr(stats.sum, 60) " seconds"
end