+#!/usr/bin/perl
+
+use Palm::PDB;
+use Palm::Datebook;
+use Time::Local;
+use POSIX;
+
+$us= $0 =~ m,[^/]+$, ? $& : $0;
+
+$detail= 86400*2;
+$lookforward= 86400*(7*4+1);
+# run at 15:00 daily
+
+sub setfilename($) {
+ die "$us: only one filename at a time please\n" if defined $filename;
+ $filename= $_[0];
+}
+
+while (@ARGV) {
+ $_= shift @ARGV;
+ if (m,^(?:\-t)?(\d+)/(\d+)$,) {
+ ($detail,$lookforward)=($1+0,$2+0);
+ } elsif (m,^[./],) {
+ setfilename($_);
+ } elsif (m/^\-f/) {
+ setfilename($');
+ } else {
+ die "$us: unknown argument/option \`$_'\n";
+ }
+}
+
+$filename= "DatebookDB.pdb" if !defined $filename;
+
+defined($now= time) or die $!;
+stat $filename or die "$us: $filename: $!\n";
+$backuptime= (stat _)[9];
+
+$pdb = new Palm::PDB or die $!;
+$pdb->Load($filename) or die $!;
+
+
+
+foreach $record (@{ $pdb->{records} }) {
+ if ($record->{start_hour} != 255) {
+ $timestr= sprintf("%02d:%02d-%02d:%02d",
+ $record->{start_hour},
+ $record->{start_minute},
+ $record->{end_hour},
+ $record->{end_minute});
+ @lt=(0, $record->{start_minute}, $record->{start_hour});
+ } else {
+ @lt=(0, 0, 9);
+ $timestr= " ";
+ }
+ if ($record->{repeat}{type}) {
+ $timestr= "onwards ";
+ }
+
+ push @lt, $record->{day}, $record->{month}-1, $record->{year}-1900;
+ defined($ettt= timelocal @lt) or die $!;
+
+ next if ($ettt < $now - 86400 ||
+ $ettt > $now + $lookforward);
+
+ @lt2= localtime($ettt) or die $!;
+ defined($dowstr= strftime "%a", @lt2) or die $!;
+
+ $datestr= sprintf("%04d-%02d-%02d",
+ $record->{year},
+ $record->{month},
+ $record->{day});
+
+ $timesortkey= "$datestr $timestr";
+ $evhead= "$datestr $dowstr $timestr";
+
+ $desc= $record->{description};
+ $desc =~ s/\x93/\~/g;
+ $desc =~ s/\xa3/L/g;
+ $desc =~ s/[^\n -\176]/ sprintf "\\x%02x", ord $& /eg;
+ $desc =~ s/^ +//;
+ $desc =~ s/\n+$//;
+ $desc .= "\n";
+
+ if ($desc =~ m/^(.{0,51})\n/) {
+ $descsumm= $1;
+ } elsif ($desc =~ m/^.{48}/) {
+ $descsumm= $&.'...';
+ } else {
+ $descsumm= " --- no description ?! ---";
+ }
+ $kind= $ettt < $now + $detail ? 'detail' : 'forward';
+
+ push @{ $events{$kind} }, {
+ TSK => $timesortkey,
+ Headline => sprintf("%s %s", $evhead, $descsumm),
+ Desc => $desc
+ };
+}
+
+sub sectline_detail(){ return "Imminent events"; }
+sub sectline_forward(){ return "Forthcoming events"; }
+
+sub headline(){
+ printf("%s\n", $ev->{Headline})
+ or die $!;
+}
+
+sub print_forward(){ headline(); }
+sub print_detail(){
+ print "\n" or die $!;
+ headline();
+ $_= $ev->{Desc};
+ s/^/ /gm;
+ print $_ or die $!;
+}
+
+foreach $kind (qw(detail forward)) {
+ $sectline= &{"sectline_$kind"};
+ printf("%s\n%s\n",
+ $sectline,
+ '-'x(length $sectline))
+ or die $!;
+ if (!@{ $events{$kind} }) {
+ printf("None scheduled.\n")
+ or die $!;
+ }
+ foreach $ev (sort { $a->{TSK} cmp $b->{TSK} } @{ $events{$kind} }) {
+ &{"print_$kind"};
+ }
+ print "\n" or die $!;
+}
+
+@lt2= localtime $backuptime or die $!;
+defined ($syncstr= strftime "%Y-%m-%d %a %H:%M", @lt2) or die $!;
+
+print("Date of last synch: $syncstr\n".
+ "Events entered on PDA after this date are omitted.\n")
+ or die $!;
+
+close STDOUT or die $!;