#!/usr/local/bin/snobol4 -b # ./gtimelog-stats.sno -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 and before or after 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