#!/usr/bin/perl

use 5.008 ; use strict ; use warnings ; 
use Getopt::Std ; getopts ".:!1bc:dgs" , \my %o ; 
use Time::HiRes qw[ gettimeofday tv_interval ] ; # Perl 5.7.3からコアモジュール
use Term::ANSIColor qw[color] ; 

$| = 1 if $o{'!'}  ;
my $t0s = time ; # エポック秒の取得 以前は$t0simple
my $t0p= [ gettimeofday ] ; #t0precise; # 「起動した時刻」の記録
my $dig = $o{'.'} if defined $o{'.'} ; # 桁数 (表示する秒の小数点以下の桁数)
my $d6 = 1e6 / 10 ** $dig if defined $dig ; 
my $HMS = '%02d:%02d:%02d' ; #　何度も使われる書式
do { & main ; exit } ; 

sub hhmmss0 () { sprintf $HMS , @{[localtime]}[2,1,0] }
sub hhmmssD () { my($s,$m)=gettimeofday ; sprintf "$HMS.%0${dig}d",@{[localtime $s]}[2,1,0],int $m/$d6 }
sub ymdhms () { my @f=localtime;$f[4]+=1;$f[5]+=1900 ; sprintf "%02d-%02d-%02d $HMS" , @f[5,4,3,2,1,0] }
sub secondsSince0 () { return sprintf "%0.0f" , time - $t0s } 
sub secondsSinceD () { return sprintf "%0.${dig}f" , tv_interval ( $t0p) }
sub timenow () {
  my $t1 = $o{d} ? ymdhms : defined $dig ? hhmmssD : hhmmss0 ; 
  my $t2 = $dig ? secondsSinceD : secondsSince0 ; 
  ($t0s, $t0p) = ( time, [ gettimeofday ] ) if $o{g} ; 
  "$t1 $t2" ;
}

sub main () { 
  goto J1 if $o{b} ; 
  * timenow = $o{d} ? * ymdhms : defined $dig ? * hhmmssD : * hhmmss0 ; 
  * timenow = $dig ? * secondsSinceD : * secondsSince0 if $o{s} ; 
  J1: 
  my $C = defined $o{c} ? $o{c} eq 0 ? '' : color $o{c} : color 'faint bold' ;
  my $R = defined $o{c} ? $o{c} eq 0 ? '' : color 'reset' : color 'reset' ; 
  while (<>) { my $t = timenow ; print "$C$t$R\t$_" } ;
}

## ヘルプの扱い
sub VERSION_MESSAGE {}
sub HELP_MESSAGE{
    use FindBin qw[ $Script ] ; 
    $ARGV[1] //= '' ;
    open my $FH , '<' , $0 ;
    while(<$FH>){
        s/\$0/$Script/g ;
        print $_ if $ARGV[1] eq 'opt' ? m/^\ +\-/ : s/^=head1// .. s/^=cut// ;
    }
    close $FH ;
    exit 0 ;
}

=encoding utf8 

=head1

 $0 

  $0 は入力を可能な限り読取り、その各行の先頭に読み取った時刻の情報を
  タブ区切りで出力する。

 オプション : 
    -c STR : 色を指定する。0 で色無し。"cyan", "yellow", "faint red bold" "bright_blue" など Term::ANSIColor で使える色が使える。
    -d : 日付(yyyy-mm-dd) を出力。
    -s : $0 を起動してからの秒数を出力。
    -. N : 秒数を小数点以下 N 桁出力する。1から6の整数値が使える。

    -b : 開始からの秒数も、日時も同時に表示する。
    -g : 開始からの秒数でなくて、1行ごとの間隔秒数を表示。-b と共に使う。(gap)
    -! : 出力のバッファリングをしない。


  開発メモ : 

    * -! に意味はあるのか? unbuffer コマンドの使い方も調べて検討したい。
    * 上記の4個の問題が解決したら、英文のマニュアルも用意しよう。

=cut 
