/*
* $Id: jday.c,v 1.12 2005/10/06 22:30:13 hiram Exp $
*
* Copyright (c) 1986-2005, Hiram Clawson - email: jday at hiram.ws
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* Neither name of The Museum of Hiram nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
*
* jday - output julian date
* - no arguments - julian date for right now
* - otherwise, jday [year] [month] [day] [hour] [minute]
* - with only [year] - uses today for month, day, hour, minute
* - with [year] [month] - uses today for day, hour, minute
* - etc...
* - must have [year] if using [month]
* - must have [month] if using [day]
* - must have [day] if using [hour]
* - must have [hour] if using [minute]
* - i.e. the arguments are purely positional
* - or the same format as the output of j2d:
* jday -d year-month-day hh:mm:ss
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "jday.h"
extern char version[];
extern char patchlevel[];
extern char date[];
extern char jday_copyright[];
static void
Version() {
fprintf(stderr, "jday - version %s - %s\n", version, date );
fprintf(stderr, "\t%s\n", jday_copyright );
}
static void
Usage() {
fprintf(stderr, "usage: jday [year [month [day [hour [minute] [second]]]]]\n");
fprintf(stderr, "\tor: jday -d year-month-day hour:minute:second\n" );
Version();
}
int
main( argc, argv )
int argc;
char * argv[];
{
int day;
int mo;
int hour;
int minute;
int second;
int year;
double jd;
time_t now_time;
struct tm *local_now;
struct ut_instant today;
char * cp;
(void) putenv("TZ=GMT");
time ( & now_time);
local_now = localtime (& now_time);
year = local_now->tm_year + 1900;
mo = local_now->tm_mon + 1;
day = local_now->tm_mday;
hour = local_now->tm_hour;
minute = local_now->tm_min;
second = local_now->tm_sec;
if ( argc > 1 ) {
switch ( argc ) {
case 7:
second = atoi( argv[6] );
if ( second > 59 ) second = 59;
if ( second < 0 ) second = 0;
case 6:
minute = atoi( argv[5] );
if ( minute > 59 ) minute = 59;
if ( minute < 0 ) minute = 0;
case 5:
hour = atoi( argv[4] );
if ( hour > 23 ) hour = 23;
if ( hour < 0 ) hour = 0;
case 4:
day = atoi( argv[3] );
if ( day > 31 ) day = 31;
if ( day < 1 ) day = 1;
case 3:
if ( ! strcmp((const char *)argv[1], (const char *) "-d") ) {
long lyear = 0;
if ( 3 != sscanf( argv[2], "%ld-%d-%d", & lyear, & mo, & day ) ) {
fprintf( stderr, "failed sscanf for ymd\n" );
exit (-1);
} else {
year = (int) lyear;
if ( day > 31 ) day = 31;
if ( day < 1 ) day = 1;
if ( mo > 12 ) mo = 12;
if ( mo < 1 ) mo = 1;
}
if ( 3 != sscanf( argv[3], "%d:%d:%d", & hour, & minute, & second ) ) {
fprintf( stderr, "failed sscanf for hms\n" );
exit (-1);
} else {
if ( second > 59 ) second = 59;
if ( second < 0 ) second = 0;
if ( minute > 59 ) minute = 59;
if ( minute < 0 ) minute = 0;
if ( hour > 23 ) hour = 23;
if ( hour < 0 ) hour = 0;
break;
}
} else {
mo = atoi( argv[2] );
if ( mo > 12 ) mo = 12;
if ( mo < 1 ) mo = 1;
}
case 2:
if ( (char *) NULL != (cp =
strstr((const char *)argv[1], (const char *) "-h") ) ){
Usage();
exit(0);
}
if ( (char *) NULL != (cp =
strstr((const char *)argv[1], (const char *) "-v") ) ){
Version();
exit(0);
}
year = atoi( argv[1] );
break;
default:
Usage();
break;;
}
}
/* clear the today structure */
today.year = 0;
today.month = 0;
today.day = 0;
today.i_hour = 0;
today.i_minute = 0;
today.second = 0.0;
today.d_hour = 0;
today.d_minute = 0;
today.weekday = 7;
today.day_of_year = 0;
today.j_date = 2147483647;
today.j_date = (today.j_date * 2.0) + 1.0;
today.year = year;
today.month = mo;
today.day = day;
today.i_hour = hour;
today.i_minute = minute;
today.second = (double) second;
/* for completeness */
today.d_minute = today.i_minute + (today.second / 60.0);
today.d_hour = today.i_hour + (today.d_minute / 60.0);
jd = JulDate( & today );
printf( "%-17.6f\n", jd );
exit( 0 );
/* NOTREACHED */
}
syntax highlighted by Code2HTML, v. 0.9.1