| 
 
 Home 
  Download 
  The API 
  Example Code 
  Why I Coded These 
  Known Calendars 
  Transition Dates 
  Udunits 
 |   Example udunits-2 compatible code
 
These example programs can be downloaded along with the main CalCalcs
code here.
 
This first example shows how to use the utCalendar2_cal and utInvCalendar2_cal calls.
Note that you do not have to initialize a CalCalcs calendar to use these calls;
the only thing passed is the name of the calendar to use (i.e., "Standard", "Gregorian",
"Juilan", etc.).  This simplifies the interface for these two routines and makes them
nearly drop-in replacements for the old utCalendar and utInvCalendar routines found in
version 1 of the udunits library.
 
#include <stdio.h>#include <stdlib.h>
 
 #include <udunits2.h>
 #include "calcalcs.h"
 #include "utCalendar2_cal.h"
 
 /* Exercise the udunits calls */
 
 int main( int argc, char *argv[] )
 {
 static	char *units    = "seconds since 2010-01-06 09:20";
 static	char *calendar = "Standard";
 
 ut_system	*u_system;
 ut_unit		*u_1;
 double		tval, tval_inv, sec;
 int		ierr, yr, mo, day, hr, min;
 
 /* Initialize the udunits-2 library */
 if( (u_system = ut_read_xml( NULL )) == NULL ) {
 fprintf( stderr, "Error initializing udunits-2 unit system\n" );
 exit(-1);
 }
 
 /* Parse the units strings */
 if( (u_1 = ut_parse( u_system, units, UT_ASCII )) == NULL ) {
 fprintf( stderr, "Error parsing units string \"%s\"\n", units );
 exit(-1);
 }
 
 /* Make the Calendar calls */
 tval = 86460.0;		/* in seconds, this is 1 day and 1 minute */
 
 if( (ierr = utCalendar2_cal( tval, u_1, &yr, &mo, &day, &hr, &min, &sec, calendar )) != 0 ) {
 fprintf( stderr, "Error on utCalendar2_cal call: %s\n", ccs_err_str(ierr) );
 exit(-1);
 }
 printf( "%lf %s in the %s calendar equals date %04d-%02d-%02d %02d:%02d:%06.3lf\n",
 tval, units, calendar, yr, mo, day, hr, min, sec );
 
 /* For a test, convert back from the date to a value and see if it matches */
 if( (ierr = utInvCalendar2_cal( yr, mo, day, hr, min, sec, u_1, &tval_inv, calendar )) != 0 ) {
 fprintf( stderr, "Error on utCalendar2_cal call: %s\n", ccs_err_str(ierr) );
 exit(-1);
 }
 printf( "Test: %04d-%02d-%02d %02d:%02d:%06.3lf is %lf %s in the %s calendar\n",
 yr, mo, day, hr, min, sec, tval_inv, units, calendar );
 
 return(0);
 }
 
   Example CalCalcs code
 
This second example shows how to use the Calcalcs library proper.
Note that you do not have to link to the udunits-2 library to use this code.
This example program can be downloaded along with the main CalCalcs
code here.
 
#include <stdio.h>#include <stdlib.h>
 
 #include "calcalcs.h"
 
 /*=======================================================================*/
 void do_tests( const char *calendar_name, int year, int month, int day )
 {
 calcalcs_cal    *cal;
 int        ierr, jday, leap, tyear, tmonth, tday, doy, days_since;
 
 /* Initialize the calendar */
 if( (cal = ccs_init_calendar( calendar_name )) == NULL ) {
 fprintf( stderr, "Error trying to initialize calendar %s\n",
 calendar_name );
 exit(-1);
 }
 
 /* Is the passed year a leap year? */
 if( (ierr = ccs_isleap( cal, year, &leap )) != 0 )
 printf( "Determining whether %d is a leap year in the %s calendar returned an error: %s\n",
 year, calendar_name, ccs_err_str(ierr) );
 else
 printf( "Year %d %s a leap year in the %s calendar\n",
 year, ((leap==1)?"IS":"is NOT"), calendar_name );
 
 /* Convert the passed Y/M/D date to a Julian day number */
 if( (ierr = ccs_date2jday( cal, year, month, day, &jday )) != 0 )
 printf( "Turning %04d-%02d-%02d into a Julian day returned an error: %s\n",
 year, month, day, ccs_err_str(ierr) );
 else
 printf( "%04d-%02d-%02d in the %s calendar is Julian day %d\n",
 year, month, day, calendar_name, jday );
 
 /* Convert the julian day we just calcalculated back into a date, it should match! */
 if( (ierr = ccs_jday2date( cal, jday, &tyear, &tmonth, &tday )) != 0 )
 printf( "Turning Julian day %d into a date returned an error: %s\n",
 jday, ccs_err_str(ierr) );
 else
 printf( "Julian day %d is date %04d-%02d-%02d in the %s calendar\n",
 jday, tyear, tmonth, tday, calendar_name );
 
 /* Get the day number of the year */
 if( (ierr = ccs_date2doy( cal, year, month, day, &doy )) != 0 )
 printf( "Turning %04d-%02d-%02d into a day-of-year returned an error: %s\n",
 year, month, day, ccs_err_str(ierr) );
 else
 printf( "%04d-%02d-%02d in the %s calendar is day-of-year number %d\n",
 year, month, day, calendar_name, doy );
 
 /* Convert the day-of-year we just calculated back into a date, it should match */
 if( (ierr = ccs_doy2date( cal, year, doy, &tmonth, &tday )) != 0 )
 printf( "Turning day %d of year %d into a date in the %s calendar returned an error: %s\n",
 doy, year, calendar_name, ccs_err_str(ierr) );
 else
 printf( "day-of-year %d of year %d is date %04d-%02d-%02d in the %s calendar\n",
 doy, year, year, tmonth, tday, calendar_name );
 
 /* Do a couple "days since" calls */
 days_since = 5;
 if( (ierr = ccs_dayssince( cal, year, month, day, days_since, cal, &tyear, &tmonth, &tday )) != 0 )
 printf( "Calculating %d days since  %04d-%02d-%02d in the %s calendar gave error %s\n",
 days_since, year, month, day, calendar_name, ccs_err_str(ierr));
 else
 printf( "%d days since  %04d-%02d-%02d in the %s calendar is %04d-%02d-%02d\n",
 days_since,  year, month, day, calendar_name, tyear, tmonth, tday );
 
 days_since = -5;
 if( (ierr = ccs_dayssince( cal, year, month, day, days_since, cal, &tyear, &tmonth, &tday )) != 0 )
 printf( "Calculating %d days since  %04d-%02d-%02d in the %s calendar gave error %s\n",
 days_since, year, month, day, calendar_name, ccs_err_str(ierr));
 else
 printf( "%d days since  %04d-%02d-%02d in the %s calendar is %04d-%02d-%02d\n",
 days_since,  year, month, day, calendar_name, tyear, tmonth, tday );
 
 
 /* Free the calendar */
 ccs_free_calendar( cal );
 
 printf( "\n" );
 }
 
 /*=======================================================================*/
 int main( int argc, char *argv[] )
 {
 do_tests( "Standard", 2010,  1, 6 );    /* Day I'm writing this */
 do_tests( "Standard", 1858, 11, 16);    /* Wikipedia: Jul Day # 2,400,000 */
 do_tests( "Standard", 2132,  8, 31);    /* Wikipedia: Jul Day # 2,500,000 */
 
 /* Try some dates around the calendar transition dates for fun */
 do_tests( "Standard", 1582, 10,  4 );    /* Day before transition in Std cal */
 do_tests( "Standard", 1582, 10, 15 );    /* Day after  transition in Std cal */
 do_tests( "Standard", 1582, 10,  9 );    /* Day DOES NOT EXIST in Std cal, should give errors */
 
 return(0);
 }
 
 
 |