isimplify the tcal format a lot, and add a manpage for it - ics2txt - convert icalendar .ics file to plain text Err bitreich.org 70 hgit clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt URL:git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt bitreich.org 70 1Log /scm/ics2txt/log.gph bitreich.org 70 1Files /scm/ics2txt/files.gph bitreich.org 70 1Refs /scm/ics2txt/refs.gph bitreich.org 70 1Tags /scm/ics2txt/tag bitreich.org 70 1README /scm/ics2txt/file/README.md.gph bitreich.org 70 i--- Err bitreich.org 70 1commit fef052ed4c0f485f6c87b75555dc2df664bb602e /scm/ics2txt/commit/fef052ed4c0f485f6c87b75555dc2df664bb602e.gph bitreich.org 70 1parent 708175eee823de7ce8690d23f9a5adf1b0839a71 /scm/ics2txt/commit/708175eee823de7ce8690d23f9a5adf1b0839a71.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Wed, 24 Jun 2020 22:59:31 +0200 Err bitreich.org 70 i Err bitreich.org 70 isimplify the tcal format a lot, and add a manpage for it Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 28 ++++++++++++++++++++-------- Err bitreich.org 70 i M ics2tsv | 84 +++++++++++++++++++++---------- Err bitreich.org 70 i M tcal.5 | 67 +++++++++++++++++-------------- Err bitreich.org 70 i M tcal2tsv | 102 ++++++++++++++++--------------- Err bitreich.org 70 i M tsv2tcal | 74 ++++++++++++++----------------- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 201 insertions(+), 154 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/ics2txt/file/Makefile.gph bitreich.org 70 i@@ -1,11 +1,23 @@ Err bitreich.org 70 i-PREFIX = /usr/local Err bitreich.org 70 i-BIN = ics2tsv tsv2tcal tcal2tsv tsv2ics ics2txt Err bitreich.org 70 i-MAN1 = ics2txt.1 Err bitreich.org 70 i+NAME = ics2txt Err bitreich.org 70 i+VERSION = 0.1 Err bitreich.org 70 i Err bitreich.org 70 i-all: Err bitreich.org 70 i+BIN = ics2tsv tsv2tcal tcal2tsv tsv2ics ics2txt Err bitreich.org 70 i+ Err bitreich.org 70 i+PREFIX = /usr/local Err bitreich.org 70 i+MANPREFIX = ${PREFIX}/man Err bitreich.org 70 i+ Err bitreich.org 70 i+all: ${BIN} Err bitreich.org 70 i+ Err bitreich.org 70 i+clean: Err bitreich.org 70 i+ rm -rf ${NAME}-${VERSION} *.gz Err bitreich.org 70 i Err bitreich.org 70 i install: Err bitreich.org 70 i- mkdir -p $(PREFIX)/bin Err bitreich.org 70 i- cp $(BIN) $(PREFIX)/bin Err bitreich.org 70 i- mkdir -p $(PREFIX)/share/man/man1 Err bitreich.org 70 i- cp $(MAN1) $(PREFIX)/share/man/man1 Err bitreich.org 70 i+ mkdir -p ${DESTDIR}$(PREFIX)/bin Err bitreich.org 70 i+ cp $(BIN) ${DESTDIR}$(PREFIX)/bin Err bitreich.org 70 i+ mkdir -p ${DESTDIR}$(MANPREFIX)/man1 Err bitreich.org 70 i+ cp *.1 ${DESTDIR}$(MANPREFIX)/man1 Err bitreich.org 70 i+ Err bitreich.org 70 i+dist: clean Err bitreich.org 70 i+ mkdir -p ${NAME}-${VERSION} Err bitreich.org 70 i+ cp -r README Makefile doc src ${BIN:=.c} ${NAME}-${VERSION} Err bitreich.org 70 i+ tar -cf - ${NAME}-${VERSION} | gzip -c >${NAME}-${VERSION}.tar.gz Err bitreich.org 70 1diff --git a/ics2tsv b/ics2tsv /scm/ics2txt/file/ics2tsv.gph bitreich.org 70 i@@ -10,28 +10,53 @@ function mdays(mon, year) Err bitreich.org 70 i return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-function timegm(year, mon, mday, hour, min, sec) Err bitreich.org 70 i+function maketime(tm, Err bitreich.org 70 i+ sec, mon, day) Err bitreich.org 70 i { Err bitreich.org 70 i- while (--mon >= 1) Err bitreich.org 70 i- mday += mdays(mon, year) Err bitreich.org 70 i- while (--year >= 1970) Err bitreich.org 70 i- mday += 365 + isleap(year) Err bitreich.org 70 i- return (((((mday - 1) * 24) + hour) * 60) + min) * 60 + sec Err bitreich.org 70 i+ sec = tm["sec"] + tm["min"] * 60 + tm["hour"] * 3600 Err bitreich.org 70 i+ Err bitreich.org 70 i+ day = tm["mday"] - 1 Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (mon = tm["mon"] - 1; mon > 0; mon--) Err bitreich.org 70 i+ day = day + mdays(mon, tm["year"]) Err bitreich.org 70 i+ Err bitreich.org 70 i+ # constants: x * 365 + x / 400 - x / 100 + x / 4 Err bitreich.org 70 i+ day = day + int(tm["year"] / 400) * 146097 Err bitreich.org 70 i+ day = day + int(tm["year"] % 400 / 100) * 36524 Err bitreich.org 70 i+ day = day + int(tm["year"] % 100 / 4) * 1461 Err bitreich.org 70 i+ day = day + int(tm["year"] % 4 / 1) * 365 Err bitreich.org 70 i+ Err bitreich.org 70 i+ return sec + (day - 719527) * 86400 Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-function date_ical(str, offset, Err bitreich.org 70 i- year, mon, mday, hour, min) Err bitreich.org 70 i+function ical_to_epoch(str, offset, Err bitreich.org 70 i+ tm) Err bitreich.org 70 i { Err bitreich.org 70 i- year = substr(str, 1, 4) Err bitreich.org 70 i- mon = substr(str, 5, 2) Err bitreich.org 70 i- mday = substr(str, 7, 2) Err bitreich.org 70 i- hour = substr(str, 10, 2) Err bitreich.org 70 i- min = substr(str, 12, 2) Err bitreich.org 70 i+ tm["year"] = substr(str, 1, 4) Err bitreich.org 70 i+ tm["mon"] = substr(str, 5, 2) Err bitreich.org 70 i+ tm["mday"] = substr(str, 7, 2) Err bitreich.org 70 i+ tm["hour"] = substr(str, 10, 2) Err bitreich.org 70 i+ tm["min"] = substr(str, 12, 2) Err bitreich.org 70 i offset = (substr(str, 16, 1) == "Z" ? 0 : offset) Err bitreich.org 70 i- return timegm(year, mon, mday, hour, min, 0) - offset Err bitreich.org 70 i+ return maketime(tm) - offset Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function print_event(ev, fields, Err bitreich.org 70 i+ i) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (i = 1; i <= fields["len"]; i++) Err bitreich.org 70 i+ printf("%s%s", (i > 1 ? "\t" : ""), ev[fields[i]]) Err bitreich.org 70 i+ printf("\n") Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i BEGIN { Err bitreich.org 70 i+ FIELDS = "DTSTART DTEND CATEGORIES LOCATION SUMMARY DESCRIPTION" Err bitreich.org 70 i+ fields["len"] = split(FIELDS, fields, " ") Err bitreich.org 70 i+ Err bitreich.org 70 i+ # by default: "CATEGORIES" -> "cat", "LOCATION" -> "loc"... Err bitreich.org 70 i+ translate["DTSTART"] = "beg" Err bitreich.org 70 i+ translate["DTEND"] = "end" Err bitreich.org 70 i+ Err bitreich.org 70 i "date +%z" | getline offset_str Err bitreich.org 70 i close("date +%z") Err bitreich.org 70 i hour = substr($0, 4, 2) Err bitreich.org 70 i@@ -39,26 +64,33 @@ BEGIN { Err bitreich.org 70 i tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60 Err bitreich.org 70 i Err bitreich.org 70 i FS = "[:;]" Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 1; i <= fields["len"]; i++) { Err bitreich.org 70 i+ if (!(s = translate[fields[i]])) Err bitreich.org 70 i+ s = tolower(substr(fields[i], 1, 3)) Err bitreich.org 70 i+ printf("%s%s", (i > 1 ? "\t" : ""), s) Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf("\n") Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i { Err bitreich.org 70 i- gsub("\r", ""); gsub("\t", "\\\\t") Err bitreich.org 70 i- gsub("^ *", ""); gsub(" *$", "") Err bitreich.org 70 i+ gsub("\r", "") Err bitreich.org 70 i+ gsub("\t", "\\\\t") Err bitreich.org 70 i+ gsub("^ *", "") Err bitreich.org 70 i+ gsub(" *$", "") Err bitreich.org 70 i Err bitreich.org 70 i if (match($0, "^ ")) { Err bitreich.org 70 i- event[type] = event[type] substr($0, 2, length($0) - 1) Err bitreich.org 70 i+ ev[type] = ev[type] substr($0, 2, length($0) - 1) Err bitreich.org 70 i } else { Err bitreich.org 70 i type = $1 Err bitreich.org 70 i i = index($0, ":") Err bitreich.org 70 i- event[type] = substr($0, i + 1, length($0) - i) Err bitreich.org 70 i+ ev[type] = substr($0, i + 1, length($0) - i) Err bitreich.org 70 i } Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i- if ($0 ~ /^END:VEVENT/) Err bitreich.org 70 i- printf("%d\t%d\t%s\t%s\t%s\t%s\n", Err bitreich.org 70 i- date_ical(event["DTSTART"], offset), Err bitreich.org 70 i- date_ical(event["DTEND"], offset), Err bitreich.org 70 i- event["CATEGORIES"], Err bitreich.org 70 i- event["LOCATION"], Err bitreich.org 70 i- event["SUMMARY"], Err bitreich.org 70 i- event["DESCRIPTION"]) Err bitreich.org 70 i+/^END:VEVENT/ { Err bitreich.org 70 i+ ev["DTSTART"] = ical_to_epoch(ev["DTSTART"], offset) Err bitreich.org 70 i+ ev["DTEND"] = ical_to_epoch(ev["DTEND"], offset) Err bitreich.org 70 i+ print_event(ev, fields) Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/tcal.5 b/tcal.5 /scm/ics2txt/file/tcal.5.gph bitreich.org 70 i@@ -6,52 +6,57 @@ Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i . Err bitreich.org 70 i .Nm tcal Err bitreich.org 70 i-.Nd plaintext calendar event notation format Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-.Sh SYNOPSIS Err bitreich.org 70 i-. Err bitreich.org 70 i-TZ+0300 Err bitreich.org 70 i+.Nd plaintext calendar for editing by hand on the go Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i . Err bitreich.org 70 i-The Err bitreich.org 70 i-.Nm Err bitreich.org 70 i-utility Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i+The first line contain Err bitreich.org 70 i+.Dq TZ+HHMM Err bitreich.org 70 i+with Err bitreich.org 70 i+.Dq +HHMM Err bitreich.org 70 i+as returned by Err bitreich.org 70 i+.D1 $ date +%z . Err bitreich.org 70 i . Err bitreich.org 70 i-.Sh FILES Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Then empty line delimited event entries follow, with for each: Err bitreich.org 70 i+One line with the start date, one line with the end date, Err bitreich.org 70 i+formatted like: Err bitreich.org 70 i+.Dq %Y-%m-%d %H:%M Err bitreich.org 70 i . Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Then one line per attribute, each formatted with: Err bitreich.org 70 i+optional space, attribute name, colon, Err bitreich.org 70 i+optional space, and attribute content, Err bitreich.org 70 i+end of line. Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i .Sh EXAMPLES Err bitreich.org 70 i . Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+TZ+0200 Err bitreich.org 70 i+ Err bitreich.org 70 i+2020-06-28 00:00 Err bitreich.org 70 i+2020-06-05 00:00 Err bitreich.org 70 i+ loc: 950-0994, Chuo Ward, Niigata, Japan Err bitreich.org 70 i+ sum: summer holidays Err bitreich.org 70 i+ Err bitreich.org 70 i+2020-06-29 13:30 Err bitreich.org 70 i+2020-06-29 15:00 Err bitreich.org 70 i+ loc: online, irc.freenode.net, #bitreich-en Err bitreich.org 70 i+ sum: bitreich irc invitation Err bitreich.org 70 i+ des: at this moment like all other moment, everyone invited on IRC Err bitreich.org 70 i+ Err bitreich.org 70 i+.Ed Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i .Sh SEE ALSO Err bitreich.org 70 i . Err bitreich.org 70 i-.Xr foobar 1 Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-.Sh STANDARDS Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-.Sh HISTORY Err bitreich.org 70 i-. Err bitreich.org 70 i+.Xr cal 1 , Err bitreich.org 70 i+.Xr calendar 1 Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i .Sh AUTHORS Err bitreich.org 70 i . Err bitreich.org 70 i-.An Err bitreich.org 70 i-.Aq Mt Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-.Sh CAVEATS Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-. Err bitreich.org 70 i-.Sh BUGS Err bitreich.org 70 i-. Err bitreich.org 70 i+.An Josuah Demangeon Err bitreich.org 70 i+.Aq Mt me@josuah.net Err bitreich.org 70 1diff --git a/tcal2tsv b/tcal2tsv /scm/ics2txt/file/tcal2tsv.gph bitreich.org 70 i@@ -10,24 +10,45 @@ function mdays(mon, year) Err bitreich.org 70 i return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-function timegm(year, mon, mday, hour, min, sec) Err bitreich.org 70 i+function maketime(tm, Err bitreich.org 70 i+ sec, mon, day) Err bitreich.org 70 i { Err bitreich.org 70 i- while (--mon >= 1) Err bitreich.org 70 i- mday += mdays(mon, year) Err bitreich.org 70 i- while (--year >= 1970) Err bitreich.org 70 i- mday += 365 + isleap(year) Err bitreich.org 70 i- return (((((mday - 1) * 24) + hour) * 60) + min) * 60 + sec Err bitreich.org 70 i+ sec = tm["sec"] + tm["min"] * 60 + tm["hour"] * 3600 Err bitreich.org 70 i+ Err bitreich.org 70 i+ day = tm["mday"] - 1 Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (mon = tm["mon"] - 1; mon > 0; mon--) Err bitreich.org 70 i+ day = day + mdays(mon, tm["year"]) Err bitreich.org 70 i+ Err bitreich.org 70 i+ # constants: x * 365 + x / 400 - x / 100 + x / 4 Err bitreich.org 70 i+ day = day + int(tm["year"] / 400) * 146097 Err bitreich.org 70 i+ day = day + int(tm["year"] % 400 / 100) * 36524 Err bitreich.org 70 i+ day = day + int(tm["year"] % 100 / 4) * 1461 Err bitreich.org 70 i+ day = day + int(tm["year"] % 4 / 1) * 365 Err bitreich.org 70 i+ Err bitreich.org 70 i+ return sec + (day - 719527) * 86400 Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-function date_text(str, offset, Err bitreich.org 70 i- year, mon, mday, hour, min) Err bitreich.org 70 i+function text_to_epoch(str, tz, Err bitreich.org 70 i+ tm) Err bitreich.org 70 i { Err bitreich.org 70 i- year = substr(str, 1, 4) Err bitreich.org 70 i- mon = substr(str, 6, 2) Err bitreich.org 70 i- mday = substr(str, 9, 2) Err bitreich.org 70 i- hour = substr(str, 12, 2) Err bitreich.org 70 i- min = substr(str, 15, 2) Err bitreich.org 70 i- return timegm(year, mon, mday, hour, min, 0) - offset Err bitreich.org 70 i+ tm["year"] = substr(str, 1, 4) Err bitreich.org 70 i+ tm["mon"] = substr(str, 6, 2) Err bitreich.org 70 i+ tm["mday"] = substr(str, 9, 2) Err bitreich.org 70 i+ tm["hour"] = substr(str, 12, 2) Err bitreich.org 70 i+ tm["min"] = substr(str, 15, 2) Err bitreich.org 70 i+ return maketime(tm) - tz Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+BEGIN { Err bitreich.org 70 i+ FIELDS = "beg end cat loc sum des" Err bitreich.org 70 i+ fields["len"] = split(FIELDS, fields, " ") Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 1; i <= fields["len"]; i++) { Err bitreich.org 70 i+ pos[fields[i]] = i Err bitreich.org 70 i+ printf("%s%s", (i > 1 ? "\t" : ""), fields[i]) Err bitreich.org 70 i+ } Err bitreich.org 70 i+ printf("\n") Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i { Err bitreich.org 70 i@@ -35,47 +56,30 @@ function date_text(str, offset, Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /^TZ[+-]/ { Err bitreich.org 70 i- hour = substr($0, 4, 2) Err bitreich.org 70 i- min = substr($0, 6, 2) Err bitreich.org 70 i- tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60 Err bitreich.org 70 i- next Err bitreich.org 70 i+ TZOFFSET = substr($1, 3, 1) substr($0, 4, 2)*3600 + substr($0, 6, 2)*60 Err bitreich.org 70 i+ while (getline && $0 ~ /^$/) Err bitreich.org 70 i+ continue Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-/^[0-9]+-[0-9]+-[0-9]+ / { Err bitreich.org 70 i- time = date_text($1 " " $2, tzoffset) Err bitreich.org 70 i- row++ Err bitreich.org 70 i+/^[0-9]+-[0-9]+-[0-9]+/ { Err bitreich.org 70 i+ if ("beg" in ev) Err bitreich.org 70 i+ ev["end"] = text_to_epoch($0, TZOFFSET) Err bitreich.org 70 i+ else Err bitreich.org 70 i+ ev["beg"] = text_to_epoch($0, TZOFFSET) Err bitreich.org 70 i+ next Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /^ / { Err bitreich.org 70 i- d = $0 Err bitreich.org 70 i- sub(/^ */, "", d) Err bitreich.org 70 i- des = des " " d Err bitreich.org 70 i+ tag = $1 Err bitreich.org 70 i+ sub("^ *[^ :]+: *", "") Err bitreich.org 70 i+ sub(":$", "", tag) Err bitreich.org 70 i+ ev[tag] = $0 Err bitreich.org 70 i+ next Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /^$/ { Err bitreich.org 70 i- if (beg) Err bitreich.org 70 i- printf "%d\t%d\t%s\t%s\t%s\t%s\n", beg, end, cat, loc, sum, des Err bitreich.org 70 i- beg = end = cat = loc = sum = des = "" Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-row == 1 { Err bitreich.org 70 i- beg = time Err bitreich.org 70 i- sum = $0 Err bitreich.org 70 i- sub(/^[^ ]+ +[^ ]+ +/, "", sum) Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-row == 2 { Err bitreich.org 70 i- end = time Err bitreich.org 70 i- Err bitreich.org 70 i- line = $0 Err bitreich.org 70 i- sub(/^[^ ]+ +[^ ]+ +/, "", line) Err bitreich.org 70 i- Err bitreich.org 70 i- cat = line Err bitreich.org 70 i- sub(/\].*/, "", cat) Err bitreich.org 70 i- sub(/^\[/, "", cat) Err bitreich.org 70 i- Err bitreich.org 70 i- loc = line Err bitreich.org 70 i- sub(/[^]]*\] */, "", loc) Err bitreich.org 70 i- Err bitreich.org 70 i- row = 0 Err bitreich.org 70 i+ for (i = 1; i <= fields["len"]; i++) Err bitreich.org 70 i+ printf("%s%s", (i > 1 ? "\t" : ""), ev[fields[i]]) Err bitreich.org 70 i+ printf("\n") Err bitreich.org 70 i+ delete ev Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/tsv2tcal b/tsv2tcal /scm/ics2txt/file/tsv2tcal.gph bitreich.org 70 i@@ -10,88 +10,82 @@ function mdays(mon, year) Err bitreich.org 70 i return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-# Split the time in seconds since epoch into a table, with fields Err bitreich.org 70 i-# named as with gmtime(3): tm["year"], tm["mon"], tm["mday"], Err bitreich.org 70 i-# tm["hour"], tm["min"], tm["sec"] Err bitreich.org 70 i-function gmtime(sec, tm, Err bitreich.org 70 i- s) Err bitreich.org 70 i+function gmtime(sec, tm) Err bitreich.org 70 i { Err bitreich.org 70 i tm["year"] = 1970 Err bitreich.org 70 i while (sec >= (s = 86400 * (365 + isleap(tm["year"])))) { Err bitreich.org 70 i tm["year"]++ Err bitreich.org 70 i sec -= s Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i tm["mon"] = 1 Err bitreich.org 70 i while (sec >= (s = 86400 * mdays(tm["mon"], tm["year"]))) { Err bitreich.org 70 i tm["mon"]++ Err bitreich.org 70 i sec -= s Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i tm["mday"] = 1 Err bitreich.org 70 i while (sec >= (s = 86400)) { Err bitreich.org 70 i tm["mday"]++ Err bitreich.org 70 i sec -= s Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i tm["hour"] = 0 Err bitreich.org 70 i while (sec >= 3600) { Err bitreich.org 70 i tm["hour"]++ Err bitreich.org 70 i sec -= 3600 Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i tm["min"] = 0 Err bitreich.org 70 i while (sec >= 60) { Err bitreich.org 70 i tm["min"]++ Err bitreich.org 70 i sec -= 60 Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i tm["sec"] = sec Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-function print_fold(prefix, s, n) Err bitreich.org 70 i+function localtime(sec, tm, Err bitreich.org 70 i+ tz, h, m) Err bitreich.org 70 i { Err bitreich.org 70 i- while (s != "") { Err bitreich.org 70 i- line = substr(s, 1, n) Err bitreich.org 70 i- if (length(s) > n) sub(" +[^ \t\r\n]*$", "", line) Err bitreich.org 70 i- print prefix line Err bitreich.org 70 i- s = substr(s, length(line) + 2) Err bitreich.org 70 i- } Err bitreich.org 70 i+ return gmtime(sec + TZOFFSET, tm) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i BEGIN { Err bitreich.org 70 i- cmd = "date +%z" Err bitreich.org 70 i- cmd | getline zone Err bitreich.org 70 i- close(cmd) Err bitreich.org 70 i+ "date +%z" | getline tz Err bitreich.org 70 i+ close("date +%z") Err bitreich.org 70 i+ TZOFFSET = substr(tz, 1, 1) substr(tz, 2, 2)*3600 + substr(tz, 4, 2)*60 Err bitreich.org 70 i Err bitreich.org 70 i- hour = substr(zone, 2, 2) Err bitreich.org 70 i- min = substr(zone, 4, 2) Err bitreich.org 70 i+ print("TZ" tz) Err bitreich.org 70 i Err bitreich.org 70 i- offset = (substr(zone, 1, 1) "1") * (hour * 3600 + min * 60) Err bitreich.org 70 i- print "TZ" zone Err bitreich.org 70 i+ FS = "\t" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+NR == 1 { Err bitreich.org 70 i+ for (i = 1; i <= NF; i++) Err bitreich.org 70 i+ name[i] = $i Err bitreich.org 70 i+ next Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i { Err bitreich.org 70 i- split($0, a, "\t") Err bitreich.org 70 i- gmtime(a[1] + offset, beg) Err bitreich.org 70 i- gmtime(a[2] + offset, end) Err bitreich.org 70 i- cat = a[3]; loc = a[4]; sum = a[5]; des = a[6] Err bitreich.org 70 i+ for (i = 1; i <= NF; i++) Err bitreich.org 70 i+ ev[name[i]] = $i Err bitreich.org 70 i+ Err bitreich.org 70 i+ print("") Err bitreich.org 70 i Err bitreich.org 70 i- print "" Err bitreich.org 70 i- printf "%04d-%02d-%02d %02d:%02d ", Err bitreich.org 70 i- beg["year"], beg["mon"], beg["mday"], beg["hour"], beg["min"] Err bitreich.org 70 i- print sum Err bitreich.org 70 i+ localtime(ev["beg"] + offset, tm) Err bitreich.org 70 i+ printf("%04d-%02d-%02d %02d:%02d\n", Err bitreich.org 70 i+ tm["year"], tm["mon"], tm["mday"], tm["hour"], tm["min"]) Err bitreich.org 70 i+ delete ev["beg"] Err bitreich.org 70 i Err bitreich.org 70 i- printf "%04d-%02d-%02d %02d:%02d ", Err bitreich.org 70 i- end["year"], end["mon"], end["mday"], end["hour"], end["min"] Err bitreich.org 70 i- print "[" cat "] " loc Err bitreich.org 70 i+ localtime(ev["end"] + offset, tm) Err bitreich.org 70 i+ printf("%04d-%02d-%02d %02d:%02d\n", Err bitreich.org 70 i+ tm["year"], tm["mon"], tm["mday"], tm["hour"], tm["min"]) Err bitreich.org 70 i+ delete ev["end"] Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 1; i <= NF; i++) { Err bitreich.org 70 i+ if (name[i] in ev && ev[name[i]]) Err bitreich.org 70 i+ printf(" %s: %s\n", name[i], ev[name[i]]) Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i- sub("^ *", "", des) Err bitreich.org 70 i- sub(" *$", "", des) Err bitreich.org 70 i- if (des) Err bitreich.org 70 i- print_fold(" ", des, 80) Err bitreich.org 70 i+ delete ev Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i END { Err bitreich.org 70 i- print "" Err bitreich.org 70 i+ print("") Err bitreich.org 70 i } Err bitreich.org 70 .