#!/usr/bin/perl
#
# @(#) $Header: /opt/ntp/timelord/shm/RCS/timesplit,v 2.0.0.1 2006/08/01 09:50:08 skia Exp $
# @(#) Read a timelog and generate two files, one before a date and one after.
# @(#) For updates check: http://www.gs3tech.com/
#
use strict;
#
use vars qw ($StartTime $EndTime);
use vars qw ($RstrEdate $RstrSdate $RstrEtime $RstrStime);
use vars qw ($RstrRdate $RstrLdate $ReceiverTimeMode $RstrRtime $RstrLtime);
use vars qw ($TimeFormat);
use vars qw ($cutdate);
use vars qw ($infile);
use vars qw ($NARGS);$NARGS=$#ARGV+1;				# Keep here to make life easier
$TimeFormat="USA1";
$ReceiverTimeMode="UTC";
#
my($li, $lj, $lk, $ll, $lm);
# Get any command line args
&ProcCmdLine;
#
	print "Input File:\n\t${infile}\n";
	if( ! -f $infile ) {
		print "Input file: ${infile} does not exist\r\n";
		exit;
	}
	#
	if( &read_data ) {
		exit;
	}
exit;
#
# Call this routine to read the data file and split it
sub read_data
{
	my($t, $ft, $Npoints, $npl);
	my($rtimestart, $split1, $split2);
	$rtimestart=time;
	$cutdate=$rtimestart - ($cutdate*24*60*60);
	$EndTime=$cutdate;
	$Npoints=0;
	$split1 = "${infile}.SPLIT1";
	$split2 = "${infile}.SPLIT2";
	#
	if( !open(XXX, "<$infile") ) {
		print "Error Reading data file: ${infile}\r\n";	
		return 1;
	}
	if( !open(YYY, ">$split1") ) {
		close(XXX);
		print "Error writing data file: ${split1}\r\n";	
		return 1;
	}
	if( !open(ZZZ, ">$split2") ) {
		close(XXX);
		close(YYY);
		print "Error writing data file: ${split2}\r\n";	
		return 1;
	}
	print "Reading from:\r\n\t${infile}\r\n";
	print "Split1:\r\n\t${split1}\r\n";
	print "Split2:\r\n\t${split2}\r\n";
	#
	TOPW: while(<XXX>) {
		($t, $ft) = $_ =~ /^([^,]*),(.*)$/;
		if( $Npoints == 0 ) {
			$StartTime=$t;
		}
		if( $t > $cutdate ) {
			$EndTime=$t;
			&FormatTime;
			print "Split1\r\n\tStart: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${Npoints}\n";
			last TOPW;
		}
		print YYY $_;
		$Npoints++;
	}
	$npl=0;
	while(<XXX>) {
		($t, $ft) = $_ =~ /^([^,]*),(.*)$/;
		if( $npl == 0 ) {
			$StartTime=$t;
		}
		$Npoints++;
		$npl++;
		print ZZZ $_;
	}
	$EndTime=$t;
	&FormatTime;
	print "Split2\r\n\tStart: ${RstrSdate} ${RstrStime}, End: ${RstrEdate} ${RstrEtime}, Total: ${npl}\n";
	close(XXX);
	close(YYY);
	close(ZZZ);
	print "Number of data points in file:\r\n\t${Npoints}\r\n";
	return 0;
}
#
# This routine builds the time strings
sub FormatTime {
	my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
	my($lsec, $lmin, $lhour, $lmday, $lmon, $lyear, $lwday, $lyday, $lisdst);
	#
	($lsec, $lmin, $lhour, $lmday, $lmon, $lyear, $lwday, $lyday, $lisdst) = gmtime($StartTime);
	$lyear+=1900;$lmon++;$lyday++;
	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($EndTime);
	$year+=1900;$mon++;$yday++;
	#
	# Now prepare the display for the time format
	# PB - Enjoy!
	if( $TimeFormat =~ /USA1/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%02d:%02d:%02d", $hour, $min, $sec);
		$RstrStime=sprintf("%02d:%02d:%02d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /USA2/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%3d-%02d:%02d:%02d", $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%3d-%02d:%02d:%02d", $lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /USA3/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mon, $mday, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmon, $lmday, $lyear);
		#
		$RstrEtime=sprintf("%04d.%3d-%02d:%02d:%02d", $year, $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%04d.%3d-%02d:%02d:%02d", $lyear,$lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR1/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%02d:%02d:%02d", $hour, $min, $sec);
		$RstrStime=sprintf("%02d:%02d:%02d.%d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR2/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%3d-%02d:%02d:%02d", $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%3d-%02d:%02d:%02d", $lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /EUR3/ ) {
		$RstrEdate=sprintf("%02d/%02d/%04d", $mday, $mon, $year);
		$RstrSdate=sprintf("%02d/%02d/%04d", $lmday, $lmon, $lyear);
		#
		$RstrEtime=sprintf("%04d.%3d-%02d:%02d:%02d", $year, $yday, $hour, $min, $sec);
		$RstrStime=sprintf("%04d.%3d-%02d:%02d:%02d", $lyear,$lyday, $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /ISO1/ ) {
		# Code by CRF
		$RstrRdate=sprintf("%04d-%02d-%02d", $year, $mon, $mday);
		$RstrLdate=sprintf("%04d-%02d-%02d", $lyear, $lmon, $lmday);
		#
		$RstrRtime=sprintf("%02d:%02d:%02d %s", $hour, $min, $sec, $ReceiverTimeMode);
		$RstrLtime=sprintf("%02d:%02d:%02d", $lhour, $lmin, $lsec);
	} elsif( $TimeFormat =~ /ISO2/ ) {
		#
		# Code by CRF
		$RstrRdate=sprintf("%04d-%02d-%02d", $year, $mon, $mday);
		$RstrLdate=sprintf("%04d-%02d-%02d", $lyear, $lmon, $lmday);
		#
		$RstrRtime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d %s", $year, $mon, $mday, $hour, $min, $sec, $ReceiverTimeMode);
		$RstrLtime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d", $year, $mon, $mday, $lhour, $lmin, $lsec);
	}
}
#---------------------------------------------------------------
# ---Section--- Command line processing
#
# Process the command line arguments
#
sub ProcCmdLine {
	my($ii, $sarg, @arsave);
	#
	@arsave = @ARGV;
	if( !$NARGS  || ($NARGS < 2) ) {
		&ShowHelp;
	}
	#
	$cutdate = shift @ARGV;
	$infile = shift @ARGV;
}
#
# Show the help info
sub ShowHelp {
	#
	print "Usage:\t$0 number_of_days_to_keep input_file\r\n";
	exit;
}
