From d7586b2b79849f2eedea28153e70baed0239ab9b Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de> Date: Fri, 19 Jan 2024 11:49:09 +0100 Subject: [PATCH] Revert the codebase to d524da1d --- examples/.gitignore | 1 - examples/Makefile.am | 3 - examples/Makefile.in | 19 +- examples/test_cf_timeaxis.f90 | 146 ------- include/mtime_julianDay.h | 4 +- src/.dir-locals.el | 1 - src/libmtime.f90 | 755 +++++++++++++++++++--------------- src/mtime_c_bindings.f90 | 7 +- src/mtime_date.c | 12 +- src/mtime_datetime.c | 51 ++- src/mtime_eventHandling.c | 435 +++++++++++++------- src/mtime_iso8601.c | 20 +- src/mtime_iso8601.rl | 20 +- src/mtime_julianDay.c | 22 +- src/mtime_t_datetime.inc | 1 + src/mtime_t_event.inc | 2 +- src/mtime_t_timedelta.inc | 2 +- src/mtime_timedelta.c | 585 +++++++++++++++++--------- test/mtime_julianDay_test.c | 98 ++--- test/mtime_julianDay_test.h | 4 +- 20 files changed, 1238 insertions(+), 950 deletions(-) delete mode 100644 examples/test_cf_timeaxis.f90 delete mode 100644 src/.dir-locals.el diff --git a/examples/.gitignore b/examples/.gitignore index accddae9..36bb2ef7 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -21,5 +21,4 @@ simulate_iau test_dace time_calculus test_jd_logic -test_cf_timeaxis uniq diff --git a/examples/Makefile.am b/examples/Makefile.am index 648550a4..3d3c1278 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -22,7 +22,6 @@ noinst_PROGRAMS = \ test_dace \ time_calculus \ test_jd_logic \ - test_cf_timeaxis \ uniq endif ENABLE_EXAMPLES @@ -40,7 +39,6 @@ recurrence_SOURCES = recurrence.c test_dace_SOURCES = test_dace.f90 mo_event_manager.f90 time_calculus_SOURCES = time_calculus.c test_jd_logic_SOURCES = test_jd_logic.f90 -test_cf_timeaxis_SOURCES = test_cf_timeaxis.f90 if FCMODUC mo_event_manager_mod = MO_EVENT_MANAGER.$(FCMODEXT) @@ -82,7 +80,6 @@ simulate_iau.$(OBJEXT) \ tas.$(OBJEXT) \ test_dace.$(OBJEXT) \ test_jd_logic.$(OBJEXT) \ -test_cf_timeaxis.$(OBJEXT) \ uniq.$(OBJEXT): $(top_builddir)/src/$(mtime_mod) example_hl.$(OBJEXT) \ diff --git a/examples/Makefile.in b/examples/Makefile.in index adbcbd21..071b84ea 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -99,8 +99,7 @@ host_triplet = @host@ @ENABLE_EXAMPLES_TRUE@ simulate_iau$(EXEEXT) tas$(EXEEXT) \ @ENABLE_EXAMPLES_TRUE@ test_dace$(EXEEXT) \ @ENABLE_EXAMPLES_TRUE@ time_calculus$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ test_jd_logic$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ test_cf_timeaxis$(EXEEXT) uniq$(EXEEXT) +@ENABLE_EXAMPLES_TRUE@ test_jd_logic$(EXEEXT) uniq$(EXEEXT) subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \ @@ -184,10 +183,6 @@ tas_SOURCES = tas.f90 tas_OBJECTS = tas.$(OBJEXT) tas_LDADD = $(LDADD) tas_DEPENDENCIES = $(top_builddir)/src/libmtime.la -am_test_cf_timeaxis_OBJECTS = test_cf_timeaxis.$(OBJEXT) -test_cf_timeaxis_OBJECTS = $(am_test_cf_timeaxis_OBJECTS) -test_cf_timeaxis_LDADD = $(LDADD) -test_cf_timeaxis_DEPENDENCIES = $(top_builddir)/src/libmtime.la am_test_dace_OBJECTS = test_dace.$(OBJEXT) mo_event_manager.$(OBJEXT) test_dace_OBJECTS = $(am_test_dace_OBJECTS) test_dace_LDADD = $(LDADD) @@ -260,15 +255,13 @@ SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \ example.f90 example_hl.f90 $(iconatm_SOURCES) \ $(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \ $(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \ - repetitor.f90 simulate_iau.f90 tas.f90 \ - $(test_cf_timeaxis_SOURCES) $(test_dace_SOURCES) \ + repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \ $(test_jd_logic_SOURCES) $(time_calculus_SOURCES) uniq.f90 DIST_SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \ example.f90 example_hl.f90 $(iconatm_SOURCES) \ $(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \ $(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \ - repetitor.f90 simulate_iau.f90 tas.f90 \ - $(test_cf_timeaxis_SOURCES) $(test_dace_SOURCES) \ + repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \ $(test_jd_logic_SOURCES) $(time_calculus_SOURCES) uniq.f90 am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ @@ -472,7 +465,6 @@ recurrence_SOURCES = recurrence.c test_dace_SOURCES = test_dace.f90 mo_event_manager.f90 time_calculus_SOURCES = time_calculus.c test_jd_logic_SOURCES = test_jd_logic.f90 -test_cf_timeaxis_SOURCES = test_cf_timeaxis.f90 @FCMODUC_FALSE@mo_event_manager_mod = mo_event_manager.$(FCMODEXT) @FCMODUC_TRUE@mo_event_manager_mod = MO_EVENT_MANAGER.$(FCMODEXT) @FCMODUC_FALSE@mo_exception_mod = mo_exception.$(FCMODEXT) @@ -589,10 +581,6 @@ tas$(EXEEXT): $(tas_OBJECTS) $(tas_DEPENDENCIES) $(EXTRA_tas_DEPENDENCIES) @rm -f tas$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(tas_OBJECTS) $(tas_LDADD) $(LIBS) -test_cf_timeaxis$(EXEEXT): $(test_cf_timeaxis_OBJECTS) $(test_cf_timeaxis_DEPENDENCIES) $(EXTRA_test_cf_timeaxis_DEPENDENCIES) - @rm -f test_cf_timeaxis$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(test_cf_timeaxis_OBJECTS) $(test_cf_timeaxis_LDADD) $(LIBS) - test_dace$(EXEEXT): $(test_dace_OBJECTS) $(test_dace_DEPENDENCIES) $(EXTRA_test_dace_DEPENDENCIES) @rm -f test_dace$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(test_dace_OBJECTS) $(test_dace_LDADD) $(LIBS) @@ -921,7 +909,6 @@ simulate_iau.$(OBJEXT) \ tas.$(OBJEXT) \ test_dace.$(OBJEXT) \ test_jd_logic.$(OBJEXT) \ -test_cf_timeaxis.$(OBJEXT) \ uniq.$(OBJEXT): $(top_builddir)/src/$(mtime_mod) example_hl.$(OBJEXT) \ diff --git a/examples/test_cf_timeaxis.f90 b/examples/test_cf_timeaxis.f90 deleted file mode 100644 index d560e1a0..00000000 --- a/examples/test_cf_timeaxis.f90 +++ /dev/null @@ -1,146 +0,0 @@ -!! Copyright (c) 2013-2024 MPI-M, Luis Kornblueh, Rahul Sinha and DWD, Florian Prill. All rights reserved. -!! -!! SPDX-License-Identifier: BSD-3-Clause -!! -program test_cf_timeaxis - - use, intrinsic :: iso_fortran_env, only: int64, wp => real64 - - use mtime - - implicit none - - type(juliandelta), parameter :: timeunit_day = juliandelta('+', 0_int64, 86400000_int64) - type(juliandelta), parameter :: timeunit_hour = juliandelta('+', 0_int64, 3600000_int64) - type(juliandelta), parameter :: timeunit_minute = juliandelta('+', 0_int64, 60000_int64) - type(juliandelta), parameter :: timeunit_second = juliandelta('+', 0_int64, 1000_int64) - - ! epoch: 1870-01-01T00:00 - type(julianday) :: epoch = julianday(2404063, 43200000) - - ! example 1: "days since 1870-01-01T00:00" - ! - character(len=4) :: time1_unit = 'days' - real(wp) :: time1(148) = [ 38730.5, 38760.5, 38790.5, 38821.0, 38851.5, & - & 38882.0, 38912.5, 38943.5, 38974.0, 39004.5, 39035.0, 39065.5, & - & 39096.5, 39126.0, 39155.5, 39186.0, 39216.5, 39247.0, 39277.5, & - & 39308.5, 39339.0, 39369.5, 39400.0, 39430.5, 39461.5, 39491.0, & - & 39520.5, 39551.0, 39581.5, 39612.0, 39642.5, 39673.5, 39704.0, & - & 39734.5, 39765.0, 39795.5, 39826.5, 39856.0, 39885.5, 39916.0, & - & 39946.5, 39977.0, 40007.5, 40038.5, 40069.0, 40099.5, 40130.0, & - & 40160.5, 40191.5, 40221.5, 40251.5, 40282.0, 40312.5, 40343.0, & - & 40373.5, 40404.5, 40435.0, 40465.5, 40496.0, 40526.5, 40557.5, & - & 40587.0, 40616.5, 40647.0, 40677.5, 40708.0, 40738.5, 40769.5, & - & 40800.0, 40830.5, 40861.0, 40891.5, 40922.5, 40952.0, 40981.5, & - & 41012.0, 41042.5, 41073.0, 41103.5, 41134.5, 41165.0, 41195.5, & - & 41226.0, 41256.5, 41287.5, 41317.0, 41346.5, 41377.0, 41407.5, & - & 41438.0, 41468.5, 41499.5, 41530.0, 41560.5, 41591.0, 41621.5, & - & 41652.5, 41682.5, 41712.5, 41743.0, 41773.5, 41804.0, 41834.5, & - & 41865.5, 41896.0, 41926.5, 41957.0, 41987.5, 42018.5, 42048.0, & - & 42077.5, 42108.0, 42138.5, 42169.0, 42199.5, 42230.5, 42261.0, & - & 42291.5, 42322.0, 42352.5, 42383.5, 42413.0, 42442.5, 42473.0, & - & 42503.5, 42534.0, 42564.5, 42595.5, 42626.0, 42656.5, 42687.0, & - & 42717.5, 42748.5, 42778.0, 42807.5, 42838.0, 42868.5, 42899.0, & - & 42929.5, 42960.5, 42991.0, 43021.5, 43052.0, 43082.5, 43113.5, & - & 43143.5, 43173.5, 43204.0 ] - - ! example 2: - character(len=7) :: time2_unit = 'seconds' - real(wp) :: time2(125) = [ 0.0, 21600.0, 43200.0, 64800.0, 86400.0, & - & 108000.0, 129600.0, 151200.0, 172800.0, 194400.0, 216000.0, & - & 237600.0, 259200.0, 280800.0, 302400.0, 324000.0, 345600.0, & - & 367200.0, 388800.0, 410400.0, 432000.0, 453600.0, 475200.0, & - & 496800.0, 518400.0, 540000.0, 561600.0, 583200.0, 604800.0, & - & 626400.0, 648000.0, 669600.0, 691200.0, 712800.0, 734400.0, & - & 756000.0, 777600.0, 799200.0, 820800.0, 842400.0, 864000.0, & - & 885600.0, 907200.0, 928800.0, 950400.0, 972000.0, 993600.0, & - & 1015200.0, 1036800.0, 1058400.0, 1080000.0, 1101600.0, 1123200.0, & - & 1144800.0, 1166400.0, 1188000.0, 1209600.0, 1231200.0, 1252800.0, & - & 1274400.0, 1296000.0, 1317600.0, 1339200.0, 1360800.0, 1382400.0, & - & 1404000.0, 1425600.0, 1447200.0, 1468800.0, 1490400.0, 1512000.0, & - & 1533600.0, 1555200.0, 1576800.0, 1598400.0, 1620000.0, 1641600.0, & - & 1663200.0, 1684800.0, 1706400.0, 1728000.0, 1749600.0, 1771200.0, & - & 1792800.0, 1814400.0, 1836000.0, 1857600.0, 1879200.0, 1900800.0, & - & 1922400.0, 1944000.0, 1965600.0, 1987200.0, 2008800.0, 2030400.0, & - & 2052000.0, 2073600.0, 2095200.0, 2116800.0, 2138400.0, 2160000.0, & - & 2181600.0, 2203200.0, 2224800.0, 2246400.0, 2268000.0, 2289600.0, & - & 2311200.0, 2332800.0, 2354400.0, 2376000.0, 2397600.0, 2419200.0, & - & 2440800.0, 2462400.0, 2484000.0, 2505600.0, 2527200.0, 2548800.0, & - & 2570400.0, 2592000.0, 2613600.0, 2635200.0, 2656800.0, 2678400.0 ] - - iteration1: block - - type(juliandelta) :: time_multiplicator - real(wp) :: s, s0, days, ms - integer :: i - - select case (time1_unit) - case('days') - time_multiplicator = timeunit_day - case('hours') - time_multiplicator = timeunit_hour - case('minuets') - time_multiplicator = timeunit_minute - case('seconds') - time_multiplicator = timeunit_second - end select - - do i = 1, size(time1) - s0 = time1(i)*(1.0e-3_wp*time_multiplicator%ms) ! in seconds - s = s0 - days = 0.0_wp - do while (s >= 86400.0_wp) - s = s - 86400.0_wp - days = days + 1.0_wp - enddo - do while (s < 0.0_wp) - s = s + 86400.0_wp - days = days - 1.0_wp - enddo - write(0,'(i4,4f16.2)') i, time1(i), days, s, s/86400.0_wp - s = s0 - days = floor(s/86400.0_wp) - ms = s - days*86400.0_wp - write(0,'(20x,3f16.2)') days, ms, ms/86400.0_wp - enddo - end block iteration1 - - iteration2: block - - type(juliandelta) :: time_multiplicator - - real(wp) :: s, s0, days, ms - integer :: i - - select case (time2_unit) - case('days') - time_multiplicator = timeunit_day - case('hours') - time_multiplicator = timeunit_hour - case('minuets') - time_multiplicator = timeunit_minute - case('seconds') - time_multiplicator = timeunit_second - end select - - do i = 1, size(time2) - s0 = time2(i)*(1.0e-3_wp*time_multiplicator%ms) ! in seconds - s = s0 - days = 0.0_wp - do while (s >= 86400.0_wp) - s = s - 86400.0_wp - days = days + 1.0_wp - enddo - do while (s < 0.0_wp) - s = s + 86400.0_wp - days = days - 1.0_wp - enddo - write(0,'(i4,4f16.2)') i, time2(i), days, s, s/86400.0_wp - s = s0 - days = floor(s/86400.0_wp) - ms = s - days*86400.0_wp - write(0,'(20x,3f16.2)') days, ms, ms/86400.0_wp - enddo - end block iteration2 - -end program test_cf_timeaxis diff --git a/include/mtime_julianDay.h b/include/mtime_julianDay.h index d3dc8a1f..d575801e 100644 --- a/include/mtime_julianDay.h +++ b/include/mtime_julianDay.h @@ -64,11 +64,11 @@ struct _julianday* addJulianDeltaToJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd); struct _julianday* -subtractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd); +substractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd); /*! \cond PRIVATE */ struct _juliandelta* -subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd); +substractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd); /*! \endcond */ char* diff --git a/src/.dir-locals.el b/src/.dir-locals.el deleted file mode 100644 index 528aa5a3..00000000 --- a/src/.dir-locals.el +++ /dev/null @@ -1 +0,0 @@ -((f90-mode . ((f90-auto-keyword-case . upcase-word)))) diff --git a/src/libmtime.f90 b/src/libmtime.f90 index cf8dad08..95776f48 100644 --- a/src/libmtime.f90 +++ b/src/libmtime.f90 @@ -91,8 +91,10 @@ CONTAINS INTEGER :: i TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_calendartostring(string) - IF (.NOT. C_ASSOCIATED(c_pointer)) THEN + IF (.NOT. c_ASSOCIATED(c_pointer)) THEN + IF (PRESENT(errno)) errno = 0 * 100 + 4 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -100,7 +102,6 @@ CONTAINS END DO char_loop string(i:LEN(string)) = ' ' ENDIF - IF (PRESENT(errno)) errno = MERGE(0, 0 * 100 + 4, C_ASSOCIATED(c_pointer)) END SUBROUTINE calendarToString ! END MODULE mtime_calendar @@ -131,8 +132,9 @@ CONTAINS TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL :: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newjuliandelta(sign,day, ms) - IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 1, C_ASSOCIATED(c_pointer)) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 1 * 100 + 1 CALL c_f_POINTER(c_pointer, ret_juliandelta) END FUNCTION newJuliandelta ! @@ -140,7 +142,7 @@ CONTAINS !! @brief destructor for a Julian delta SUBROUTINE deallocateJuliandelta(my_juliandelta) !OK-TESTED. TYPE(juliandelta), POINTER :: my_juliandelta - CALL my_deallocatejuliandelta(C_LOC(my_juliandelta)) + CALL my_deallocatejuliandelta(c_LOC(my_juliandelta)) my_juliandelta => NULL() END SUBROUTINE deallocateJuliandelta ! @@ -167,13 +169,13 @@ MODULE mtime_julianday PUBLIC :: juliandayToString PUBLIC :: ASSIGNMENT(=) PUBLIC :: OPERATOR(+) - PUBLIC :: OPERATOR(-) + PUBLIC :: OPERATOR(-) PUBLIC :: OPERATOR(>) PUBLIC :: OPERATOR(<) PUBLIC :: OPERATOR(<=) PUBLIC :: OPERATOR(>=) PUBLIC :: OPERATOR(==) - PUBLIC :: OPERATOR(/=) + PUBLIC :: OPERATOR(/=) ! INTERFACE ASSIGNMENT (=) MODULE PROCEDURE replacejulianday @@ -185,7 +187,7 @@ MODULE mtime_julianday END INTERFACE OPERATOR (+) ! INTERFACE OPERATOR (-) - MODULE PROCEDURE subtractjuliandayfromjulianday + MODULE PROCEDURE substractjuliandayfromjulianday END INTERFACE OPERATOR (-) ! INTERFACE OPERATOR (>) @@ -227,9 +229,10 @@ CONTAINS INTEGER(c_int64_t), INTENT(in) :: ms TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newjulianday(day, ms) - IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_julianday) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 1 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_julianday) END FUNCTION newJulianday ! !> @@ -238,7 +241,7 @@ CONTAINS !! @param my_julianday a pointer of type(julianday) SUBROUTINE deallocateJulianday(my_julianday) !OK-TESTED. TYPE(julianday), POINTER :: my_julianday - CALL my_deallocatejulianday(C_LOC(my_julianday)) + CALL my_deallocatejulianday(c_LOC(my_julianday)) my_julianday => NULL() END SUBROUTINE deallocateJulianday ! @@ -247,7 +250,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(inout) :: dest TYPE(julianday), TARGET, INTENT(in) :: src TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_replacejulianday(C_LOC(src), C_LOC(dest)) + dummy_ptr = my_replacejulianday(c_LOC(src), c_LOC(dest)) END SUBROUTINE replacejulianday ! !> @@ -262,8 +265,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_juliandaytostring(C_LOC(my_julianday), string) - IF (PRESENT(errno)) errno = MERGE(0, 1 * 100 + 3, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_juliandaytostring(c_LOC(my_julianday), string) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 1 * 100 + 3 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -275,7 +279,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(juliandelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addjuliandeltatojulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addjuliandeltatojulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addJuliandeltaToJulianday ! FUNCTION addJuliandayToJuliandelta(op2, op1) RESULT(ret) @@ -283,23 +287,23 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(juliandelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addjuliandeltatojulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addjuliandeltatojulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addJuliandayToJuliandelta ! - FUNCTION subtractJuliandayFromJulianday(op1, op2) RESULT(ret) + FUNCTION substractJuliandayFromJulianday(op1, op2) RESULT(ret) TYPE(juliandelta), TARGET :: ret TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_subtractjulianday(C_LOC(op1), C_LOC(op2), C_LOC(ret)) - END FUNCTION subtractJuliandayFromJulianday + dummy_ptr = my_substractjulianday(c_LOC(op1), c_LOC(op2), c_LOC(ret)) + END FUNCTION substractJuliandayFromJulianday ! FUNCTION julianday_gt(op1, op2) RESULT(gt) LOGICAL :: gt TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF (ret == 1) THEN gt = .TRUE. ELSE @@ -312,7 +316,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF (ret == -1) THEN lt = .TRUE. ELSE @@ -325,7 +329,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF ((ret == 0) .OR. (ret == -1)) THEN lt_or_eq = .TRUE. ELSE @@ -338,7 +342,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF ((ret == 0) .OR. (ret == 1)) THEN gt_or_eq = .TRUE. ELSE @@ -351,7 +355,7 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF (ret == 0) THEN eq = .TRUE. ELSE @@ -364,14 +368,14 @@ CONTAINS TYPE(julianday), TARGET, INTENT(in) :: op1 TYPE(julianday), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparejulianday(C_LOC(op1), C_LOC(op2)) + ret = my_comparejulianday(c_LOC(op1), c_LOC(op2)) IF (ret /= 0) THEN ne = .TRUE. ELSE ne = .FALSE. ENDIF END FUNCTION julianday_ne - ! + ! END MODULE mtime_julianday !> !! @brief Date and some operations supported on Date. @@ -382,7 +386,7 @@ END MODULE mtime_julianday MODULE mtime_date ! USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_int64_t, c_char, c_ptr, c_null_char, & - & c_loc, c_f_pointer, c_associated + & c_loc, c_f_pointer, c_associated USE mtime_c_bindings USE mtime_constants USE mtime_error_handling @@ -419,9 +423,10 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: string TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL :: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newdatefromstring(TRIM(ADJUSTL(string))//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_date) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_date) END FUNCTION newdatefromstring !> !! @brief construct a new date from raw date @@ -437,9 +442,10 @@ CONTAINS INTEGER(c_int), INTENT(in) :: month, day TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newrawdate(year, month, day) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 2, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_date) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 2 + CALL c_f_POINTER(c_pointer, ret_date) END FUNCTION newdatefromraw_yi8 !> !! @brief construct a new date from raw date @@ -454,9 +460,10 @@ CONTAINS INTEGER(c_int), INTENT(in) :: year, month, day TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newrawdate(INT(year,c_int64_t), month, day) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 3, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_date) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 3 + CALL c_f_POINTER(c_pointer, ret_date) END FUNCTION newdatefromraw !> !! @brief construct a new date from an existing by construct and copy @@ -469,9 +476,10 @@ CONTAINS TYPE(date), TARGET :: src TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno - c_pointer = my_constructandcopydate(C_LOC(src)) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 4, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, dest) + IF (PRESENT(errno)) errno = 0 + c_pointer = my_constructandcopydate(c_LOC(src)) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 2 * 100 + 4 + CALL c_f_POINTER(c_pointer, dest) END FUNCTION newdatefromconstructandcopy !> !! @brief destructor for a date @@ -479,7 +487,7 @@ CONTAINS !! @param[in] my_date a pointer of type(date) SUBROUTINE deallocateDate(my_date) !OK-TESTED. TYPE(date), POINTER :: my_date - CALL my_deallocatedate(C_LOC(my_date)) + CALL my_deallocatedate(c_LOC(my_date)) my_date => NULL() END SUBROUTINE deallocateDate !> @@ -493,8 +501,9 @@ CONTAINS TYPE(date), TARGET, INTENT(in) :: src TYPE(c_ptr) :: dummy_ptr INTEGER, OPTIONAL:: errno - dummy_ptr = my_replacedate(C_LOC(src), C_LOC(dest)) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 6, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_replacedate(c_LOC(src), c_LOC(dest)) + IF ((.NOT. c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 6 END SUBROUTINE replaceDate !> !! @brief Get Date as an extended string. @@ -515,8 +524,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_datetostring(C_LOC(my_date), string) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 7, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_datetostring(c_LOC(my_date), string) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 7 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -544,8 +554,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_datetoposixstring(C_LOC(my_date), string, fmtstr) - IF (PRESENT(errno)) errno = MERGE(0, 2 * 100 + 8, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_datetoposixstring(c_LOC(my_date), string, fmtstr) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 2 * 100 + 8 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -595,9 +606,10 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: string TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newtimefromstring(TRIM(ADJUSTL(string))//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_time) + IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_time) END FUNCTION newtimefromstring ! !! @param[out] errno optional, error message @@ -606,9 +618,10 @@ CONTAINS INTEGER(c_int), INTENT(in) :: hour, minute, second, ms TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newrawtime(hour, minute, second, ms) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 2, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_time) + IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 2 + CALL c_f_POINTER(c_pointer, ret_time) END FUNCTION newtimefromraw ! !! @param[out] errno optional, error message @@ -617,9 +630,10 @@ CONTAINS TYPE(time), TARGET :: src TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno - c_pointer = my_constructandcopytime(C_LOC(src)) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 3, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, dest) + IF (PRESENT(errno)) errno = 0 + c_pointer = my_constructandcopytime(c_LOC(src)) + IF ((.NOT.c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 3 * 100 + 3 + CALL c_f_POINTER(c_pointer, dest) END FUNCTION newtimefromconstructandcopy !> !! @brief Destructor of Time. @@ -628,7 +642,7 @@ CONTAINS !! A pointer to type time. my_time is deallocated. SUBROUTINE deallocateTime(my_time) !OK-TESTED. TYPE(time), POINTER :: my_time - CALL my_deallocatetime(C_LOC(my_time)) + CALL my_deallocatetime(c_LOC(my_time)) my_time => NULL() END SUBROUTINE deallocateTime !> @@ -648,8 +662,9 @@ CONTAINS TYPE(time), TARGET, INTENT(inout) :: dest TYPE(c_ptr) :: dummy_ptr INTEGER, OPTIONAL:: errno - dummy_ptr = my_replacetime(C_LOC(src), C_LOC(dest)) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 5, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_replacetime(c_LOC(src), c_LOC(dest)) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 5 END SUBROUTINE replaceTime !> !! @brief Get time as an extended string. @@ -669,8 +684,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_timetostring(C_LOC(my_time), string) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 6, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_timetostring(c_LOC(my_time), string) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 6 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -696,8 +712,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_timetoposixstring(C_LOC(my_time), string, fmtstr) - IF (PRESENT(errno)) errno = MERGE(0, 3 * 100 + 7, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_timetoposixstring(c_LOC(my_time), string, fmtstr) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 3 * 100 + 7 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -805,9 +822,10 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: string TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newdatetime(TRIM(ADJUSTL(string))//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_datetime) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_datetime) END FUNCTION newdatetimefromstring ! !! @param[out] errno optional, error message @@ -817,9 +835,10 @@ CONTAINS INTEGER(c_int), INTENT(in) :: month, day, hour, minute, second, ms TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newrawdatetime(year, month, day, hour, minute, second, ms) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 2, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_datetime) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 2 + CALL c_f_POINTER(c_pointer, ret_datetime) END FUNCTION newdatetimefromraw_yi8 ! !! @param[out] errno optional, error message @@ -828,9 +847,10 @@ CONTAINS INTEGER(c_int), INTENT(in) :: year, month, day, hour, minute, second, ms TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_newrawdatetime(INT(year,c_int64_t), month, day, hour, minute, second, ms) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 3, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_datetime) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 3 + CALL c_f_POINTER(c_pointer, ret_datetime) END FUNCTION newdatetimefromraw ! !! @param[out] errno optional, error message @@ -839,9 +859,10 @@ CONTAINS TYPE(datetime), TARGET :: src TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno - c_pointer = my_constructandcopydatetime(C_LOC(src)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 4, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, dest) + IF (PRESENT(errno)) errno = 0 + c_pointer = my_constructandcopydatetime(c_LOC(src)) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 4 * 100 + 4 + CALL c_f_POINTER(c_pointer, dest) END FUNCTION newdatetimefromconstructandcopy @@ -884,7 +905,7 @@ CONTAINS !! A pointer to type datetime. my_datetime is deallocated. SUBROUTINE deallocateDatetime(my_datetime) !OK-TESTED. TYPE(datetime), POINTER :: my_datetime - CALL my_deallocatedatetime(C_LOC(my_datetime)) + CALL my_deallocatedatetime(c_LOC(my_datetime)) NULLIFY(my_datetime) END SUBROUTINE deallocateDatetime !> @@ -905,9 +926,10 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_datetimetostring(C_LOC(my_datetime), string) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 6, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_datetimetostring(c_LOC(my_datetime), string) + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 4 * 100 + 6 string ='<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -938,8 +960,9 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_datetimetoposixstring(C_LOC(my_datetime), string, fmtstr) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 7, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_datetimetoposixstring(c_LOC(my_datetime), string, fmtstr) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 7 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -951,7 +974,7 @@ CONTAINS TYPE(datetime), TARGET, INTENT(inout) :: dest TYPE(datetime), TARGET, INTENT(in) :: src TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_replacedatetime(C_LOC(src), C_LOC(dest)) + dummy_ptr = my_replacedatetime(c_LOC(src), c_LOC(dest)) END SUBROUTINE replacedatetime ! FUNCTION datetime_gt(op1, op2) RESULT(gt) !OK-TESTED. @@ -959,8 +982,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - gt = (ret == 1_c_int) + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF (ret == 1) THEN + gt = .TRUE. + ELSE + gt = .FALSE. + ENDIF END FUNCTION datetime_gt ! FUNCTION datetime_lt(op1, op2) RESULT(lt) !OK-TESTED. @@ -968,8 +995,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - lt = (ret == -1_c_int) + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF (ret == -1) THEN + lt = .TRUE. + ELSE + lt = .FALSE. + ENDIF END FUNCTION datetime_lt ! FUNCTION datetime_lt_or_eq(op1, op2) RESULT(lt_or_eq) !OK-TESTED. @@ -977,8 +1008,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - lt_or_eq = (ret == 0_c_int) .OR. (ret == -1_c_int) + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF ((ret == 0) .OR. (ret == -1)) THEN + lt_or_eq = .TRUE. + ELSE + lt_or_eq = .FALSE. + ENDIF END FUNCTION datetime_lt_or_eq ! FUNCTION datetime_gt_or_eq(op1, op2) RESULT(gt_or_eq) !OK-TESTED @@ -986,8 +1021,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - gt_or_eq = (ret == 0_c_int) .OR. (ret == 1_c_int) + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF ((ret == 0) .OR. (ret == 1)) THEN + gt_or_eq = .TRUE. + ELSE + gt_or_eq = .FALSE. + ENDIF END FUNCTION datetime_gt_or_eq ! FUNCTION datetime_eq(op1, op2) RESULT(eq) !OK-TESTED. @@ -995,8 +1034,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - eq = ret == 0_c_int + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF (ret == 0) THEN + eq = .TRUE. + ELSE + eq = .FALSE. + ENDIF END FUNCTION datetime_eq ! FUNCTION datetime_ne(op1, op2) RESULT(ne) !OK-TESTED. @@ -1004,8 +1047,12 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(datetime), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparedatetime(C_LOC(op1), C_LOC(op2)) - ne = ret /= 0_c_int + ret = my_comparedatetime(c_LOC(op1), c_LOC(op2)) + IF (ret /= 0) THEN + ne = .TRUE. + ELSE + ne = .FALSE. + ENDIF END FUNCTION datetime_ne !> !! @brief Get nod (number of Days) in the month of DateTime. @@ -1027,8 +1074,9 @@ CONTAINS TYPE(datetime), TARGET :: dt INTEGER(c_int) :: getNoOfDaysInMonthDateTime INTEGER, OPTIONAL:: errno - getNoOfDaysInMonthDateTime = my_getnoofdaysinmonthdatetime(C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 15, getNoOfDaysInMonthDateTime /= 0) + IF (PRESENT(errno)) errno = 0 + getNoOfDaysInMonthDateTime = my_getnoofdaysinmonthdatetime(c_LOC(dt)) + IF (getNoOfDaysInMonthDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 15 END FUNCTION getNoOfDaysInMonthDateTime !> !! @brief Get number of days in the Year of DateTime. @@ -1049,8 +1097,9 @@ CONTAINS TYPE(datetime), TARGET :: dt INTEGER(c_int) :: getNoOfDaysInYearDateTime INTEGER, OPTIONAL:: errno - getNoOfDaysInYearDateTime = my_getnoofdaysinyeardatetime(C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 16, getNoOfDaysInYearDateTime /= 0) + IF (PRESENT(errno)) errno = 0 + getNoOfDaysInYearDateTime = my_getnoofdaysinyeardatetime(c_LOC(dt)) + IF (getNoOfDaysInYearDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 16 END FUNCTION getNoOfDaysInYearDateTime !> !! @brief Get the 'day-of-year' value of a DateTime. @@ -1072,8 +1121,9 @@ CONTAINS TYPE(datetime), TARGET :: dt INTEGER(c_int) :: getDayOfYearFromDateTime INTEGER, OPTIONAL:: errno - getDayOfYearFromDateTime = my_getdayofyearfromdatetime(C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 17, getDayOfYearFromDateTime /= 0) + IF (PRESENT(errno)) errno = 0 + getDayOfYearFromDateTime = my_getdayofyearfromdatetime(c_LOC(dt)) + IF (getDayOfYearFromDateTime == 0 .AND. PRESENT(errno)) errno = 4 * 100 + 17 END FUNCTION getDayOfYearFromDateTime !> !! @brief Get number of seconds elapsed in the month of DateTime. @@ -1089,8 +1139,9 @@ CONTAINS TYPE(datetime), TARGET :: dt INTEGER(c_int64_t) :: getNoOfSecondsElapsedInMonthDateTime INTEGER, OPTIONAL:: errno - getNoOfSecondsElapsedInMonthDateTime = my_getnoofsecondselapsedinmonthdatetime(C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 18, getNoOfSecondsElapsedInMonthDateTime /= -1) + IF (PRESENT(errno)) errno = 0 + getNoOfSecondsElapsedInMonthDateTime = my_getnoofsecondselapsedinmonthdatetime(c_LOC(dt)) + IF (getNoOfSecondsElapsedInMonthDateTime == -1 .AND. PRESENT(errno)) errno = 4 * 100 + 18 END FUNCTION getNoOfSecondsElapsedInMonthDateTime !> !! @brief Get number of seconds elapsed in the day of DateTime. @@ -1106,8 +1157,9 @@ CONTAINS TYPE(datetime), TARGET :: dt INTEGER(c_int) :: getNoOfSecondsElapsedInDayDateTime INTEGER, OPTIONAL:: errno - getNoOfSecondsElapsedInDayDateTime = my_getnoofsecondselapsedindaydatetime(C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 19, getNoOfSecondsElapsedInDayDateTime /= -1) + IF (PRESENT(errno)) errno = 0 + getNoOfSecondsElapsedInDayDateTime = my_getnoofsecondselapsedindaydatetime(c_LOC(dt)) + IF (getNoOfSecondsElapsedInDayDateTime == -1 .AND. PRESENT(errno)) errno = 4 * 100 + 19 END FUNCTION getNoOfSecondsElapsedInDayDateTime !> !! @brief Get the Julian Day from DateTime. @@ -1127,8 +1179,9 @@ CONTAINS TYPE(julianday), TARGET :: jd TYPE(c_ptr) :: dummy_ptr INTEGER, OPTIONAL:: errno - dummy_ptr = my_getjuliandayfromdatetime(C_LOC(dt), C_LOC(jd)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 20, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_getjuliandayfromdatetime(c_LOC(dt), c_LOC(jd)) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 20 END SUBROUTINE getJulianDayFromDatetime !> !! @brief Get the DateTime from Julian Day. @@ -1148,8 +1201,9 @@ CONTAINS TYPE(datetime), TARGET, INTENT(out) :: dt TYPE(c_ptr) :: dummy_ptr INTEGER, OPTIONAL:: errno - dummy_ptr = my_getdatetimefromjulianday(C_LOC(jd), C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 4 * 100 + 21, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_getdatetimefromjulianday(c_LOC(jd), c_LOC(dt)) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 4 * 100 + 21 END SUBROUTINE getDatetimeFromJulianDay ! END MODULE mtime_datetime @@ -1177,7 +1231,7 @@ MODULE mtime_timedelta ! IMPLICIT NONE ! -! PRIVATE +! private ! PUBLIC :: divisionquotienttimespan PUBLIC :: newTimedelta @@ -1238,27 +1292,27 @@ MODULE mtime_timedelta END INTERFACE OPERATOR (*) ! INTERFACE OPERATOR (>) - MODULE PROCEDURE timedelta_gt + MODULE PROCEDURE timedelta_gt END INTERFACE OPERATOR (>) ! INTERFACE OPERATOR (<) - MODULE PROCEDURE timedelta_lt + MODULE PROCEDURE timedelta_lt END INTERFACE OPERATOR (<) ! INTERFACE OPERATOR (<=) - MODULE PROCEDURE timedelta_lt_or_eq + MODULE PROCEDURE timedelta_lt_or_eq END INTERFACE OPERATOR (<=) ! INTERFACE OPERATOR (>=) - MODULE PROCEDURE timedelta_gt_or_eq + MODULE PROCEDURE timedelta_gt_or_eq END INTERFACE OPERATOR (>=) ! INTERFACE OPERATOR (==) - MODULE PROCEDURE timedelta_eq + MODULE PROCEDURE timedelta_eq END INTERFACE OPERATOR (==) ! INTERFACE OPERATOR (/=) - MODULE PROCEDURE timedelta_ne + MODULE PROCEDURE timedelta_ne END INTERFACE OPERATOR (/=) ! INTERFACE getPTStringFromSeconds @@ -1275,12 +1329,13 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: string TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 + ret_timedelta => NULL() c_pointer = my_newtimedeltafromstring(TRIM(ADJUSTL(string))//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 1, C_ASSOCIATED(c_pointer)) - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_timedelta) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) THEN + errno = 5 * 100 + 1 ELSE - NULLIFY(ret_timedelta) + CALL c_f_POINTER(c_pointer, ret_timedelta) ENDIF END FUNCTION newtimedeltafromstring ! @@ -1292,14 +1347,11 @@ CONTAINS TYPE(c_ptr) :: c_pointer CHARACTER(c_char) ::c_sign INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_sign = SIGN(1:1) c_pointer = my_newrawtimedelta(c_sign, INT(year,c_int64_t), month, day, hour, minute, second, ms) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 2, C_ASSOCIATED(c_pointer)) - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_timedelta) - ELSE - NULLIFY(ret_timedelta) - END IF + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 2 + CALL c_f_POINTER(c_pointer, ret_timedelta) END FUNCTION newtimedeltafromraw ! !! @param[out] errno optional, error message @@ -1311,14 +1363,11 @@ CONTAINS TYPE(c_ptr) :: c_pointer CHARACTER(c_char) ::c_sign INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_sign = SIGN(1:1) c_pointer = my_newrawtimedelta(c_sign, year, month, day, hour, minute, second, ms) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 3, C_ASSOCIATED(c_pointer)) - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_timedelta) - ELSE - NULLIFY(ret_timedelta) - END IF + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 3 + CALL c_f_POINTER(c_pointer, ret_timedelta) END FUNCTION newtimedeltafromraw_yi8 ! !! @param[out] errno optional, error message @@ -1327,13 +1376,10 @@ CONTAINS TYPE(timedelta), TARGET :: src TYPE(c_ptr) :: c_pointer INTEGER, OPTIONAL:: errno - c_pointer = my_constructandcopytimedelta(C_LOC(src)) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 4, C_ASSOCIATED(c_pointer)) - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, dest) - ELSE - NULLIFY(dest) - END IF + IF (PRESENT(errno)) errno = 0 + c_pointer = my_constructandcopytimedelta(c_LOC(src)) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 5 * 100 + 4 + CALL c_f_POINTER(c_pointer, dest) END FUNCTION newtimedeltafromconstructandcopy !> !! @brief Destructor of TimeDelta. @@ -1342,7 +1388,7 @@ CONTAINS !! A pointer to typetimedelta. my_timedelta is deallocated. SUBROUTINE deallocateTimedelta(my_timedelta) !OK-TESTED. TYPE(timedelta), POINTER :: my_timedelta - CALL my_deallocatetimedelta(C_LOC(my_timedelta)) + CALL my_deallocatetimedelta(c_LOC(my_timedelta)) NULLIFY(my_timedelta) END SUBROUTINE deallocateTimedelta ! @@ -1351,8 +1397,12 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - gt = ret == 1_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF (ret == 1) THEN + gt = .TRUE. + ELSE + gt = .FALSE. + ENDIF END FUNCTION timedelta_gt ! FUNCTION timedelta_lt(op1, op2) RESULT(lt) @@ -1360,8 +1410,12 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - lt = ret == -1_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF (ret == -1) THEN + lt = .TRUE. + ELSE + lt = .FALSE. + ENDIF END FUNCTION timedelta_lt ! FUNCTION timedelta_lt_or_eq(op1, op2) RESULT(lt_or_eq) @@ -1369,8 +1423,12 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - lt_or_eq = ret == 0_c_int .OR. ret == -1_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF ((ret == 0) .OR. (ret == -1)) THEN + lt_or_eq = .TRUE. + ELSE + lt_or_eq = .FALSE. + ENDIF END FUNCTION timedelta_lt_or_eq ! FUNCTION timedelta_gt_or_eq(op1, op2) RESULT(gt_or_eq) @@ -1378,8 +1436,12 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - gt_or_eq = ret == 0_c_int .OR. ret == 1_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF ((ret == 0) .OR. (ret == 1)) THEN + gt_or_eq = .TRUE. + ELSE + gt_or_eq = .FALSE. + ENDIF END FUNCTION timedelta_gt_or_eq ! FUNCTION timedelta_eq(op1, op2) RESULT(eq) @@ -1387,8 +1449,12 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - eq = ret == 0_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF (ret == 0) THEN + eq = .TRUE. + ELSE + eq = .FALSE. + ENDIF END FUNCTION timedelta_eq ! FUNCTION timedelta_ne(op1, op2) RESULT(ne) @@ -1396,13 +1462,17 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 INTEGER(c_int) :: ret - ret = my_comparetimedelta(C_LOC(op1), C_LOC(op2)) - ne = ret /= 0_c_int + ret = my_comparetimedelta(c_LOC(op1), c_LOC(op2)) + IF (ret /= 0) THEN + ne = .TRUE. + ELSE + ne = .FALSE. + ENDIF END FUNCTION timedelta_ne !> !! @brief Get the TimeDelta between two Dates op1 and op2 as (op1-op22). !! - !! Routine getTimeDeltaFromDate 'subtracts' two Dates and returns the TimeDelta between + !! Routine getTimeDeltaFromDate 'substracts' two Dates and returns the TimeDelta between !! them. Internally, Dates are converted to DateTimes and then delta is calculated using !! getTimeDeltaFromDateTime(). !! @@ -1419,18 +1489,18 @@ CONTAINS !! A pointer to type date. !! !! @return ret - !! A pointer to TimeDelta containing the result of subtraction. + !! A pointer to TimeDelta containing the result of substraction. FUNCTION getTimeDeltaFromDate(op1,op2) RESULT(ret) !OK-TESTED. TYPE(timedelta), TARGET :: ret TYPE(date), TARGET, INTENT(in) :: op1, op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_gettimedeltafromdate(C_LOC(op1),C_LOC(op2),C_LOC(ret)) + dummy_ptr = my_gettimedeltafromdate(c_LOC(op1),c_LOC(op2),c_LOC(ret)) END FUNCTION getTimeDeltaFromDate !> !! @brief Get the TimeDelta between two DateTimes op1 and op2 as (op1-op2). !! - !! Routine getTimeDeltaFromDateTime 'subtracts' two DateTime's and returns the TimeDelta between - !! them. Each datetime is converted to an equivalent Julian Date. Subtraction is then performed + !! Routine getTimeDeltaFromDateTime 'substracts' two DateTime's and returns the TimeDelta between + !! them. Each datetime is converted to an equivalent Julian Date. Substraction is then performed !! on Julian axis. The "Julian delta" is finally converted back to normal calendar delta. !! !! This routine handles all supported Calendar types; i.e. the translation from Calendar date @@ -1447,12 +1517,12 @@ CONTAINS !! A pointer to type datetime. !! !! @return ret - !! A pointer to TimeDelta containing the result of subtraction. + !! A pointer to TimeDelta containing the result of substraction. FUNCTION getTimeDeltaFromDateTime(op1,op2) RESULT(ret) !OK-TESTED. TYPE(timedelta), TARGET :: ret TYPE(datetime), TARGET, INTENT(in) :: op1, op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_gettimedeltafromdatetime(C_LOC(op1),C_LOC(op2),C_LOC(ret)) + dummy_ptr = my_gettimedeltafromdatetime(c_LOC(op1),c_LOC(op2),c_LOC(ret)) END FUNCTION getTimeDeltaFromDateTime !> !! @brief Get total number of milliseconds in timedelta. @@ -1480,8 +1550,9 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in):: td TYPE(datetime), TARGET, INTENT(in) :: dt INTEGER, OPTIONAL:: errno - getTotalMilliSecondsTimeDelta = my_gettotalmillisecondstimedelta(C_LOC(td), C_LOC(dt)) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 8, getTotalMilliSecondsTimeDelta /= 0) + IF (PRESENT(errno)) errno = 0 + getTotalMilliSecondsTimeDelta = my_gettotalmillisecondstimedelta(c_LOC(td), c_LOC(dt)) + IF ((getTotalMilliSecondsTimeDelta == 0) .AND. PRESENT(errno)) errno = 5 * 100 + 8 END FUNCTION getTotalMilliSecondsTimeDelta !> !! @brief Get total number of seconds in timedelta. @@ -1510,7 +1581,7 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: dt INTEGER, OPTIONAL:: errno IF (PRESENT(errno)) errno = 0 - getTotalSecondsTimeDelta = my_gettotalsecondstimedelta(C_LOC(td), C_LOC(dt)) + getTotalSecondsTimeDelta = my_gettotalsecondstimedelta(c_LOC(td), c_LOC(dt)) ! error handling with "errno" not yet implemented. END FUNCTION getTotalSecondsTimeDelta !> @@ -1531,10 +1602,11 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - string = '' - dummy_ptr = my_timedeltatostring(C_LOC(my_timedelta), string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 10, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 0 + string(:) = '' + dummy_ptr = my_timedeltatostring(c_LOC(my_timedelta), string) + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 10 string ='<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1549,7 +1621,7 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addtimedeltatodatetime(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addtimedeltatodatetime(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addTimedeltaToDatetime ! FUNCTION addDatetimeToTimedelta(op2, op1) RESULT(ret) !OK-TESTED. @@ -1557,7 +1629,7 @@ CONTAINS TYPE(datetime), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addtimedeltatodatetime(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addtimedeltatodatetime(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addDatetimeToTimedelta ! FUNCTION addTimedeltaToDate(op1, op2) RESULT(ret) !OK-TESTED. @@ -1565,7 +1637,7 @@ CONTAINS TYPE(date), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addtimedeltatodate(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addtimedeltatodate(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addTimedeltaToDate ! FUNCTION addDateToTimedelta(op2, op1) RESULT(ret) !OK-TESTED. @@ -1573,7 +1645,7 @@ CONTAINS TYPE(date), TARGET, INTENT(in) :: op1 TYPE(timedelta), TARGET, INTENT(in) :: op2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_addtimedeltatodate(C_LOC(op1), C_LOC(op2), C_LOC(ret)) + dummy_ptr = my_addtimedeltatodate(c_LOC(op1), c_LOC(op2), c_LOC(ret)) END FUNCTION addDateToTimedelta ! FUNCTION elementwiseScalarMultiplyTimeDelta(base_td, ilambda) RESULT(scaled_td) !OK-TESTED. @@ -1583,7 +1655,7 @@ CONTAINS INTEGER(c_int64_t) :: lambda TYPE(c_ptr) :: dummy_ptr lambda = INT(ilambda, c_int64_t) - dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td)) + dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td)) END FUNCTION elementwiseScalarMultiplyTimeDelta ! FUNCTION elementwiseScalarMultiplyTimeDeltaInv(ilambda, base_td) RESULT(scaled_td) !OK-TESTED. @@ -1593,7 +1665,7 @@ CONTAINS INTEGER(c_int64_t) :: lambda TYPE(c_ptr) :: dummy_ptr lambda = INT(ilambda, c_int64_t) - dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td)) + dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td)) END FUNCTION elementwiseScalarMultiplyTimeDeltaInv ! FUNCTION elementwiseScalarMultiplyTimeDelta_long(base_td, lambda) RESULT(scaled_td) !OK-TESTED. @@ -1601,7 +1673,7 @@ CONTAINS INTEGER(c_int64_t), INTENT(in) :: lambda TYPE(timedelta), TARGET, INTENT(in) :: base_td TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td)) + dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td)) END FUNCTION elementwiseScalarMultiplyTimeDelta_long ! FUNCTION elementwiseScalarMultiplyTimeDeltaInv_long(lambda, base_td) RESULT(scaled_td) !OK-TESTED. @@ -1609,7 +1681,7 @@ CONTAINS INTEGER(c_int64_t), INTENT(in) :: lambda TYPE(timedelta), TARGET, INTENT(in) :: base_td TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_elementwisescalarmultiplytimedelta(C_LOC(base_td), lambda, C_LOC(scaled_td)) + dummy_ptr = my_elementwisescalarmultiplytimedelta(c_LOC(base_td), lambda, c_LOC(scaled_td)) END FUNCTION elementwiseScalarMultiplyTimeDeltaInv_long ! FUNCTION elementwisescalarmultiplytimedelta_real(base_td, lambda) RESULT(scaled_td) !OK-TESTED. @@ -1617,14 +1689,14 @@ CONTAINS REAL(c_double), INTENT(in) :: lambda TYPE(timedelta), TARGET, INTENT(in) :: base_td TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_elementwisescalarmultiplytimedeltadp(C_LOC(base_td), lambda, C_LOC(scaled_td)) + dummy_ptr = my_elementwisescalarmultiplytimedeltadp(c_LOC(base_td), lambda, c_LOC(scaled_td)) END FUNCTION elementwisescalarmultiplytimedelta_real ! FUNCTION elementwiseAddTimeDeltatoTimeDelta(td1, td2) RESULT(added_td) !OK-TESTED. TYPE(timedelta), TARGET :: added_td TYPE(timedelta), TARGET, INTENT(in) :: td1, td2 TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_elementwiseaddtimedeltatotimedelta(C_LOC(td1), C_LOC(td2), C_LOC(added_td)) + dummy_ptr = my_elementwiseaddtimedeltatotimedelta(c_LOC(td1), c_LOC(td2), c_LOC(added_td)) END FUNCTION elementwiseAddTimeDeltatoTimeDelta !> !! @brief Returns modulo(a,p) and the quotient. @@ -1645,7 +1717,7 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: p INTEGER(c_int64_t), TARGET, INTENT(out) :: quot INTEGER(c_int64_t) :: rem - rem = my_modulotimedelta(C_LOC(a), C_LOC(p), C_LOC(quot)) + rem = my_modulotimedelta(c_LOC(a), c_LOC(p), c_LOC(quot)) END FUNCTION moduloTimedelta !> !! @brief Return a PT String corresponding to arbitrary number of milliseconds. @@ -1665,10 +1737,11 @@ CONTAINS TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 string(:) = '' dummy_ptr = my_getptstringfromms(ms, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1685,9 +1758,10 @@ CONTAINS INTEGER :: i INTEGER, OPTIONAL:: errno string(:) = '' + IF (PRESENT(errno)) errno = 0 dummy_ptr = my_getptstringfromsecondsint(s, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1704,9 +1778,10 @@ CONTAINS INTEGER :: i INTEGER, OPTIONAL:: errno string(:) = '' + IF (PRESENT(errno)) errno = 0 dummy_ptr = my_getptstringfromsecondsfloat(s, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1723,9 +1798,10 @@ CONTAINS INTEGER :: i INTEGER, OPTIONAL:: errno string(:) = '' + IF (PRESENT(errno)) errno = 0 dummy_ptr = my_getptstringfromsecondsdouble(s, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1753,9 +1829,10 @@ CONTAINS INTEGER :: i INTEGER, OPTIONAL:: errno string(:) = '' + IF (PRESENT(errno)) errno = 0 dummy_ptr = my_getptstringfromminutes(m, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1783,9 +1860,10 @@ CONTAINS INTEGER :: i INTEGER, OPTIONAL:: errno string(:) = '' + IF (PRESENT(errno)) errno = 0 dummy_ptr = my_getptstringfromhours(h, string) - IF (PRESENT(errno)) errno = MERGE(0, 5 * 100 + 11, C_ASSOCIATED(dummy_ptr)) - IF (.NOT. C_ASSOCIATED(dummy_ptr)) THEN + IF (.NOT. c_ASSOCIATED(dummy_ptr)) THEN + IF (PRESENT(errno)) errno = 5 * 100 + 11 string = '<null>' ELSE char_loop: DO i = 1 , LEN(string) @@ -1803,7 +1881,7 @@ CONTAINS TYPE(timedelta), TARGET, INTENT(in) :: td TYPE(datetime), TARGET, INTENT(in) :: dt TYPE(juliandelta), TARGET, INTENT(out) :: jd - dummy_ptr = my_timedeltatojuliandelta(C_LOC(td),C_LOC(dt),C_LOC(jd)) + dummy_ptr = my_timedeltatojuliandelta(c_LOC(td),c_LOC(dt),c_LOC(jd)) END SUBROUTINE timeDeltaToJulianDelta !> @@ -1825,8 +1903,8 @@ CONTAINS INTEGER, INTENT(out), OPTIONAL :: errna TYPE(c_ptr) :: dummy_ptr IF (PRESENT(errna)) errna = 0 ! FIXME: no_error - dummy_ptr = my_dividetimedeltainseconds(C_LOC(dividend), C_LOC(divisor), C_LOC(quotient)) - IF (PRESENT(errna) .AND. .NOT. C_ASSOCIATED(dummy_ptr)) THEN + dummy_ptr = my_dividetimedeltainseconds(c_LOC(dividend), c_LOC(divisor), c_LOC(quotient)) + IF (PRESENT(errna) .AND. .NOT. c_ASSOCIATED(dummy_ptr)) THEN errna = errna + 2 ! increment error number by 2, see below for an explanation. ENDIF END SUBROUTINE divideTimeDeltaInSeconds @@ -1850,9 +1928,9 @@ CONTAINS INTEGER(c_int64_t), TARGET, INTENT(out) :: denominator TYPE(divisionquotienttimespan), TARGET, INTENT(out) :: quotient TYPE(c_ptr) :: dummy_ptr - dummy_ptr = my_dividetwodatetimediffsinseconds(C_LOC(dt1_dividend), C_LOC(dt2_dividend), & - & C_LOC(dt1_divisor), C_LOC(dt2_divisor), & - & C_LOC(denominator), C_LOC(quotient)) + dummy_ptr = my_dividetwodatetimediffsinseconds(c_LOC(dt1_dividend), c_LOC(dt2_dividend), & + & c_LOC(dt1_divisor), c_LOC(dt2_divisor), & + & c_LOC(denominator), c_LOC(quotient)) END SUBROUTINE divideTwoDatetimeDiffsInSeconds !> @@ -1880,8 +1958,8 @@ CONTAINS INTEGER, INTENT(out), OPTIONAL :: errna TYPE(c_ptr) :: dummy_ptr IF (PRESENT(errna)) errna = 0 ! FIXME: no_error - dummy_ptr = my_dividedatetimedifferenceinseconds(C_LOC(dt1), C_LOC(dt2), C_LOC(divisor), C_LOC(quotient)) - IF (PRESENT(errna) .AND. .NOT. C_ASSOCIATED(dummy_ptr)) THEN + dummy_ptr = my_dividedatetimedifferenceinseconds(c_LOC(dt1), c_LOC(dt2), c_LOC(divisor), c_LOC(quotient)) + IF (PRESENT(errna) .AND. .NOT. c_ASSOCIATED(dummy_ptr)) THEN errna = errna + 2 ! increment error number by 2, see below for an explanation. ENDIF END SUBROUTINE divideDatetimeDifferenceInSeconds @@ -1949,46 +2027,51 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: firstDate CHARACTER(len=*), INTENT(in) :: lastDate CHARACTER(len=*), INTENT(in) :: interval - CHARACTER(len=*), TARGET, INTENT(in), OPTIONAL :: offset - CHARACTER(len=5), SAVE, TARGET :: zeroOffset = "PT00S" !Optional offset's proxy string. + CHARACTER(len=*), INTENT(in), OPTIONAL :: offset + CHARACTER(len=32) :: zeroOffset = "PT00S" !Optional offset's proxy string. TYPE(c_ptr) :: c_pointer - CHARACTER(len=:), POINTER :: offset_arg INTEGER, OPTIONAL:: errno - IF(PRESENT(offset)) THEN - offset_arg => offset(VERIFY(offset, " "):len_TRIM(offset)) - ELSE - offset_arg => zeroOffset - END IF - c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char, & + IF (PRESENT(errno)) errno = 0 + IF(PRESENT(offset)) THEN !offset is not null. + c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char, & & TRIM(ADJUSTL(referenceDate))//c_null_char, & & TRIM(ADJUSTL(firstDate))//c_null_char, & & TRIM(ADJUSTL(lastDate))//c_null_char, & & TRIM(ADJUSTL(interval))//c_null_char, & - & offset_arg//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_event) + & TRIM(ADJUSTL(offset))//c_null_char) + ELSE !offset is null. Pass a 0 offset. + c_pointer = my_newevent(TRIM(ADJUSTL(name))//c_null_char, & + & TRIM(ADJUSTL(referenceDate))//c_null_char, & + & TRIM(ADJUSTL(firstDate))//c_null_char, & + & TRIM(ADJUSTL(lastDate))//c_null_char, & + & TRIM(ADJUSTL(interval))//c_null_char, & + & TRIM(ADJUSTL(zeroOffset))//c_null_char) + END IF + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_event) END FUNCTION newEventWithString ! !! @param[out] errno optional, error message FUNCTION newEventWithDataTypes(name, referenceDate, firstdate, lastDate, interval, offset, errno) RESULT(ret_event) !OK-TESTED. TYPE(event), POINTER :: ret_event CHARACTER(len=*), INTENT(in) :: name - TYPE(datetime), TARGET, INTENT(in) :: referenceDate - TYPE(datetime), TARGET, INTENT(in) :: firstDate - TYPE(datetime), TARGET, INTENT(in) :: lastDate - TYPE(timedelta), TARGET, INTENT(in) :: interval - TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: offset - TYPE(c_ptr) :: c_pointer, offset_c - INTEGER, OPTIONAL, INTENT(out) :: errno + TYPE(datetime), POINTER :: referenceDate + TYPE(datetime), POINTER :: firstDate + TYPE(datetime), POINTER :: lastDate + TYPE(timedelta), POINTER :: interval + TYPE(timedelta), POINTER, OPTIONAL :: offset + TYPE(c_ptr) :: c_pointer + INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 IF (PRESENT(offset)) THEN - offset_c = C_LOC(offset) + c_pointer = my_neweventwithdatatypes(TRIM(ADJUSTL(name))//c_null_char, & + & c_LOC(referenceDate), c_LOC(firstDate), c_LOC(lastDate), c_LOC(interval), c_LOC(offset)) ELSE - offset_c = c_null_ptr - END IF c_pointer = my_neweventwithdatatypes(TRIM(ADJUSTL(name))//c_null_char, & - & C_LOC(referenceDate), C_LOC(firstDate), C_LOC(lastDate), C_LOC(interval), offset_c) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_event) + & c_LOC(referenceDate), c_LOC(firstDate), c_LOC(lastDate), c_LOC(interval), c_null_ptr) + END IF + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_event) END FUNCTION newEventWithDataTypes !> !! @brief Destructor of Event. @@ -2000,37 +2083,39 @@ CONTAINS !! use removeEventFromEventGroup instead. SUBROUTINE deallocateEvent(my_event) TYPE(event), POINTER :: my_event - CALL my_deallocateevent(C_LOC(my_event)) + CALL my_deallocateevent(c_LOC(my_event)) my_event => NULL() END SUBROUTINE deallocateEvent !> FUNCTION constructAndCopyEvent(my_event, errno) RESULT(ret_event) !OK-TESTED. TYPE(event), POINTER :: ret_event - TYPE(event), TARGET, INTENT(in) :: my_event - INTEGER, OPTIONAL, INTENT(out) :: errno + TYPE(event), TARGET :: my_event + INTEGER, OPTIONAL:: errno TYPE(c_ptr) :: c_pointer - c_pointer = my_constructandcopyevent(C_LOC(my_event)) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_event) + IF (PRESENT(errno)) errno = 0 + c_pointer = my_constructandcopyevent(c_LOC(my_event)) + IF ((.NOT. C_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 6 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_event) END FUNCTION constructAndCopyEvent !> !! @brief Get Event as a string. !! !! @param[in] my_event - !! A variable of type event. The event to be converted to string. + !! A pointer to type event. The event to be converted to string. !! !! @param[out] string !! String where event is to be written. !! !! @param[out] errno optional, error message SUBROUTINE eventToString(my_event, string, errno) !TODO:C code still incomplete. - TYPE(event), TARGET, INTENT(in) :: my_event - CHARACTER(len=max_eventname_str_len), INTENT(out) :: string + TYPE(event), POINTER :: my_event + CHARACTER(len=max_eventname_str_len) :: string TYPE(c_ptr) :: dummy_ptr INTEGER :: i - INTEGER, OPTIONAL, INTENT(out) :: errno - dummy_ptr = my_eventtostring(C_LOC(my_event), string) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 3, C_ASSOCIATED(dummy_ptr)) + INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_eventtostring(c_LOC(my_event), string) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 3 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -2050,40 +2135,44 @@ CONTAINS !! application at fixed intervals. !! !! @param my_event - !! A variable of type event. This is the event being tested. + !! A pointer to type event. This is the event being tested. !! !! @param my_datetime - !! A variable of type datetime. This is the 'current' datetime of the system. + !! A pointer to type datetime. This is the 'current' datetime of the system. !! !! @param plus_slack - !! A variable of type timedelta. Events are triggered between [actual_trigger_time, actual_trigger_time + plus_slack]. + !! A pointer to type timedelta. Events are triggered between [actual_trigger_time, actual_trigger_time + plus_slack]. !! Sign MUST be '+' !! !! @param minus_slack - !! A variable of type timedelta. Events are triggered between [actual_trigger_time - minus_slack, actual_trigger_time]. + !! A pointer to type timedelta. Events are triggered between [actual_trigger_time - minus_slack, actual_trigger_time]. !! Sign MUST be '+' !! !! @return ret !! true/false indicating if the event is active. FUNCTION isCurrentEventActive(my_event, my_datetime, plus_slack, minus_slack) RESULT(ret) - TYPE(event), TARGET, INTENT(in) :: my_event - TYPE(datetime), TARGET, INTENT(in) :: my_datetime - TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: plus_slack - TYPE(timedelta), TARGET, OPTIONAL, INTENT(in) :: minus_slack - TYPE(c_ptr) :: plus_slack_c, minus_slack_c + TYPE(event), POINTER :: my_event + TYPE(datetime), TARGET :: my_datetime + TYPE(timedelta), POINTER, OPTIONAL :: plus_slack + TYPE(timedelta), POINTER, OPTIONAL :: minus_slack LOGICAL(c_bool) :: ret - IF (PRESENT(plus_slack)) THEN - plus_slack_c = C_LOC(plus_slack) - ELSE - plus_slack_c = c_null_ptr - END IF - IF (PRESENT(minus_slack)) THEN - minus_slack_c = C_LOC(minus_slack) + IF (PRESENT(plus_slack) .AND. PRESENT(minus_slack)) THEN + ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), & + & c_LOC(plus_slack), c_LOC(minus_slack)) + + ELSE IF (PRESENT(plus_slack) .AND. .NOT.PRESENT(minus_slack)) THEN + ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), & + & c_LOC(plus_slack), c_null_ptr) + + ELSE IF (.NOT.PRESENT(plus_slack) .AND. PRESENT(minus_slack)) THEN + ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), & + & c_null_ptr, c_LOC(minus_slack)) + ELSE - minus_slack_c = c_null_ptr + ret = my_isCurrentEventActive(c_LOC(my_event), c_LOC(my_datetime), & + & c_null_ptr, c_null_ptr) + END IF - ret = my_isCurrentEventActive(C_LOC(my_event), C_LOC(my_datetime), & - & plus_slack_c, minus_slack_c) END FUNCTION isCurrentEventActive !> !! @brief Checks, if next event is on a new day @@ -2094,35 +2183,35 @@ CONTAINS !! @returns ret !! Logical: true if next event is on new day FUNCTION isEventNextInNextDay(my_event) RESULT(ret) - TYPE(event), TARGET, INTENT(in) :: my_event + TYPE(event), POINTER :: my_event LOGICAL(c_bool) :: ret - ret = my_iseventnextinnextday(C_LOC(my_event)) + ret = my_iseventnextinnextday(c_LOC(my_event)) END FUNCTION isEventNextInNextDay !> !! @brief Checks, if next event is in a new month !! !! @param[in] my_event - !! A variable of type event + !! A pointer to a type event !! !! @returns ret !! Logical: true if next event is in a new month FUNCTION iseventNextInNextMonth(my_event) RESULT(ret) - TYPE(event), TARGET, INTENT(in) :: my_event + TYPE(event), POINTER :: my_event LOGICAL(c_bool) :: ret - ret = my_iseventnextinnextmonth(C_LOC(my_event)) + ret = my_iseventnextinnextmonth(c_LOC(my_event)) END FUNCTION iseventNextInNextMonth !> !! @brief Checks, if next event is in a new year !! !! @param[in] my_event - !! A variable of type event + !! A pointer to a type event !! !! @returns ret !! Logical: true if next event is in a new year FUNCTION iseventNextInNextYear(my_event) RESULT(ret) - TYPE(event), TARGET, INTENT(in) :: my_event + TYPE(event), POINTER :: my_event LOGICAL(c_bool) :: ret - ret = my_iseventnextinnextyear(C_LOC(my_event)) + ret = my_iseventnextinnextyear(c_LOC(my_event)) END FUNCTION iseventNextInNextYear !> !! @brief Get the Datetime when 'this' event will be triggered next. @@ -2132,23 +2221,24 @@ CONTAINS !! data structure. !! !! @param[in] my_event - !! A variable of type event. This is the event being queried. + !! A pointer to type event. This is the event being queried. !! !! @param[in] my_currentdatetime - !! A variable of type datetime. The next trigger datetime is copied here. + !! A pointer to type datetime. The next trigger datetime is copied here. !! !! @param[out] my_datetime - !! A variable of type datetime with next-trigger datetime. + !! A pointer to type datetime with next-trigger datetime. !! !! @param[out] errno optional, error message SUBROUTINE getTriggerNextEventAtDateTime(my_event,my_currentdatetime,my_datetime, errno) TYPE(event), TARGET, INTENT(in) :: my_event TYPE(datetime), TARGET, INTENT(in) :: my_currentdatetime - TYPE(datetime), TARGET, INTENT(out) :: my_datetime + TYPE(datetime), TARGET :: my_datetime TYPE(c_ptr) :: dummy_ptr - INTEGER, OPTIONAL, INTENT(out) :: errno - dummy_ptr = my_gettriggernexteventatdatetime(C_LOC(my_event),C_LOC(my_currentdatetime),C_LOC(my_datetime)) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 8, C_ASSOCIATED(dummy_ptr)) + INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_gettriggernexteventatdatetime(c_LOC(my_event),c_LOC(my_currentdatetime),c_LOC(my_datetime)) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 8 END SUBROUTINE getTriggerNextEventAtDateTime !> !! @brief Get the Datetime when 'this' event will be triggered last. @@ -2160,16 +2250,17 @@ CONTAINS !! A pointer to type event. This is the event being queried. !! !! @param[out] my_datetime - !! A variable of type datetime with last-trigger datetime. + !! A pointer to type datetime with last-trigger datetime. !! !! @param[out] errno optional, error message SUBROUTINE getTriggeredPreviousEventAtDateTime(my_event,my_datetime,errno) TYPE(event), TARGET, INTENT(in) :: my_event - TYPE(datetime), TARGET, INTENT(out) :: my_datetime + TYPE(datetime), TARGET :: my_datetime TYPE(c_ptr) :: dummy_ptr INTEGER, OPTIONAL:: errno - dummy_ptr = my_gettriggeredpreviouseventatdatetime(C_LOC(my_event),C_LOC(my_datetime)) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 9, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_gettriggeredpreviouseventatdatetime(c_LOC(my_event),c_LOC(my_datetime)) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 9 END SUBROUTINE getTriggeredPreviousEventAtDateTime !> !! @brief get the event id @@ -2195,13 +2286,14 @@ CONTAINS !! !! @param[out] errno optional, error message SUBROUTINE getEventName(my_event, string, errno) !OK-TESTED. - TYPE(event), TARGET, INTENT(in) :: my_event - CHARACTER(len=max_eventname_str_len), INTENT(out) :: string + TYPE(event), POINTER :: my_event + CHARACTER(len=max_eventname_str_len) :: string TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL :: errno - dummy_ptr = my_geteventname(C_LOC(my_event), string) - IF (PRESENT(errno)) errno = MERGE(0, 6 * 100 + 11, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_geteventname(c_LOC(my_event), string) + IF ((.NOT.c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 6 * 100 + 11 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -2211,18 +2303,18 @@ CONTAINS !! @brief get the event reference date !! !! @param[in] my_event - !! A variable of type event. + !! A pointer of type event. !! !! @returns ret_referenceDateTime !! A pointer of type datetime. The event's reference date. !! FUNCTION getEventReferenceDateTime(my_event) RESULT(ret_referenceDateTime) !OK-TESTED. TYPE(datetime), POINTER :: ret_referenceDateTime - TYPE(event), INTENT(in) :: my_event + TYPE(event), POINTER :: my_event TYPE(c_ptr) :: c_pointer c_pointer = my_event%eventReferenceDatetime - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_referenceDateTime) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_referenceDateTime) ELSE ret_referenceDateTime => NULL() ENDIF @@ -2231,18 +2323,18 @@ CONTAINS !! @brief get the event first date !! !! @param[in] my_event - !! A variable of type event. + !! A pointer of type event. !! !! @returns ret_eventFirstDateTime !! A pointer of type datetime. The event's first date. !! FUNCTION getEventFirstDateTime(my_event) RESULT(ret_eventFirstDateTime) !OK-TESTED. TYPE(datetime), POINTER :: ret_eventFirstDateTime - TYPE(event), INTENT(in) :: my_event + TYPE(event), POINTER :: my_event TYPE(c_ptr) :: c_pointer c_pointer = my_event%eventFirstDateTime - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_eventFirstDateTime) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_eventFirstDateTime) ELSE ret_eventFirstDateTime => NULL() ENDIF @@ -2251,18 +2343,18 @@ CONTAINS !! @brief get the event last date !! !! @param[in] my_event - !! A variable of type event. + !! A pointer of type event. !! !! @returns ret_eventLastDateTime !! A pointer of type datetime. The event's last date. !! FUNCTION getEventLastDateTime(my_event) RESULT(ret_eventLastDateTime) !OK-TESTED. TYPE(datetime), POINTER :: ret_eventLastDateTime - TYPE(event), INTENT(in) :: my_event + TYPE(event), POINTER :: my_event TYPE(c_ptr) :: c_pointer c_pointer = my_event%eventLastDateTime - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_eventLastDateTime) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_eventLastDateTime) ELSE ret_eventLastDateTime => NULL() ENDIF @@ -2271,18 +2363,18 @@ CONTAINS !! @brief get the event interval !! !! @param[in] my_event - !! A variable of type event. + !! A pointer of type event. !! !! @returns ret_eventInterval !! A pointer of type timedelta. The event's last date. !! FUNCTION getEventInterval(my_event) RESULT(ret_eventInterval) !OK-TESTED. TYPE(timedelta), POINTER :: ret_eventInterval - TYPE(event), INTENT(in) :: my_event + TYPE(event), POINTER :: my_event TYPE(c_ptr) :: c_pointer c_pointer = my_event%eventInterval - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_eventInterval) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_eventInterval) ELSE ret_eventInterval => NULL() ENDIF @@ -2291,7 +2383,7 @@ CONTAINS !! @brief Check if event is first !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is first @@ -2299,13 +2391,13 @@ CONTAINS FUNCTION getNextEventIsFirst(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_getnexteventisfirst(C_LOC(my_event)) + ret = my_getnexteventisfirst(c_LOC(my_event)) END FUNCTION getNextEventIsFirst !> !! @brief Check if event is first in day !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is first in day @@ -2313,13 +2405,13 @@ CONTAINS FUNCTION getEventisFirstInDay(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventisfirstinday(C_LOC(my_event)) + ret = my_geteventisfirstinday(c_LOC(my_event)) END FUNCTION getEventisFirstInDay !> !! @brief Check if event is first in month !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is first in month @@ -2327,13 +2419,13 @@ CONTAINS FUNCTION getEventisFirstInMonth(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventisfirstinmonth(C_LOC(my_event)) + ret = my_geteventisfirstinmonth(c_LOC(my_event)) END FUNCTION getEventisFirstInMonth !> !! @brief Check if event is first in year !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is first in year @@ -2341,13 +2433,13 @@ CONTAINS FUNCTION getEventisFirstInYear(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventisfirstinyear(C_LOC(my_event)) + ret = my_geteventisfirstinyear(c_LOC(my_event)) END FUNCTION getEventisFirstInYear !> !! @brief Check if event is last in day !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is last in day @@ -2356,13 +2448,13 @@ CONTAINS FUNCTION getEventisLastInDay(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventislastinday(C_LOC(my_event)) + ret = my_geteventislastinday(c_LOC(my_event)) END FUNCTION getEventisLastInDay !> !! @brief Check if event is last in month !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is last in month @@ -2370,13 +2462,13 @@ CONTAINS FUNCTION getEventisLastInMonth(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventislastinmonth(C_LOC(my_event)) + ret = my_geteventislastinmonth(c_LOC(my_event)) END FUNCTION getEventisLastInMonth !> !! @brief Check if event is last in year !! !! @param[in] my_event - !! A reference of type event. + !! A pointer of type event. !! !! @returns ret !! Logical: true if event is last in year @@ -2384,7 +2476,7 @@ CONTAINS FUNCTION getEventisLastInYear(my_event) RESULT(ret) TYPE(event), TARGET, INTENT(in) :: my_event LOGICAL(c_bool) :: ret - ret = my_geteventislastinyear(C_LOC(my_event)) + ret = my_geteventislastinyear(c_LOC(my_event)) END FUNCTION getEventisLastInYear ! END MODULE mtime_events @@ -2439,10 +2531,11 @@ CONTAINS TYPE(eventgroup), POINTER :: ret_eventgroup CHARACTER(len=*), INTENT(in) :: name TYPE(c_ptr) :: c_pointer - INTEGER, OPTIONAL, INTENT(out):: errno + INTEGER, OPTIONAL:: errno + IF (PRESENT(errno)) errno = 0 c_pointer = my_neweventgroup(TRIM(ADJUSTL(name))//c_null_char) - IF (PRESENT(errno)) errno = MERGE(0, 7 * 100 + 1, C_ASSOCIATED(c_pointer)) - CALL C_F_POINTER(c_pointer, ret_eventgroup) + IF ((.NOT. c_ASSOCIATED(c_pointer)) .AND. PRESENT(errno)) errno = 7 * 100 + 1 + CALL c_f_POINTER(c_pointer, ret_eventgroup) END FUNCTION newEventGroup !> !! @brief Destructor of EventGroup. @@ -2452,25 +2545,25 @@ CONTAINS !! SUBROUTINE deallocateEventGroup(my_eventgroup) !OK-TESTED. TYPE(eventgroup), POINTER :: my_eventgroup - CALL my_deallocateeventgroup(C_LOC(my_eventgroup)) + CALL my_deallocateeventgroup(c_LOC(my_eventgroup)) my_eventgroup => NULL() END SUBROUTINE deallocateEventGroup !> !! @brief Add new event to an eventgroup. !! !! @param my_event - !! A reference to type event. The event to be added. + !! A pointer to type event. The event to be added. !! !! @param my_eventgroup - !! A reference to type eventgroup. The eventgroup where the event is added. + !! A pointer to type eventgroup. The eventgroup where the event is added. !! !! @return ret !! true/false indicating success or failure of addition. FUNCTION addEventToEventGroup(my_event, my_eventgroup) RESULT(ret) !OK-TESTED. LOGICAL :: ret - TYPE(event), TARGET, INTENT(in) :: my_event - TYPE(eventgroup), TARGET, INTENT(inout) :: my_eventgroup - ret = my_addeventtoeventgroup(C_LOC(my_event), C_LOC(my_eventgroup)) + TYPE(event), POINTER :: my_event + TYPE(eventgroup), POINTER :: my_eventgroup + ret = my_addeventtoeventgroup(c_LOC(my_event), c_LOC(my_eventgroup)) END FUNCTION addEventToEventGroup !> !! @brief Remove event from eventgroup. CRITICAL: Also, deallocate the event. @@ -2479,46 +2572,47 @@ CONTAINS !! The name of event to be removed. !! !! @param my_eventgroup - !! A reference to type eventgroup. The eventgroup to which this event belongs. + !! A pointer to type eventgroup. The eventgroup to which this event belongs. !! !! @return ret !! true/false indicating success or failure of removal. FUNCTION removeEventfromEventGroup(my_name, my_eventgroup) RESULT(ret) !OK-TESTED. LOGICAL :: ret CHARACTER(len=*), INTENT(in) :: my_name - TYPE(eventgroup), TARGET, INTENT(inout) :: my_eventgroup - ret = my_removeeventfromeventgroup(TRIM(ADJUSTL(my_name))//c_null_char, C_LOC(my_eventgroup)) + TYPE(eventgroup), POINTER :: my_eventgroup + ret = my_removeeventfromeventgroup(TRIM(ADJUSTL(my_name))//c_null_char, c_LOC(my_eventgroup)) END FUNCTION removeEventFromEventGroup !> !! @brief Get event group id !! !! @param[in] my_eventgroup - !! A reference to type eventgroup. + !! A pointer to type eventgroup. !! !! @return ret_grpid !! The event group id FUNCTION getEventGroupId(my_eventgroup) RESULT(ret_grpid) !OK-TESTED. INTEGER(c_int64_t) :: ret_grpid - TYPE(eventgroup), INTENT(in) :: my_eventgroup + TYPE(eventgroup), POINTER :: my_eventgroup ret_grpid = my_eventgroup%eventGroupId END FUNCTION getEventGroupId !> !! @brief get the event group name !! !! @param[in] my_eventgroup - !! A reference of type event. + !! A pointer of type event. !! !! @param[out] string the name of the event group !! !! @param[out] errno optional, error message SUBROUTINE getEventGroupName(my_eventgroup, string, errno) !TESTED-OK. - TYPE(eventgroup), TARGET, INTENT(in) :: my_eventgroup + TYPE(eventgroup), POINTER :: my_eventgroup CHARACTER(len=max_groupname_str_len) :: string TYPE(c_ptr) :: dummy_ptr INTEGER :: i INTEGER, OPTIONAL:: errno - dummy_ptr = my_geteventgroupname(C_LOC(my_eventgroup), string) - IF (PRESENT(errno)) errno = MERGE(0, 7 * 100 + 6, C_ASSOCIATED(dummy_ptr)) + IF (PRESENT(errno)) errno = 0 + dummy_ptr = my_geteventgroupname(c_LOC(my_eventgroup), string) + IF ((.NOT. c_ASSOCIATED(dummy_ptr)) .AND. PRESENT(errno)) errno = 7 * 100 + 6 char_loop: DO i = 1 , LEN(string) IF (string(i:i) == c_null_char) EXIT char_loop END DO char_loop @@ -2534,11 +2628,11 @@ CONTAINS !! A pointer of type event. The first event in eventgroup FUNCTION getFirstEventFromEventGroup(my_eventgroup) RESULT(ret_event) !OK-TESTED. TYPE(event), POINTER :: ret_event - TYPE(eventgroup), INTENT(in) :: my_eventgroup + TYPE(eventgroup), POINTER :: my_eventgroup TYPE(c_ptr) :: c_pointer c_pointer = my_eventgroup%firstEventInGroup - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_event) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_event) ELSE ret_event => NULL() ENDIF @@ -2553,11 +2647,11 @@ CONTAINS !! A pointer of type event. The next event in eventgroup FUNCTION getNextEventFromEventGroup(my_event) RESULT(ret_event) !OK-TESTED. TYPE(event), POINTER :: ret_event - TYPE(event), INTENT(in) :: my_event + TYPE(event), POINTER :: my_event TYPE(c_ptr) :: c_pointer c_pointer = my_event%nextEventInGroup - IF (C_ASSOCIATED(c_pointer)) THEN - CALL C_F_POINTER(c_pointer, ret_event) + IF (c_ASSOCIATED(c_pointer)) THEN + CALL c_f_POINTER(c_pointer, ret_event) ELSE ret_event => NULL() ENDIF @@ -2635,7 +2729,7 @@ CONTAINS CHARACTER(len=*), INTENT(in) :: recurringTimeInterval CHARACTER(len=*), INTENT(out) :: repetitor CHARACTER(len=*), INTENT(out) :: start - CHARACTER(len=*), INTENT(out) :: end + CHARACTER(len=*), INTENT(out) :: END CHARACTER(len=*), INTENT(out) :: duration LOGICAL, INTENT(out) :: lrepetitor @@ -2645,34 +2739,39 @@ CONTAINS INTEGER :: i + lrepetitor = .FALSE. + lstart = .FALSE. + lend = .FALSE. + lduration = .FALSE. + CALL my_splitRepetitionString(TRIM(ADJUSTL(recurringTimeInterval))//c_null_char, repetitor, start, END, duration) - lrepetitor = repetitor(1:1) /= c_null_char + IF (repetitor(1:1) /= c_null_char) lrepetitor = .TRUE. char_loop1: DO i = 1 , LEN(repetitor) IF (repetitor(i:i) == c_null_char) EXIT char_loop1 END DO char_loop1 repetitor(i:LEN(repetitor)) = ' ' - lstart = start(1:1) /= c_null_char + IF (start(1:1) /= c_null_char) lstart = .TRUE. char_loop2: DO i = 1 , LEN(start) IF (start(i:i) == c_null_char) EXIT char_loop2 END DO char_loop2 start(i:LEN(start)) = ' ' - lend = end(1:1) /= c_null_char - char_loop3: DO i = 1 , LEN(end) - IF (end(i:i) == c_null_char) EXIT char_loop3 + IF (END(1:1) /= c_null_char) lend = .TRUE. + char_loop3: DO i = 1 , LEN(END) + IF (END(i:i) == c_null_char) EXIT char_loop3 END DO char_loop3 - end(i:LEN(end)) = ' ' + END(i:LEN(END)) = ' ' - lduration = duration(1:1) /= c_null_char + IF (duration(1:1) /= c_null_char) lduration = .TRUE. char_loop4: DO i = 1 , LEN(duration) IF (duration(i:i) == c_null_char) EXIT char_loop4 END DO char_loop4 duration(i:LEN(duration)) = ' ' END SUBROUTINE splitRepetitionString -! + ! END MODULE mtime_utilities !> !! @} diff --git a/src/mtime_c_bindings.f90 b/src/mtime_c_bindings.f90 index 09b413cb..a943119a 100644 --- a/src/mtime_c_bindings.f90 +++ b/src/mtime_c_bindings.f90 @@ -175,12 +175,12 @@ module mtime_c_bindings type(c_ptr), value :: my_julianday, my_juliandelta, ret_julianday end function my_addjuliandeltatojulianday ! - function my_subtractjulianday(my_julianday1, my_julianday2, ret_juliandelta) result(juliandelta_ptr) & - & bind(c, name='subtractJulianDay') + function my_substractjulianday(my_julianday1, my_julianday2, ret_juliandelta) result(juliandelta_ptr) & + & bind(c, name='substractJulianDay') import :: c_ptr type(c_ptr) :: juliandelta_ptr type(c_ptr), value :: my_julianday1, my_julianday2, ret_juliandelta - end function my_subtractjulianday + end function my_substractjulianday ! end interface ! @@ -808,6 +808,7 @@ contains integer, intent(IN) :: lineno character(LEN=*), intent(IN) :: routine_str + character(len=max_mtime_error_str_len) :: error_str if (lcond) call handle_errno_base(errno, routine_str, lineno) end subroutine handle_errno_cond diff --git a/src/mtime_date.c b/src/mtime_date.c index 34d228c0..c813076a 100644 --- a/src/mtime_date.c +++ b/src/mtime_date.c @@ -115,13 +115,21 @@ newDate(const char* ds) struct _date* newRawDate(int64_t _year, int _month, int _day) { - char ds[MAX_DATE_STR_LEN]; - memset(ds, 0, sizeof(ds)); + char* ds = (char*) calloc(MAX_DATE_STR_LEN, sizeof(char)); + if (ds == NULL ) + { + return NULL ; + } snprintf(ds, MAX_DATE_STR_LEN, "%" PRIi64 "-%02d-%02d", _year, _month, _day); /* Resuse string interface and create object. */ struct _date* d = newDate(ds); + + /* Cleanup. */ + free(ds); + ds = NULL; + return d; } diff --git a/src/mtime_datetime.c b/src/mtime_datetime.c index 414b2203..94d2dec4 100644 --- a/src/mtime_datetime.c +++ b/src/mtime_datetime.c @@ -73,27 +73,42 @@ struct _datetime* newDateTime(const char* dts) { - struct _datetime *dt = NULL; if ((dts != NULL) && (getCalendarType())) { /* Intialize a dummy ISO8601 object. */ - struct iso8601_datetime isoDt = { .sign_of_year = '+' }; + struct iso8601_datetime* isoDt = new_iso8601_datetime('+', 0, 0, 0, 0, 0, 0, 0); + if (isoDt == NULL) + return NULL ; /* Check ISO8601 compliance. */ - if (verify_string_datetime(dts, &isoDt) == DATETIME_MATCH - && (dt = (struct _datetime*)calloc(1,sizeof(struct _datetime))) - != NULL ) + if (verify_string_datetime(dts, isoDt) != DATETIME_MATCH) { - dt->date.year = isoDt.year; - dt->date.month = isoDt.month; - dt->date.day = isoDt.day; - dt->time.hour = isoDt.hour; - dt->time.minute = isoDt.minute; - dt->time.second = isoDt.second; - dt->time.ms = isoDt.ms; + deallocate_iso8601_datetime(isoDt); + return NULL ; } + + struct _datetime *dt = (struct _datetime*)calloc(1,sizeof(struct _datetime)); + if (dt == NULL ) + { + deallocate_iso8601_datetime(isoDt); + return NULL ; + } + + dt->date.year = isoDt->year; + dt->date.month = isoDt->month; + dt->date.day = isoDt->day; + dt->time.hour = isoDt->hour; + dt->time.minute = isoDt->minute; + dt->time.second = isoDt->second; + dt->time.ms = isoDt->ms; + + //Cleanup. + deallocate_iso8601_datetime(isoDt); + + return dt; } - return dt; + else + return NULL ; } @@ -122,8 +137,11 @@ newDateTime(const char* dts) struct _datetime* newRawDateTime(int64_t _year, int _month, int _day, int _hour, int _minute, int _second, int _ms) { - char dts[MAX_DATETIME_STR_LEN]; - memset(dts, 0, sizeof(dts)); + char* dts = (char*)calloc(MAX_DATETIME_STR_LEN, sizeof(char)); + if (dts == NULL ) + { + return NULL ; + } snprintf(dts, MAX_DATETIME_STR_LEN, "%" PRIi64 "-%02d-%02dT%02d:%02d:%02d.%03d", _year, _month, _day, _hour, _minute, _second, _ms); @@ -131,6 +149,9 @@ newRawDateTime(int64_t _year, int _month, int _day, int _hour, int _minute, int /* Resuse string interface and create object. */ struct _datetime* dt = newDateTime(dts); + free(dts); + dts = NULL; + return dt; } diff --git a/src/mtime_eventHandling.c b/src/mtime_eventHandling.c index a0815f3b..fab1e42f 100644 --- a/src/mtime_eventHandling.c +++ b/src/mtime_eventHandling.c @@ -259,10 +259,10 @@ newEvent(const char* _en, e->eventsLastEvaluationDateTime = NULL; /* Start Date. */ - // Default start date = "0-01-01T00:00:00.000". - e->eventFirstDateTime - = newDateTime(_eventFirstDT ? _eventFirstDT : initDummyDTString); - + if (_eventFirstDT) + e->eventFirstDateTime = newDateTime(_eventFirstDT); + else + e->eventFirstDateTime = newDateTime(initDummyDTString); // Default start date = "0-01-01T00:00:00.000". if (e->eventFirstDateTime == NULL ) goto cleanup_and_exit; @@ -361,27 +361,31 @@ newEvent(const char* _en, return e; cleanup_and_exit: - if (e->eventName) - { - free(e->eventName); - e->eventName = NULL; - } - deallocateDateTime(e->eventReferenceDateTime); - e->eventReferenceDateTime = NULL; - deallocateDateTime(e->eventFirstDateTime); - e->eventFirstDateTime = NULL; - deallocateDateTime(e->eventLastDateTime); - e->eventLastDateTime = NULL; - deallocateTimeDelta(e->eventInterval); - e->eventInterval = NULL; - deallocateTimeDelta(e->eventOffset); - e->eventOffset = NULL; - deallocateDateTime(e->triggeredPreviousEventDateTime); - e->triggeredPreviousEventDateTime = NULL; - deallocateDateTime(e->triggerNextEventDateTime); - e->triggerNextEventDateTime = NULL; - free(e); - return NULL ; + if (e) + { + if (e->eventName) + { + free(e->eventName); + e->eventName = NULL; + } + deallocateDateTime(e->eventReferenceDateTime); + e->eventReferenceDateTime = NULL; + deallocateDateTime(e->eventFirstDateTime); + e->eventFirstDateTime = NULL; + deallocateDateTime(e->eventLastDateTime); + e->eventLastDateTime = NULL; + deallocateTimeDelta(e->eventInterval); + e->eventInterval = NULL; + deallocateTimeDelta(e->eventOffset); + e->eventOffset = NULL; + deallocateDateTime(e->triggeredPreviousEventDateTime); + e->triggeredPreviousEventDateTime = NULL; + deallocateDateTime(e->triggerNextEventDateTime); + e->triggerNextEventDateTime = NULL; + free(e); + e = NULL; + } + return NULL ; } else return NULL; @@ -662,35 +666,35 @@ isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNext int cmp_val_flag = -128; /* Make a local copy of slack to avoid updating the user supplied timedeltas. */ - struct _timedelta minus_slack_local; + struct _timedelta* plus_slack_local = NULL; + struct _timedelta* minus_slack_local = NULL; + + if (plus_slack) + plus_slack_local = constructAndCopyTimeDelta(plus_slack); + else + plus_slack_local = newTimeDelta(initDummyTDString); //Translates to 0. if (minus_slack) - replaceTimeDelta(minus_slack, &minus_slack_local); + minus_slack_local = constructAndCopyTimeDelta(minus_slack); + else + minus_slack_local = newTimeDelta(initDummyTDString); //Translates to 0. - /* If plus_slack is defined, return the status of current_dt vis-a-vis trigger time +/- allowed delta. */ - if((!plus_slack || plus_slack->sign == '+') - && (!minus_slack || minus_slack->sign == '+')) + /* If plus_slack_local is defined, return the status of current_dt vis-a-vis trigger time +/- allowed delta. */ + if((plus_slack_local->sign == '+') && ((minus_slack_local->sign == '+'))) { int upper_val_flag = -128; int lower_val_flag = -128; - struct _datetime dt_upperbound, dt_lowerbound, *pub, *plb; - if (plus_slack) - pub = addTimeDeltaToDateTime(triggerNextEventDateTime,plus_slack,&dt_upperbound); - else - pub = triggerNextEventDateTime; - upper_val_flag = compareDatetime(current_dt,pub); + struct _datetime *dt_upperbound = newDateTime(initDummyDTString); + struct _datetime *dt_lowerbound = newDateTime(initDummyDTString); - if (minus_slack) - { - minus_slack_local.sign = '-'; /* Change sign to obtain subtraction. */ - plb = addTimeDeltaToDateTime(triggerNextEventDateTime,&minus_slack_local,&dt_lowerbound); - } - else - plb = triggerNextEventDateTime; - lower_val_flag = compareDatetime(current_dt,plb); + minus_slack_local->sign = '-'; /* Change sign to obtain substraction. */ + + + upper_val_flag = compareDatetime(current_dt,addTimeDeltaToDateTime(triggerNextEventDateTime,plus_slack_local,dt_upperbound)); + lower_val_flag = compareDatetime(current_dt,addTimeDeltaToDateTime(triggerNextEventDateTime,minus_slack_local,dt_lowerbound)); if ( (upper_val_flag == less_than || upper_val_flag == equal_to) @@ -709,12 +713,18 @@ isTriggerTimeInRange(struct _datetime* current_dt, struct _datetime* triggerNext cmp_val_flag = less_than; } + //Cleaup. + deallocateDateTime(dt_upperbound); + deallocateDateTime(dt_lowerbound); } else /* If slack is malformed (negative sign is not permitted), return as normal (follow exact match for equal). */ { cmp_val_flag = compareDatetime(current_dt,triggerNextEventDateTime); } + deallocateTimeDelta(plus_slack_local); + deallocateTimeDelta(minus_slack_local); + return cmp_val_flag; } @@ -795,9 +805,11 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct if (isTriggerTimeInRange(current_dt, event->triggerNextEventDateTime, plus_slack, NULL) == greater_than) { /* Get the first trigger time and update. */ - struct _timedelta modulo_td; - moduloTimeDeltaFromDateTime(event->triggerNextEventDateTime, event->eventInterval, current_dt, &modulo_td); - addTimeDeltaToDateTime(current_dt,&modulo_td,event->triggerNextEventDateTime); + struct _timedelta* modulo_td = newTimeDelta(initDummyTDString); + moduloTimeDeltaFromDateTime(event->triggerNextEventDateTime, event->eventInterval, current_dt, modulo_td); + addTimeDeltaToDateTime(current_dt,modulo_td,event->triggerNextEventDateTime); + /* Cleanup. */ + deallocateTimeDelta(modulo_td); } /* Check if trigger time is now. Trigger allowed with a slack provided [start-end] condition is met. */ @@ -824,7 +836,7 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct replaceDatetime(current_dt, event->triggeredPreviousEventDateTime); int cmp_val_flag = -128; - struct _datetime tmp_dt; + struct _datetime* tmp_dt = newDateTime(initDummyDTString); /* Set the new next-trigger datetime. If eventLastDateTime is defined, then update should not happen if current_dt + eventInterval > eventLastDateTime */ @@ -832,7 +844,7 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct !( event->eventLastDateTime && ( - ( cmp_val_flag = isTriggerTimeInRange ( addTimeDeltaToDateTime(current_dt, event->eventInterval,&tmp_dt), + ( cmp_val_flag = isTriggerTimeInRange ( addTimeDeltaToDateTime(current_dt, event->eventInterval,tmp_dt), event->eventLastDateTime, NULL, minus_slack @@ -847,6 +859,8 @@ isCurrentEventActive(struct _event* event, struct _datetime* current_dt, struct else event->lastEventWasFinal = true; + deallocateDateTime(tmp_dt); // Cleanup. + /* Set event.*/ event->triggerCurrentEvent = true; @@ -914,11 +928,26 @@ iseventNextInNextDay(struct _event* e) { if( e != NULL ) { - struct _date d_next, d_prev; - convertDateTimeToDate(e->triggerNextEventDateTime,&d_next); - convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev); + bool ret = false; + + struct _date* d_next = newDate(initDummyDString); + struct _date* d_prev = newDate(initDummyDString); + d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next); + d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev); - return compareDate(&d_next,&d_prev) == greater_than; + if(compareDate(d_next,d_prev) == greater_than) + { + ret = true; + } + else + { + ret = false; + } + + deallocateDate(d_next); + deallocateDate(d_prev); + + return ret; } else return false; @@ -931,14 +960,29 @@ iseventNextInNextMonth(struct _event* e) { if( e != NULL ) { - struct _date d_next, d_prev; - convertDateTimeToDate(e->triggerNextEventDateTime,&d_next); - convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev); + bool ret = false; + + struct _date* d_next = newDate(initDummyDString); + struct _date* d_prev = newDate(initDummyDString); + d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next); + d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev); + + d_next->day = 1; + d_prev->day = 1; + + if(compareDate(d_next,d_prev) == greater_than) + { + ret = true; + } + else + { + ret = false; + } - d_next.day = 1; - d_prev.day = 1; + deallocateDate(d_next); + deallocateDate(d_prev); - return compareDate(&d_next,&d_prev) == greater_than; + return ret; } else return false; @@ -950,18 +994,33 @@ iseventNextInNextYear(struct _event* e) { if( e != NULL ) { - struct _date d_next, d_prev; - convertDateTimeToDate(e->triggerNextEventDateTime,&d_next); - convertDateTimeToDate(e->triggeredPreviousEventDateTime,&d_prev); + bool ret = false; - d_next.day = 1; - d_next.month = 1; + struct _date* d_next = newDate(initDummyDString); + struct _date* d_prev = newDate(initDummyDString); + d_next = convertDateTimeToDate(e->triggerNextEventDateTime,d_next); + d_prev = convertDateTimeToDate(e->triggeredPreviousEventDateTime,d_prev); - d_prev.day = 1; - d_prev.month = 1; + d_next->day = 1; + d_next->month = 1; + d_prev->day = 1; + d_prev->month = 1; - return compareDate(&d_next,&d_prev) == greater_than; + + if(compareDate(d_next,d_prev) == greater_than) + { + ret = true; + } + else + { + ret = false; + } + + deallocateDate(d_next); + deallocateDate(d_prev); + + return ret; } else return false; @@ -1013,32 +1072,35 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time if ((start_dt != NULL) && (timestep != NULL) && (ref_dt != NULL) && (first_trigger_dt != NULL) ) //offset can be NULL. { - /* Get anchor. ref + offset is the real anchor. */ - struct _datetime anchor; - memcpy(&anchor, ref_dt, sizeof (anchor)); - addTimeDeltaToDateTime(ref_dt, offset, &anchor); // Note: If offset is null, no addition takes place. - if (timestep->year != 0 && timestep->month == 0 && timestep->day == 0 && timestep->hour == 0 && timestep->minute == 0 && timestep->second == 0 && timestep->ms == 0) { /* NOTE: years only is a trivial case. */ + /* Get anchor. ref + offset is the real anchor. */ + struct _datetime *anchor = constructAndCopyDateTime(ref_dt); + addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place. - if (compareDatetime(&anchor, start_dt) == greater_than) + if (compareDatetime(anchor, start_dt) == greater_than) { - replaceDatetime(&anchor, first_trigger_dt); + replaceDatetime(anchor, first_trigger_dt); } else { /* Determine difference between anchor and start year */ - int64_t differenceOfYears = start_dt->date.year - anchor.date.year; // result always >= 0. + int64_t differenceOfYears = start_dt->date.year - anchor->date.year; // result always >= 0. int64_t yearsToAdd = differenceOfYears % timestep->year; /* We only need to update the year */ - replaceDatetime(&anchor, first_trigger_dt); + replaceDatetime(anchor, first_trigger_dt); first_trigger_dt->date.year += yearsToAdd; } + /* Cleanup. */ + deallocateDateTime(anchor); + + /* And return. */ + return first_trigger_dt; } else if (timestep->year == 0 && timestep->month != 0 && timestep->day == 0 @@ -1046,25 +1108,33 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time { /* NOTE: months only is again a trivial case. */ + /* Get anchor. ref + offset is the real anchor. */ + struct _datetime *anchor = constructAndCopyDateTime(ref_dt); + addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place. - if (compareDatetime(&anchor, start_dt) == greater_than) + if (compareDatetime(anchor, start_dt) == greater_than) { - replaceDatetime(&anchor, first_trigger_dt); + replaceDatetime(anchor, first_trigger_dt); } else { /* Determine difference between anchor and start in months */ - int differenceOfMonths = 12*(start_dt->date.year - anchor.date.year) + start_dt->date.month - anchor.date.month; + int differenceOfMonths = 12*(start_dt->date.year - anchor->date.year) + start_dt->date.month - anchor->date.month; int yearsToAdd = differenceOfMonths / 12; int monthsToAdd = differenceOfMonths % timestep->month; /* We only need to update the year and month */ - replaceDatetime(&anchor, first_trigger_dt); + replaceDatetime(anchor, first_trigger_dt); first_trigger_dt->date.year += yearsToAdd; first_trigger_dt->date.month += monthsToAdd; } + /* Cleanup. */ + deallocateDateTime(anchor); + + /* And return. */ + return first_trigger_dt; } else if (timestep->year == 0 && timestep->month == 0) @@ -1075,56 +1145,73 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time will be too slow and hence the ends justify the means. */ + struct _timedelta* timestep_bkw; + /* Get start date in julian. */ - struct _julianday start_jd; - date2julian(start_dt, &start_jd); + struct _julianday* start_jd = newJulianDay(0, 0); + start_jd = date2julian(start_dt, start_jd); /* Get timedelta in juliandelta. */ - struct _juliandelta timestep_jd; - timeDeltaToJulianDelta(timestep, ref_dt, ×tep_jd); + struct _juliandelta* timestep_jd = newJulianDelta('+', 0, 0); + timestep_jd = timeDeltaToJulianDelta(timestep, ref_dt, timestep_jd); - /* Get anchor in julian. */ - struct _julianday anchor_jd; - date2julian(&anchor, &anchor_jd); /* For speed-up */ + struct _juliandelta* timestep_fastfwd_jd = newJulianDelta('+', 0, 0); + struct _juliandelta* timestep_fastbkw_jd = newJulianDelta('+', 0, 0); + + + /* Get anchor. ref + offset is the real anchor. */ + struct _datetime* anchor = constructAndCopyDateTime(ref_dt); + addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place. + + /* Get anchor in julian. */ + struct _julianday* anchor_jd = newJulianDay(0, 0); + anchor_jd = date2julian(anchor, anchor_jd); + /* Optimization hack: Calculate an approx metric are_dates_too_far and speed up the jumps. */ int64_t are_dates_too_far = 0; - if (timestep_jd.day) - are_dates_too_far = (start_jd.day - anchor_jd.day)/(timestep_jd.day); - else if (timestep_jd.ms) - are_dates_too_far = (start_jd.day - anchor_jd.day)/((float)timestep_jd.ms/NO_OF_MS_IN_A_DAY); + if (timestep_jd->day) + are_dates_too_far = (start_jd->day - anchor_jd->day)/(timestep_jd->day); + else if (timestep_jd->ms) + are_dates_too_far = (start_jd->day - anchor_jd->day)/((float)timestep_jd->ms/NO_OF_MS_IN_A_DAY); //else ... well, should never happen. If it does, the initialized value of zero persists. int lambda = 1; //speed-up const. Default is 1 or no speedup. - if (are_dates_too_far > 10 || are_dates_too_far < -10) + if (are_dates_too_far>10 || are_dates_too_far<-10) lambda = 100000; //speed up if start-date and anchor are 'too-far' away. /* Fast-Fwd */ - lldiv_t norm_fwd = lldiv(lambda*timestep_jd.ms, NO_OF_MS_IN_A_DAY); - struct _juliandelta timestep_fastfwd_jd; - timestep_fastfwd_jd.sign = '+'; - timestep_fastfwd_jd.day = lambda*timestep_jd.day + norm_fwd.quot; - timestep_fastfwd_jd.ms = norm_fwd.rem; + timestep_fastfwd_jd->day = lambda*timestep_jd->day; + timestep_fastfwd_jd->ms = lambda*timestep_jd->ms; + + while( timestep_fastfwd_jd->ms >= NO_OF_MS_IN_A_DAY ) + { + timestep_fastfwd_jd->day++; + timestep_fastfwd_jd->ms = timestep_fastfwd_jd->ms - NO_OF_MS_IN_A_DAY; + } /* We need to Loop backwards: Create a timestep replica and change the sign to negative to travel-back-in-time. */ - struct _timedelta timestep_bkw; - memcpy(×tep_bkw, timestep, sizeof (timestep_bkw)); - timestep_bkw.sign = '-'; + timestep_bkw = constructAndCopyTimeDelta(timestep); + timestep_bkw->sign = '-'; - struct _juliandelta timestep_bkw_jd; - timeDeltaToJulianDelta(×tep_bkw, ref_dt, ×tep_bkw_jd); + struct _juliandelta* timestep_bkw_jd = newJulianDelta('+', 0, 0); + timeDeltaToJulianDelta(timestep_bkw, ref_dt, timestep_bkw_jd); /* Fast-Bkwd */ - lldiv_t norm_bkw = lldiv(lambda*timestep_bkw_jd.ms, NO_OF_MS_IN_A_DAY); - struct _juliandelta timestep_fastbkw_jd; - timestep_fastbkw_jd.sign = '+'; - timestep_fastbkw_jd.day = lambda*timestep_bkw_jd.day + norm_bkw.quot; - timestep_fastbkw_jd.ms = norm_bkw.rem; + timestep_fastbkw_jd->day = lambda*timestep_bkw_jd->day; + timestep_fastbkw_jd->ms = lambda*timestep_bkw_jd->ms; + + while( timestep_fastbkw_jd->ms <= (-1)*(NO_OF_MS_IN_A_DAY) ) + { + timestep_fastbkw_jd->day--; + timestep_fastbkw_jd->ms = timestep_fastbkw_jd->ms + NO_OF_MS_IN_A_DAY; + } + switch (compareDatetime(start_dt,ref_dt)) { @@ -1136,45 +1223,45 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time /* Jump very fast and reach the start date quickly. */ do { - anchor_jd.day = anchor_jd.day + timestep_fastfwd_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_fastfwd_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_fastfwd_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_fastfwd_jd->ms; - if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY) + if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY) { - anchor_jd.day = anchor_jd.day + 1; - anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day + 1; + anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY; } - } while ( !((anchor_jd.day > start_jd.day) || (anchor_jd.day == start_jd.day && anchor_jd.ms > start_jd.ms)) ); + } while ( !((anchor_jd->day > start_jd->day) || (anchor_jd->day == start_jd->day && anchor_jd->ms > start_jd->ms)) ); /* But I jumped one time too much. Move back */ - anchor_jd.day = anchor_jd.day - timestep_fastfwd_jd.day; - anchor_jd.ms = anchor_jd.ms - timestep_fastfwd_jd.ms; + anchor_jd->day = anchor_jd->day - timestep_fastfwd_jd->day; + anchor_jd->ms = anchor_jd->ms - timestep_fastfwd_jd->ms; - if (anchor_jd.ms < 0) + if (anchor_jd->ms < 0) { - anchor_jd.day = anchor_jd.day - 1; - anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day - 1; + anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY; } } /* I am close. Now determine the actual time. */ do { - anchor_jd.day = anchor_jd.day + timestep_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_jd->ms; - if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY) + if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY) { - anchor_jd.day = anchor_jd.day + 1; - anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day + 1; + anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY; } - } while ( !((anchor_jd.day > start_jd.day) || (anchor_jd.day == start_jd.day && anchor_jd.ms >= start_jd.ms)) ); + } while ( !((anchor_jd->day > start_jd->day) || (anchor_jd->day == start_jd->day && anchor_jd->ms >= start_jd->ms)) ); /* anchor_jd is now the true event-trigger-time. Set it to anchor. */ - julian2date(&anchor_jd,&anchor); + julian2date(anchor_jd,anchor); break; @@ -1188,78 +1275,103 @@ getEventFirstTriggerDateTime(struct _datetime* start_dt, struct _timedelta* time /* Jump very fast bkwd and reach the start date quickly. */ do { - anchor_jd.day = anchor_jd.day + timestep_fastbkw_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_fastbkw_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_fastbkw_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_fastbkw_jd->ms; - if ( anchor_jd.ms < 0 ) + if ( anchor_jd->ms < 0 ) { - anchor_jd.day = anchor_jd.day - 1; - anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day - 1; + anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY; } - } while(! (anchor_jd.day < start_jd.day || (anchor_jd.day == start_jd.day && anchor_jd.ms < start_jd.ms)) ); + } while(! (anchor_jd->day < start_jd->day || (anchor_jd->day == start_jd->day && anchor_jd->ms < start_jd->ms)) ); /* I jumped one time too much. Move forward. */ - anchor_jd.day = anchor_jd.day + timestep_fastfwd_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_fastfwd_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_fastfwd_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_fastfwd_jd->ms; - if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY) + if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY) { - anchor_jd.day = anchor_jd.day + 1; - anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day + 1; + anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY; } /* I am close. Get the real time. */ do { - anchor_jd.day = anchor_jd.day + timestep_bkw_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_bkw_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_bkw_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_bkw_jd->ms; - if ( anchor_jd.ms < 0 ) + if ( anchor_jd->ms < 0 ) { - anchor_jd.day = anchor_jd.day - 1; - anchor_jd.ms = anchor_jd.ms + NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day - 1; + anchor_jd->ms = anchor_jd->ms + NO_OF_MS_IN_A_DAY; } - } while(! (anchor_jd.day < start_jd.day || (anchor_jd.day == start_jd.day && anchor_jd.ms < start_jd.ms)) ); + } while(! (anchor_jd->day < start_jd->day || (anchor_jd->day == start_jd->day && anchor_jd->ms < start_jd->ms)) ); /* I jumped one time too much. Move forward. */ - anchor_jd.day = anchor_jd.day + timestep_jd.day; - anchor_jd.ms = anchor_jd.ms + timestep_jd.ms; + anchor_jd->day = anchor_jd->day + timestep_jd->day; + anchor_jd->ms = anchor_jd->ms + timestep_jd->ms; - if (anchor_jd.ms >= NO_OF_MS_IN_A_DAY) + if (anchor_jd->ms >= NO_OF_MS_IN_A_DAY) { - anchor_jd.day = anchor_jd.day + 1; - anchor_jd.ms = anchor_jd.ms - NO_OF_MS_IN_A_DAY; + anchor_jd->day = anchor_jd->day + 1; + anchor_jd->ms = anchor_jd->ms - NO_OF_MS_IN_A_DAY; } /* anchor_jd now has the true trigger time. Copy it to anchor. */ - julian2date(&anchor_jd,&anchor); + julian2date(anchor_jd,anchor); default: - return NULL; + ; //Should never happen. Don't return NULL just yet as deallocateDateTime(anchor) still needs to be called. } /* Copy the contents to target. */ - replaceDatetime(&anchor,first_trigger_dt); + replaceDatetime(anchor,first_trigger_dt); + + + /* Cleanup. */ + + deallocateDateTime(anchor); + deallocateJulianDay(start_jd); + deallocateJulianDay(anchor_jd); + deallocateJulianDelta(timestep_jd); + deallocateTimeDelta(timestep_bkw); + deallocateJulianDelta(timestep_bkw_jd); + + deallocateJulianDelta(timestep_fastfwd_jd); + deallocateJulianDelta(timestep_fastbkw_jd); + + /* And return. */ + return first_trigger_dt; } else { /* NOTE: general case updates by explicit adding. */ - while (compareDatetime(&anchor, start_dt) == less_than) + + /* Get anchor. ref + offset is the real anchor. */ + struct _datetime *anchor = constructAndCopyDateTime(ref_dt); + addTimeDeltaToDateTime(ref_dt, offset, anchor); // Note: If offset is null, no addition takes place. + + while (compareDatetime(anchor, start_dt) == less_than) { - addTimeDeltaToDateTime(&anchor, timestep, &anchor); + addTimeDeltaToDateTime(anchor, timestep, anchor); } /* Copy the contents to target. */ - replaceDatetime(&anchor,first_trigger_dt); + replaceDatetime(anchor,first_trigger_dt); + + /* Cleanup. */ + deallocateDateTime(anchor); + + /* And return. */ + return first_trigger_dt; } - /* And return. */ - return first_trigger_dt; } else return NULL; @@ -1299,13 +1411,16 @@ getTriggerNextEventAtDateTime(struct _event* e, struct _datetime* current_dt, st (compareDatetime(current_dt,e->triggerNextEventDateTime) == greater_than) ) { - struct _timedelta modulo_td; + struct _timedelta* modulo_td = newTimeDelta("PT00.000S"); // Get the first trigger time and return (WARNING: Do not update e->triggerNextEventDateTime here!). - moduloTimeDeltaFromDateTime(e->triggerNextEventDateTime, e->eventInterval, current_dt, &modulo_td); - addTimeDeltaToDateTime(current_dt,&modulo_td,dt_return); + moduloTimeDeltaFromDateTime(e->triggerNextEventDateTime, e->eventInterval, current_dt, modulo_td); + addTimeDeltaToDateTime(current_dt,modulo_td,dt_return); + // Cleanup. + deallocateTimeDelta(modulo_td); + return dt_return; } - else - dt_return = replaceDatetime(e->triggerNextEventDateTime, dt_return); + // else ... + dt_return = replaceDatetime(e->triggerNextEventDateTime, dt_return); return dt_return; } else diff --git a/src/mtime_iso8601.c b/src/mtime_iso8601.c index 7c4acf0a..bc995bfb 100644 --- a/src/mtime_iso8601.c +++ b/src/mtime_iso8601.c @@ -773,10 +773,14 @@ get_date_time(const char* buffer, struct iso8601_datetime* datetimeObj, struct i ISO8601_STATUS verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_isoDtObj) { - struct iso8601_duration dummy_isoDObj = { .sign = '+' }; + ISO8601_STATUS stat = FAILURE; + struct iso8601_duration* dummy_isoDObj = new_iso8601_duration('+',0,0,0,0,0,0,0); + if (dummy_isoDObj == NULL) + return FAILURE; + + stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj); - ISO8601_STATUS stat - = get_date_time(test_string, dummy_isoDtObj, &dummy_isoDObj); + deallocate_iso8601_duration(dummy_isoDObj); return stat; } @@ -785,10 +789,14 @@ verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_is ISO8601_STATUS verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isoDObj) { - struct iso8601_datetime dummy_isoDtObj = { .sign_of_year='+' }; + ISO8601_STATUS stat = FAILURE; + struct iso8601_datetime* dummy_isoDtObj = new_iso8601_datetime('+',0,0,0,0,0,0,0); + if ( dummy_isoDtObj == NULL) + return FAILURE; + + stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj); - ISO8601_STATUS stat - = get_date_time(test_string, &dummy_isoDtObj, dummy_isoDObj); + deallocate_iso8601_datetime(dummy_isoDtObj); return stat; } diff --git a/src/mtime_iso8601.rl b/src/mtime_iso8601.rl index 029451f2..19b648ec 100644 --- a/src/mtime_iso8601.rl +++ b/src/mtime_iso8601.rl @@ -642,10 +642,14 @@ get_date_time(const char* buffer, struct iso8601_datetime* datetimeObj, struct i ISO8601_STATUS verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_isoDtObj) { - struct iso8601_duration dummy_isoDObj = { .sign = '+' }; + ISO8601_STATUS stat = FAILURE; + struct iso8601_duration* dummy_isoDObj = new_iso8601_duration('+',0,0,0,0,0,0,0); + if (dummy_isoDObj == NULL) + return FAILURE; + + stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj); - ISO8601_STATUS stat - = get_date_time(test_string, dummy_isoDtObj, &dummy_isoDObj); + deallocate_iso8601_duration(dummy_isoDObj); return stat; } @@ -654,10 +658,14 @@ verify_string_datetime(const char* test_string,struct iso8601_datetime* dummy_is ISO8601_STATUS verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isoDObj) { - struct iso8601_datetime dummy_isoDtObj = { .sign_of_year='+' }; + ISO8601_STATUS stat = FAILURE; + struct iso8601_datetime* dummy_isoDtObj = new_iso8601_datetime('+',0,0,0,0,0,0,0); + if ( dummy_isoDtObj == NULL) + return FAILURE; + + stat = get_date_time(test_string, dummy_isoDtObj, dummy_isoDObj); - ISO8601_STATUS stat - = get_date_time(test_string, &dummy_isoDtObj, dummy_isoDObj); + deallocate_iso8601_datetime(dummy_isoDtObj); return stat; } diff --git a/src/mtime_julianDay.c b/src/mtime_julianDay.c index 4183fbf6..b3ab41ad 100644 --- a/src/mtime_julianDay.c +++ b/src/mtime_julianDay.c @@ -182,7 +182,11 @@ replaceJulianday(struct _julianday* jdsrc, struct _julianday* jddest) struct _juliandelta* newJulianDelta(char _sign, int64_t _day, int64_t _ms) { - if ((_sign == '+' || _sign == '-') && getCalendarType()) + if (_sign != '+' && _sign != '-') + { + return NULL; + } + if (getCalendarType()) { struct _juliandelta* jd = (struct _juliandelta *)calloc(1,sizeof(struct _juliandelta)); if (jd == NULL ) @@ -253,13 +257,13 @@ return NULL; struct _julianday* -subtractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd) +substractJulianDeltaFromJulianDay(struct _julianday* jd1, struct _juliandelta* jd2, struct _julianday* jd) { if ((jd1 != NULL )&& (jd2 != NULL) && (jd != NULL) ){ - /* subtractJulianDelta 'looks like' addJulianDelta but it is not. - Usually, when subtractJulianDelta is called, jd2 will have every element with a negative sign. - This will ensure subtraction in the proper sense. */ + /* substractJulianDelta 'looks like' addJulianDelta but it is not. + Usually, when substractJulianDelta is called, jd2 will have every element with a negative sign. + This will ensure substraction in the proper sense. */ jd->day = jd1->day + jd2->day; jd->ms = jd1->ms + jd2->ms; @@ -313,7 +317,7 @@ compareJulianDay(struct _julianday* jd1, struct _julianday* jd2) /*Internal function.*/ /* Return jd1 >= jd2 */ -static bool +bool internal_compareJulianDay(struct _julianday* jd1, struct _julianday* jd2) { if (jd1->day > jd2->day) @@ -342,11 +346,11 @@ internal_compareJulianDay(struct _julianday* jd1, struct _julianday* jd2) * A pointer to struct _juliandelta. Copy the result of (jd1 - jd2) in jd. * * @return jd - * A pointer to Juliandelta containing the result of subtraction. + * A pointer to Juliandelta containing the result of substraction. */ struct _juliandelta* -subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd) +substractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _juliandelta* jd) { if ((jd1 != NULL )&& (jd2 != NULL) && (jd != NULL) ){ @@ -369,7 +373,7 @@ subtractJulianDay(struct _julianday* jd1, struct _julianday* jd2, struct _julian /* JD2 > JD1 */ /*Recursive call with jd1 and jd2 switched and then negate the values.*/ - jd = subtractJulianDay(jd2,jd1,jd); + jd = substractJulianDay(jd2,jd1,jd); jd->sign = '-'; jd->day = (-1)*jd->day; diff --git a/src/mtime_t_datetime.inc b/src/mtime_t_datetime.inc index 8326a9a8..f7af889f 100644 --- a/src/mtime_t_datetime.inc +++ b/src/mtime_t_datetime.inc @@ -13,6 +13,7 @@ CHARACTER(len=*), INTENT(in) :: dt_string TYPE(c_ptr) :: c_pointer TYPE(datetime), POINTER :: dt_tmp + INTEGER :: errno c_pointer = my_newdatetime(TRIM(ADJUSTL(dt_string))//c_null_char) CALL handle_errno(.NOT. c_ASSOCIATED(c_pointer), 4 *100 + 1, & & __FILE__, & diff --git a/src/mtime_t_event.inc b/src/mtime_t_event.inc index c7b26ede..eb78b606 100644 --- a/src/mtime_t_event.inc +++ b/src/mtime_t_event.inc @@ -154,7 +154,7 @@ END SUBROUTINE t_eventGroup_addToGroup FUNCTION t_eventGroup_getGroupId(this) RESULT(group_id) - INTEGER(c_int64_t) :: group_id + INTEGER :: group_id CLASS(t_eventGroup) ::this group_id = this%event_group_id END FUNCTION t_eventGroup_getGroupId diff --git a/src/mtime_t_timedelta.inc b/src/mtime_t_timedelta.inc index 0012a9c2..318c3171 100644 --- a/src/mtime_t_timedelta.inc +++ b/src/mtime_t_timedelta.inc @@ -174,7 +174,7 @@ INTEGER(c_int32_t), INTENT(in) :: lambda CLASS(t_timedelta), TARGET, INTENT(in) :: this TYPE(timedelta), POINTER :: td_tmp - TYPE(c_ptr) :: dummy_ptr + TYPE(c_ptr) :: c_pointer, dummy_ptr, c_ptr_result dummy_ptr = my_elementwisescalarmultiplytimedelta(c_loc(this%td), int(lambda, c_int64_t), c_loc(scaled_td%td)) IF (.NOT. c_associated(dummy_ptr)) THEN diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c index ab2cef18..2df803d9 100644 --- a/src/mtime_timedelta.c +++ b/src/mtime_timedelta.c @@ -67,20 +67,24 @@ newTimeDelta(const char* tds) /* Create TimeDelta object. */ struct _timedelta* td = (struct _timedelta *)calloc(1,sizeof(struct _timedelta)); - if (td != NULL) + if (td == NULL ) { - td->flag_std_form = duration_type_flag == 2; - /* IMPORTANT: Negative/Positive time delta is indicated using td->sign (-/+). year,month,day..etc are always positive integers or 0. */ - td->sign = isoDuration->sign; - td->year = isoDuration->year; - td->month = isoDuration->month; - td->day = isoDuration->day; - td->hour = isoDuration->hour; - td->minute = isoDuration->minute; - td->second = isoDuration->second; - td->ms = isoDuration->ms; + deallocate_iso8601_duration(isoDuration); + isoDuration = NULL; + return NULL ; } + duration_type_flag == 2?(td->flag_std_form = 1):(td->flag_std_form = 0); + /* IMPORTANT: Negative/Positive time delta is indicated using td->sign (-/+). year,month,day..etc are always positive integers or 0. */ + td->sign = isoDuration->sign; + td->year = isoDuration->year; + td->month = isoDuration->month; + td->day = isoDuration->day; + td->hour = isoDuration->hour; + td->minute = isoDuration->minute; + td->second = isoDuration->second; + td->ms = isoDuration->ms; + //Cleanup. deallocate_iso8601_duration(isoDuration); isoDuration = NULL; @@ -119,8 +123,9 @@ newTimeDelta(const char* tds) struct _timedelta * newRawTimeDelta(char _sign, int64_t _year, int _month, int _day, int _hour, int _minute, int _second, int _ms) { - struct _timedelta* td - = (struct _timedelta *) calloc(1, sizeof(struct _timedelta)); + struct _timedelta* td; + + td = (struct _timedelta *) calloc(1, sizeof(struct _timedelta)); if (td == NULL ) { return NULL ; @@ -162,8 +167,8 @@ constructAndCopyTimeDelta(struct _timedelta* td) { if ( td != NULL ) { - struct _timedelta* td_new - = (struct _timedelta *) calloc(1, sizeof(struct _timedelta)); + struct _timedelta* td_new; + td_new = (struct _timedelta *) calloc(1, sizeof(struct _timedelta)); if (td_new == NULL ) { return NULL ; @@ -471,38 +476,59 @@ else static struct _juliandelta* localTimeDeltaToJulianDelta_NonStandardTimeDelta(struct _timedelta* td, struct _datetime* base_dt, struct _juliandelta* jd_return) -{ - (void)base_dt; - int64_t sign_apply = td->sign == '-' ? -1 : (td->sign == '+' ? 1 : 0); - if (sign_apply) { - /* Positive or negative timedelta can be handled symmetrically. */ - /* Negative TimeDelta. A negative juliandelta is represented in the following - way: -P01DT00.500S = jd2->sign = '-', jd2->day = -30, jd2->ms = -500. */ + { - jd_return->sign = sign_apply < 0 ? '-' : '+'; + if ( td->sign == '-' ) + { + /* Negative TimeDelta. A negative juliandelta is represented in the following + way: -P01DT00.500S = jd2->sign = '-', jd2->day = -30, jd2->ms = -500. */ - /* Non standard Months not supported. */ + jd_return->sign = '-'; - /* Day. */ - int64_t day = sign_apply * (int64_t)td->day; - /* Rest. */ - int64_t ms = sign_apply * (int64_t)td->hour * NO_OF_MS_IN_A_HOUR - + sign_apply * (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE - + sign_apply * (int64_t)td->second * NO_OF_MS_IN_A_SECOND - + sign_apply * td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */ + /* Non standard Months not supported. */ - day += ms / NO_OF_MS_IN_A_DAY; - ms = ms % NO_OF_MS_IN_A_DAY; + /* Day. */ + jd_return->day = (-1) * (int64_t)td->day; + /* Rest. */ + jd_return->ms = (-1) * (int64_t)td->hour * NO_OF_MS_IN_A_HOUR + + (-1) * (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE + + (-1) * (int64_t)td->second * NO_OF_MS_IN_A_SECOND + + (-1) * td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */ - jd_return->day = day; - jd_return->ms = ms; + while (jd_return->ms <= (-1) *NO_OF_MS_IN_A_DAY) + { + jd_return->ms = jd_return->ms + NO_OF_MS_IN_A_DAY; + jd_return->day--; + } - } - else - return NULL; /* ERROR: TD sign not defined. Should never happen. */ + } + else if ( td->sign == '+' ) + { + /* Positive TimeDelta. */ - return jd_return; -} + jd_return->sign = '+'; + + /* Non standard Months not supported. */ + + /* Day. */ + jd_return->day = (int64_t)td->day; + /* Rest. */ + jd_return->ms = (int64_t)td->hour * NO_OF_MS_IN_A_HOUR + + (int64_t)td->minute * NO_OF_MS_IN_A_MINUTE + + (int64_t)td->second * NO_OF_MS_IN_A_SECOND + + td->ms; /* No need to promote ms to int64_t; ms greater than 999 not supported even in non std long form. */ + + while (jd_return->ms >= NO_OF_MS_IN_A_DAY) + { + jd_return->ms = jd_return->ms - NO_OF_MS_IN_A_DAY; + jd_return->day++; + } + } + else + return NULL; /* ERROR: TD sign not defined. Should never happen. */ + + return jd_return; + } static @@ -686,7 +712,7 @@ localTimeDeltaToJulianDelta_StandardTimeDelta_CalTypeGREGORIAN(struct _timedelta /* If the (base year - delta year) is a year after leap year and base month is < 3 OR base year - delta year is a leap year and month is >= 3 - => A subtraction of leap-year specific delta for each month. + => A substraction of leap-year specific delta for each month. */ msdinm = monthSpecificDeltaInMonthsLeapyear; ndiny = NO_OF_DAYS_IN_A_LEAP_YEAR; @@ -835,6 +861,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc { if ((jd != NULL) && (base_dt != NULL) && (td_return != NULL)){ + int i = 0; /* No of days in a year. */ int ndiny; @@ -879,43 +906,64 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc For each loop forward, increment year by 1. */ int64_t j = base_dt->date.year; + /* Initialize to 0. */ + td_return->year = 0; /* Fast-Fwd >= 400 */ if (days >= NO_OF_DAYS_IN_400_YEARS) { int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS; - j -= numberOf400YearPeriods * 400; - days -= numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; + td_return->year = td_return->year + numberOf400YearPeriods * 400; + j = j - numberOf400YearPeriods * 400; + days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; } - int year_offset = -(base_dt->date.month < 3); do { - /* Loop over and get to the final year by subtracting 366/365 days depending - on leap/non-leap year. For each subtraction, increment year by 1. + /* Loop over and get to the final year by substracting 366/365 days depending + on leap/non-leap year. For each substraction, increment year by 1. */ /* The crucial point is month of february. */ delta_final_year = days; - /* If year is leap year and base month is >= 3 - OR - next year is a leap year and month is < 3 - => delta of 1 year corresponds to 366 day julian delta. - */ - days -= testYearIsLeapYear(j+year_offset) ? NO_OF_DAYS_IN_A_LEAP_YEAR - : NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; + if ( + ( (testYearIsLeapYear(j)) && (base_dt->date.month >= 3) ) + || + ( (testYearIsLeapYear(j-1)) && (base_dt->date.month < 3) ) + ) + { + /* If year is leap year and base month is >= 3 + OR + next year is a leap year and month is < 3 + => delta of 1 year corresponds to 366 day julian delta. + */ + days = days - NO_OF_DAYS_IN_A_LEAP_YEAR; + } + else + { + /* Otherwise. */ + days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; + } + td_return->year++; j--; } while (days >= 0); - /* Step back if the loop ran one time too much. */ - j += (days < 0); + /* The loop ran one time too much. */ - td_return->year = base_dt->date.year - j; + if (days < 0) + { + td_return->year--; + j++; + } /* In final year, the crucial point is the month of february. */ - if (testYearIsLeapYear(j+year_offset)) + if ( + ((testYearIsLeapYear(j)) && (base_dt->date.month >= 3)) + || + ((testYearIsLeapYear(j-1)) && (base_dt->date.month < 3)) + ) { /* If final year is a leap year and base month is >= 3 OR @@ -932,7 +980,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc ndiny = NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; } - for (int i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++) + for (i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++) { if (delta_final_year < msdinm[base_dt->date.month - 1][i]) { @@ -961,40 +1009,62 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc For each loop back, increment year by 1. */ int64_t j = base_dt->date.year; + /* Initialize. */ + td_return->year = 0; /* Fast-Fwd >= 400 */ if (days >= NO_OF_DAYS_IN_400_YEARS) { int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS; - j += numberOf400YearPeriods * 400; - days -= numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; + td_return->year = td_return->year + numberOf400YearPeriods * 400; + j = j - numberOf400YearPeriods * 400; + days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; } - int year_offset = base_dt->date.month >= 3; do { - /* Loop over and get the year by subtracting 366/365 days depending - on leap/non-leap year. For each subtraction, increment year by 1. + /* Loop over and get the year by substracting 366/365 days depending + on leap/non-leap year. For each substraction, increment year by 1. */ /* The crucial point is month of february. */ delta_final_year = days; - /* If next year is leap year and base month is < 3 - OR - this year is a leap year and month is < 3 - => delta of 1 year corresponds to 366 day julian delta. - */ - days -= testYearIsLeapYear(j+year_offset) ? NO_OF_DAYS_IN_A_LEAP_YEAR - : NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; + if ( + ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3)) + || + ((testYearIsLeapYear(j)) && (base_dt->date.month < 3)) + ) + { + /* If next year is leap year and base month is < 3 + OR + this year is a leap year and month is < 3 + => delta of 1 year corresponds to 366 day julian delta. + */ + days = days - NO_OF_DAYS_IN_A_LEAP_YEAR; + } + else + { + /* Otherwise. */ + days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; + } + + td_return->year++; j++; } while (days >= 0); /* The loop ran one time too much. */ - j -= (days < 0); - td_return->year = -(base_dt->date.year - j); + if (days < 0) + { + td_return->year--; + j--; + } /* In final year, the crucial point is the month of february. */ - if (testYearIsLeapYear(j+year_offset)) + if ( + ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3)) + || + ((testYearIsLeapYear(j)) && (base_dt->date.month < 3)) + ) { /* If final year is a leap year and base month is >= 3 OR @@ -1013,7 +1083,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc td_return->month = 0; td_return->day = (int) delta_final_year; - for (int i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--) + for (i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--) { if (delta_final_year >= msdinm[base_dt->date.month - 1][i]) { @@ -1050,7 +1120,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc int delta_final_year = jd->day % ndiny; - for (int i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--) + for (i = NO_OF_MONTHS_IN_A_YEAR; i > 0; i--) { if ((int) delta_final_year < (ndiny - msdinm[base_dt->date.month - 1][i - 1])) { @@ -1081,7 +1151,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc int delta_final_year = ((-1)*jd->day) % ndiny; - for (int i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++) + for (i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++) { if ((int)delta_final_year < msdinm[base_dt->date.month - 1][i]) { @@ -1160,26 +1230,29 @@ divideDatetimeDifferenceInSeconds(struct _datetime* dt1, struct _datetime* dt2, { if ((divisor->year == 0) && (divisor->month == 0)) { - struct _julianday jd1; - date2julian(dt1, &jd1); + struct _julianday* jd1 = newJulianDay(0, 0); + if (jd1 != NULL) jd1 = date2julian(dt1, jd1); - struct _julianday jd2; - date2julian(dt2, &jd2); + struct _julianday* jd2 = newJulianDay(0, 0); + if (jd2 != NULL) jd2 = date2julian(dt2, jd2); intmax_t denominator = (intmax_t) (((int64_t) divisor->day * 86400 + divisor->hour * 3600 +divisor->minute * 60 + divisor->second ) * 1000 + divisor->ms); if (denominator == 0) /* Division by zero is illegal. */ return NULL; - struct _juliandelta jd; - subtractJulianDay(&jd1, &jd2, &jd); - intmax_t numerator = (intmax_t) (jd.day * 86400000 + jd.ms); + struct _juliandelta* jd = newJulianDelta('+', 0, 0); + jd = substractJulianDay(jd1, jd2, jd); + intmax_t numerator = (intmax_t) (jd->day * 86400000 + jd->ms); imaxdiv_t div = imaxdiv(numerator, denominator); - + quo_ret->quotient = (int64_t) div.quot; quo_ret->remainder_in_ms = (int64_t) div.rem; - + + if (jd1 != NULL) deallocateJulianDay(jd1); + if (jd2 != NULL) deallocateJulianDay(jd2); + if (jd != NULL) deallocateJulianDelta(jd); return quo_ret; } } @@ -1204,34 +1277,42 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime (dt1_divisor != NULL) && (dt2_divisor != NULL) && (quo_ret != NULL)) { // dividend - struct _julianday jd1_dividend; - date2julian(dt1_dividend, &jd1_dividend); + struct _julianday* jd1_dividend = newJulianDay(0, 0); + if (jd1_dividend != NULL) jd1_dividend = date2julian(dt1_dividend, jd1_dividend); - struct _julianday jd2_dividend; - date2julian(dt2_dividend, &jd2_dividend); + struct _julianday* jd2_dividend = newJulianDay(0, 0); + if (jd2_dividend != NULL) jd2_dividend = date2julian(dt2_dividend, jd2_dividend); - struct _juliandelta jd_dividend; - subtractJulianDay(&jd1_dividend, &jd2_dividend, &jd_dividend); - intmax_t numerator = (intmax_t) (jd_dividend.day * 86400000 + jd_dividend.ms); + struct _juliandelta* jd_dividend = newJulianDelta('+', 0, 0); + jd_dividend = substractJulianDay(jd1_dividend, jd2_dividend, jd_dividend); + intmax_t numerator = (intmax_t) (jd_dividend->day * 86400000 + jd_dividend->ms); // divisor - struct _julianday jd1_divisor; - date2julian(dt1_divisor, &jd1_divisor); + struct _julianday* jd1_divisor = newJulianDay(0, 0); + if (jd1_divisor != NULL) jd1_divisor = date2julian(dt1_divisor, jd1_divisor); - struct _julianday jd2_divisor; - date2julian(dt2_divisor, &jd2_divisor); + struct _julianday* jd2_divisor = newJulianDay(0, 0); + if (jd2_divisor != NULL) jd2_divisor = date2julian(dt2_divisor, jd2_divisor); - struct _juliandelta jd_divisor; - subtractJulianDay(&jd1_divisor, &jd2_divisor, &jd_divisor); - intmax_t denominator = (intmax_t) (jd_divisor.day * 86400000 + jd_divisor.ms); + struct _juliandelta* jd_divisor = newJulianDelta('+', 0, 0); + jd_divisor = substractJulianDay(jd1_divisor, jd2_divisor, jd_divisor); + intmax_t denominator = (intmax_t) (jd_divisor->day * 86400000 + jd_divisor->ms); imaxdiv_t div = imaxdiv(numerator, denominator); quo_ret->quotient = (int64_t) div.quot; quo_ret->remainder_in_ms = (int64_t) div.rem; *denominator_ret = (int64_t) (denominator / 1000); - - return quo_ret; + + if (jd1_dividend != NULL) deallocateJulianDay(jd1_dividend); + if (jd2_dividend != NULL) deallocateJulianDay(jd2_dividend); + if (jd_dividend != NULL) deallocateJulianDelta(jd_dividend); + + if (jd1_divisor != NULL) deallocateJulianDay(jd1_divisor); + if (jd2_divisor != NULL) deallocateJulianDay(jd2_divisor); + if (jd_divisor != NULL) deallocateJulianDelta(jd_divisor); + + return quo_ret; } else return NULL; @@ -1240,7 +1321,7 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime /** * @brief Get the TimeDelta between two Dates d1 and d2 as (d1-d2). * - * Routine getTimeDeltaFromDate 'subtracts' two Dates and returns the TimeDelta between + * Routine getTimeDeltaFromDate 'substracts' two Dates and returns the TimeDelta between * them. Internally, Dates are converted to DateTimes and then delta is calculated using * getTimeDeltaFromDateTime(). * @@ -1260,7 +1341,7 @@ divideTwoDatetimeDiffsInSeconds(struct _datetime* dt1_dividend, struct _datetime * A pointer to struct _timedelta. Copy the result of (d1 - d2) in td_return. * * @return td_return - * A pointer to TimeDelta containing the result of subtraction. + * A pointer to TimeDelta containing the result of substraction. */ struct _timedelta* @@ -1269,14 +1350,25 @@ getTimeDeltaFromDate(struct _date* d1, struct _date* d2, struct _timedelta* td_r if ((d1 != NULL )&& (d2 != NULL) && (td_return != NULL) ){ /* Convert Date to datetime and resuse the DateTime interface to calculate time delta. */ - struct _datetime dt1; - convertDateToDateTime(d1, &dt1); + struct _datetime *dt1 = newDateTime(initDummyDTString); + if (dt1 == NULL) + return NULL; + dt1 = convertDateToDateTime(d1, dt1); - struct _datetime dt2; - convertDateToDateTime(d2, &dt2); + struct _datetime *dt2 = newDateTime(initDummyDTString); + if ( dt2 == NULL ) + { + deallocateDateTime(dt1); + return NULL; + } + dt2 = convertDateToDateTime(d2, dt2); /* Call the Datetime function to get TD. dt1 - dt2 */ - td_return = getTimeDeltaFromDateTime(&dt1, &dt2, td_return); + td_return = getTimeDeltaFromDateTime(dt1,dt2,td_return); + + /* Cleanup. */ + deallocateDateTime(dt1); + deallocateDateTime(dt2); return td_return; } @@ -1288,8 +1380,8 @@ else /** * @brief Get the TimeDelta between two DateTimes dt1 and dt2 as (dt1-dt2). * - * Routine getTimeDeltaFromDateTime 'subtracts' two DateTime's and returns the TimeDelta between - * them. Each datetime is converted to an equivalent Julian Date. Subtraction is then performed + * Routine getTimeDeltaFromDateTime 'substracts' two DateTime's and returns the TimeDelta between + * them. Each datetime is converted to an equivalent Julian Date. Substraction is then performed * on Julian axis. The "Julian delta" is finally converted back to normal calendar delta. * * This routine handles all supported Calendar types; i.e. the translation from Calendar date @@ -1309,7 +1401,7 @@ else * A pointer to struct _timedelta. Copy the result of (dt1 - dt2) in td_return. * * @return td_return - * A pointer to TimeDelta containing the result of subtraction. + * A pointer to TimeDelta containing the result of substraction. */ struct _timedelta* @@ -1318,21 +1410,39 @@ getTimeDeltaFromDateTime(struct _datetime* dt1, struct _datetime* dt2, struct _t if ((dt1 != NULL )&& (dt2 != NULL) && (td_return != NULL) ){ /* Convert dt1 to Julian. */ - struct _julianday jd1; - date2julian(dt1, &jd1); + struct _julianday* jd1 = newJulianDay(0, 0); + if (jd1 == NULL) + return NULL; + jd1 = date2julian(dt1, jd1); /* Convert dt2 to Julian. */ - struct _julianday jd2; - date2julian(dt2, &jd2); + struct _julianday* jd2 = newJulianDay(0, 0); + if (jd2 == NULL) + { + deallocateJulianDay(jd1); + return NULL; + } + jd2 = date2julian(dt2, jd2); - /* Calculate Delta on Julian axis. "RULE: A - B = Delta". If A > B, Delta is positive. */ - struct _juliandelta jd; + /* Calculat Delta on Julian axis. "RULE: A - B = Delta". If A > B, Delta is positive. */ + struct _juliandelta* jd = newJulianDelta('+', 0, 0); + if (jd == NULL) + { + deallocateJulianDay(jd1); + deallocateJulianDay(jd2); + return NULL; + } - /* Subtract the 2 dates on julian axis. */ - subtractJulianDay(&jd1, &jd2, &jd); + /* Substract the 2 dates on julian axis. */ + jd = substractJulianDay(jd1, jd2, jd); /* Convert Julian-delta to TimeDelta. */ - td_return = julianDeltaToTimeDelta(&jd, dt2, td_return); + td_return = julianDeltaToTimeDelta(jd, dt2, td_return); + + /* Cleanup. */ + deallocateJulianDay(jd1); + deallocateJulianDay(jd2); + deallocateJulianDelta(jd); return td_return; } @@ -1356,22 +1466,35 @@ else * A pointer to struct _datetime. Reference Datetime for the TD. * * @return totalmilliSeconds - * Integer value of totalmilliSeconds. 0 indicates error. TODO - * on Luis: Is this ok? + * Integer value of totalmilliSeconds. 0 indicates error. TODO on Luis: Is this ok? */ int64_t getTotalMilliSecondsTimeDelta(struct _timedelta* td, struct _datetime* base_dt) { - int64_t totalmilliSeconds = 0; if ((td != NULL )&& (base_dt != NULL) ){ - struct _juliandelta jd, *pjd; - pjd = timeDeltaToJulianDelta(td, base_dt, &jd); - if ( pjd != NULL ) - totalmilliSeconds = jd.day * NO_OF_MS_IN_A_DAY + jd.ms; - } + + int64_t totalmilliSeconds = 0; + + struct _juliandelta* jd = newJulianDelta('+', 0, 0); + if ( jd == NULL ) + return 0; + jd = timeDeltaToJulianDelta(td, base_dt, jd); + if ( jd == NULL ) + { + deallocateJulianDelta(jd); + return 0; + } + + totalmilliSeconds = jd->day * NO_OF_MS_IN_A_DAY + jd->ms; + + deallocateJulianDelta(jd); + return totalmilliSeconds; } +else + return 0; +} /** @@ -1420,52 +1543,64 @@ getTotalSecondsTimeDelta(struct _timedelta* td, struct _datetime* base_dt) char * timedeltaToString(struct _timedelta* td, char* toStr) { - if ((td != NULL )&& (toStr != NULL) && (td->sign == '+' || td->sign == '-')){ + if ((td != NULL )&& (toStr != NULL) ){ + memset(toStr,'\0',MAX_TIMEDELTA_STR_LEN); - int pos = 0; if (td->sign == '-') - toStr[pos++] = '-'; - toStr[pos++] = 'P'; - - if (td->second > 59) - { - /* generate string with seconds only */ - toStr[pos++] = 'T'; - sprintf(toStr+pos,"%d.%03dS",td->second, td->ms); - return toStr; - } - + sprintf(toStr,"%cP",td->sign); + else if (td->sign == '+') + strcpy (toStr,"P"); + else + return NULL; /* ERROR: TD sign not set. Should never happen. */ + if (td->year != 0) - pos += sprintf(toStr+pos,"%" PRIi64 "Y",td->year); + sprintf(&(toStr[strlen(toStr)]),"%" PRIi64 "Y",td->year); if (td->month != 0) - pos += sprintf(toStr+pos,"%02dM",td->month); + sprintf(&(toStr[strlen(toStr)]),"%02dM",td->month); if (td->day != 0) - pos += sprintf(toStr+pos,"%02dD",td->day); + sprintf(&(toStr[strlen(toStr)]),"%02dD",td->day); - toStr[pos++] = 'T'; + sprintf(&(toStr[strlen(toStr)]),"T"); if (td->hour != 0) - pos += sprintf(toStr+pos,"%02dH",td->hour); + sprintf(&(toStr[strlen(toStr)]),"%02dH",td->hour); if (td->minute != 0) - pos += sprintf(toStr+pos,"%02dM",td->minute); + sprintf(&(toStr[strlen(toStr)]),"%02dM",td->minute); if ((td->second != 0) || (td->ms != 0)) { - pos += sprintf(toStr+pos,"%02d.%03dS",td->second,td->ms); + if (td->second > 59) + { + /* reset and generate string with seconds only */ + memset(toStr,'\0',MAX_TIMEDELTA_STR_LEN); + + if (td->sign == '-') + sprintf(toStr,"%cPT",td->sign); + else if (td->sign == '+') + strcpy (toStr,"PT"); + else + return NULL; /*ERROR: TD sign not set. Should never happen. */ + + sprintf(&(toStr[strlen(toStr)]),"%d.%03dS",td->second, td->ms); + } + else + { + sprintf(&(toStr[strlen(toStr)]),"%02d.%03dS",td->second,td->ms); + } } //Discard T if all time values are 0. - if(toStr[pos-1] == 'T') - toStr[--pos] = '\0'; + if(toStr[strlen(toStr)-1] == 'T') + toStr[strlen(toStr)-1] = '\0'; //Return PT00.000S if all delta values are 0. - if(toStr[pos-1] == 'P') - strcpy(toStr+pos,"T00.000S"); + if(toStr[strlen(toStr)-1] == 'P') + strcat(toStr,"T00.000S"); return toStr; } @@ -1508,17 +1643,28 @@ addTimeDeltaToDate(struct _date* d, struct _timedelta* td, struct _date* d_retur if ((d != NULL )&& (td != NULL) && (d_return != NULL) ){ /* Convert Date to Datetime and reuse the DateTime interface for Calculating the sum.*/ - struct _datetime dt; + struct _datetime *dt = newDateTime(initDummyDTString); + if ( dt == NULL ) + return NULL; - convertDateToDateTime(d, &dt); + dt = convertDateToDateTime(d, dt); - struct _datetime dt_return; + struct _datetime *dt_return = newDateTime(initDummyDTString); + if ( dt_return == NULL ) + { + deallocateDateTime(dt); + return NULL; + } /* Call the DateTime interface to calculate the new Datetime. */ - addTimeDeltaToDateTime(&dt,td, &dt_return); + dt_return = addTimeDeltaToDateTime(dt,td, dt_return); /* Get Date from Datetime. */ - d_return = convertDateTimeToDate(&dt_return, d_return); + d_return = convertDateTimeToDate(dt_return, d_return); + + deallocateDateTime(dt); + deallocateDateTime(dt_return); + return d_return; } else @@ -1560,29 +1706,45 @@ addTimeDeltaToDateTime(struct _datetime* dt, struct _timedelta* td, struct _date if ((dt != NULL ) && (td != NULL) && (dt_return != NULL)) { /* Convert base datetime to Julian. */ - struct _julianday jday; - if (!date2julian(dt, &jday)) + struct _julianday* jd1 = newJulianDay(0, 0); + if ( jd1 == NULL) return NULL; + jd1 = date2julian(dt, jd1); /* Get julian delta. */ - struct _juliandelta jdelt; - timeDeltaToJulianDelta(td, dt, &jdelt); + struct _juliandelta* jd2 = newJulianDelta('+', 0, 0); + if ( jd2 == NULL ) + { + deallocateJulianDay(jd1); + return NULL; + } + jd2 = timeDeltaToJulianDelta(td, dt, jd2); - struct _julianday jd; + struct _julianday* jd = newJulianDay(0, 0); + if ( jd == NULL ) + { + deallocateJulianDay(jd1); + deallocateJulianDelta(jd2); + return NULL; + } if ( td->sign == '+' ) { - addJulianDeltaToJulianDay(&jday, &jdelt, &jd); + jd = addJulianDeltaToJulianDay(jd1, jd2, jd); } else if ( td->sign == '-' ) { - subtractJulianDeltaFromJulianDay(&jday, &jdelt, &jd); + jd = substractJulianDeltaFromJulianDay(jd1, jd2, jd); } else return NULL; /* ERROR: Sign of timedelta is not defined. Should never happen. */ /* Get the Datetime */ - dt_return = julian2date(&jd, dt_return); + dt_return = julian2date(jd, dt_return); + + deallocateJulianDay(jd1); + deallocateJulianDelta(jd2); + deallocateJulianDay(jd); return dt_return; } @@ -1623,24 +1785,26 @@ moduloTimeDeltaFromDateTime(struct _datetime* start_dt, struct _timedelta* times { if ((start_dt != NULL )&& (timestep != NULL) && (current_dt != NULL) && (modulo_td != NULL) ){ - struct _datetime dt_tmp, *base_dt; + struct _datetime* dt_tmp = newDateTime(initDummyDTString); + if ( dt_tmp == NULL ) + return NULL; if (compareDatetime(start_dt,current_dt)==(less_than)) { /* Loop over */ - addTimeDeltaToDateTime(start_dt,timestep,&dt_tmp); - while(compareDatetime(&dt_tmp,current_dt) == less_than) - addTimeDeltaToDateTime(&dt_tmp,timestep,&dt_tmp); + replaceDatetime(start_dt,dt_tmp); + while(compareDatetime((dt_tmp = addTimeDeltaToDateTime(dt_tmp,timestep,dt_tmp)),current_dt) == less_than); - /* Return n*timestep+start_dt - current_dt */ - base_dt = &dt_tmp; + /* Return n*dt_tmp - current_dt */ + modulo_td = getTimeDeltaFromDateTime(dt_tmp,current_dt,modulo_td); } else { /* Start time is in the future, return start_time - current_time. */ - base_dt = start_dt; + modulo_td = getTimeDeltaFromDateTime(start_dt,current_dt,modulo_td); } - modulo_td = getTimeDeltaFromDateTime(base_dt,current_dt,modulo_td); + + deallocateDateTime(dt_tmp); return modulo_td; } @@ -1688,26 +1852,41 @@ elementwiseScalarMultiplyTimeDelta(struct _timedelta* base_td, int64_t lambda, s scaled_td->sign = '+'; /* Sign already handled above. Make lambda positive. */ - lambda = (int64_t)(llabs(lambda)); + if (lambda < 0) + lambda *= -1; - /* Multiply each element by scalar. */ - int64_t ms_temp = lambda * base_td->ms; - scaled_td->ms = (int)(ms_temp % NO_OF_MS_IN_A_SECOND); - int64_t s_temp = lambda*base_td->second + ms_temp / NO_OF_MS_IN_A_SECOND; - scaled_td->second = (int)(s_temp % 60); - int64_t m_temp = lambda*base_td->minute + s_temp / 60; - scaled_td->minute = (int)(m_temp % 60); - - int64_t h_temp = lambda*base_td->hour + m_temp / 60; - scaled_td->hour = (int)(h_temp % NO_OF_HOURS_IN_A_DAY); + /* Multiply each element by scalar. */ - /* Scalar multiplication must not give a value in excess of 24 hours. */ - if ( h_temp >= NO_OF_HOURS_IN_A_DAY ) + scaled_td->ms += (int) lambda*base_td->ms; + while ( scaled_td->ms >= NO_OF_MS_IN_A_SECOND ) { - /* ERROR: Return on NULL. */ - return NULL; + scaled_td->ms -= NO_OF_MS_IN_A_SECOND; + scaled_td->second += 1; } + + scaled_td->second += (int) lambda*base_td->second; + while ( scaled_td->second >= 60 ) + { + scaled_td->second -= 60; + scaled_td->minute += 1; + } + + scaled_td->minute += (int) lambda*base_td->minute; + while ( scaled_td->minute >= 60 ) + { + scaled_td->minute -= 60; + scaled_td->hour += 1; + } + + scaled_td->hour += (int) lambda*base_td->hour; + + /* Scalar multiplication can not give a value in excess of 24 hours. */ + if ( scaled_td->hour >= NO_OF_HOURS_IN_A_DAY ) + { + /* ERROR: Return on NULL. */ + return NULL; + } scaled_td->day = 0; scaled_td->month = 0; @@ -1760,7 +1939,8 @@ elementwiseScalarMultiplyTimeDeltaDP(struct _timedelta* base_td, double lambda, else scaled_td->sign = '+'; /* Sign already handled above. Make lambda positive. */ - lambda = fabs(lambda); + if (lambda < 0.) + lambda *= -1.; /* Multiply each element by scalar. */ @@ -1791,7 +1971,7 @@ elementwiseScalarMultiplyTimeDeltaDP(struct _timedelta* base_td, double lambda, * @brief Return the element-wise sum of two timedeltas. * * elementwiseAddTimeDeltatoTimeDelta adds two timedeltas elementwise and returns the result. - * Timedeltas being added must be of the same sign; Subtraction is not supported. + * Timedeltas being added must be of the same sign; Substraction is not supported. * The timedelta can not have days,months or years however: Only Timedeltas upto hours should call this routine. * Also td_return->hour >= 24 will lead to an error. * @@ -1865,7 +2045,7 @@ elementwiseAddTimeDeltatoTimeDelta(struct _timedelta* td1, struct _timedelta* td } else { - /* Subtraction not supported. */ + /* Substraction not supported. */ return NULL; } @@ -1901,17 +2081,20 @@ moduloTimedelta(struct _timedelta *a, struct _timedelta *p, int64_t *quot) { struct _datetime *dt = newDateTime("0001-01-01"); - struct _juliandelta jdd1, jdd2; + struct _juliandelta *jdd1 = newJulianDelta('+', (int64_t) 0, (int64_t) 0); + struct _juliandelta *jdd2 = newJulianDelta('+', (int64_t) 0, (int64_t) 0); - timeDeltaToJulianDelta(a, dt, &jdd1); - timeDeltaToJulianDelta(p, dt, &jdd2); + jdd1 = timeDeltaToJulianDelta(a, dt, jdd1); + jdd2 = timeDeltaToJulianDelta(p, dt, jdd2); int64_t d1, d2; - d1 = (int64_t) 86400000 * jdd1.day + jdd1.ms; - d2 = (int64_t) 86400000 * jdd2.day + jdd2.ms; + d1 = (int64_t) 86400000 * jdd1->day + jdd1->ms; + d2 = (int64_t) 86400000 * jdd2->day + jdd2->ms; ldiv_t d = ldiv(d1, d2); + + int64_t remainder = d.rem; *quot = d.quot; return d.rem; @@ -1946,16 +2129,20 @@ getPTStringFromMS(int64_t _ms, char* PTstr) /* return NULL; */ /* } */ - jd = newJulianDelta(_ms >= 0 ? '+' : '-', 0, _ms); + if (_ms >= 0) + jd = newJulianDelta('+', 0, _ms); + else + jd = newJulianDelta('-', 0, _ms); /* Create dummy variables for julianDeltaToTimeDelta() */ struct _datetime* dumm_base_dt = newDateTime(initDummyDTString); - struct _timedelta dummy_td; + struct _timedelta* dummy_td_return = newTimeDelta(initDummyTDString); /* Get the translated TimeDelta and return the corresponding string. */ - PTstr = timedeltaToString(julianDeltaToTimeDelta(jd, dumm_base_dt, &dummy_td), PTstr); + PTstr = timedeltaToString(julianDeltaToTimeDelta(jd, dumm_base_dt, dummy_td_return), PTstr); deallocateDateTime(dumm_base_dt); + deallocateTimeDelta(dummy_td_return); if(jd) deallocateJulianDelta(jd); diff --git a/test/mtime_julianDay_test.c b/test/mtime_julianDay_test.c index 0ca71dd0..b87b9c95 100644 --- a/test/mtime_julianDay_test.c +++ b/test/mtime_julianDay_test.c @@ -150,50 +150,50 @@ START_TEST(test_addJulianDelta_ProlepticGregorian) } END_TEST -START_TEST(test_subtractJulianDelta_ProlepticGregorian) +START_TEST(test_substractJulianDelta_ProlepticGregorian) { - assertSubtractJulianDelta(0, 40000000, 0, -40000000, 0, 0); - assertSubtractJulianDelta(0, 0, 0, -86400000 + 1, -1, 1); - assertSubtractJulianDelta(0, 0, 0, -86400000, -1, 0); - assertSubtractJulianDelta(0, 20000000, 0, -60000000, -1, 46400000); - assertSubtractJulianDelta(0, 20000000, -42, -60000000, -43, 46400000); - assertSubtractJulianDelta(789643, 20000000, -42, -60000000, 789600, 46400000); - assertSubtractJulianDelta(-789557, 20000000, -42, -60000000, -789600, 46400000); - assertSubtractJulianDelta(0, 0, -773094113281, 43200000, -773094113281, 43200000); - assertSubtractJulianDelta(-386547056640, 43200000, -386547056640, -86400000, -773094113281, 43200000); - assertSubtractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000, -1, 86400000 - 1); - assertSubtractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000 + 1, 0, 0); - assertSubtractJulianDelta(784354017364, 43200000 - 1, -1557448130644, -86400000 + 1, -773094113281, 43200000); + assertSubstractJulianDelta(0, 40000000, 0, -40000000, 0, 0); + assertSubstractJulianDelta(0, 0, 0, -86400000 + 1, -1, 1); + assertSubstractJulianDelta(0, 0, 0, -86400000, -1, 0); + assertSubstractJulianDelta(0, 20000000, 0, -60000000, -1, 46400000); + assertSubstractJulianDelta(0, 20000000, -42, -60000000, -43, 46400000); + assertSubstractJulianDelta(789643, 20000000, -42, -60000000, 789600, 46400000); + assertSubstractJulianDelta(-789557, 20000000, -42, -60000000, -789600, 46400000); + assertSubstractJulianDelta(0, 0, -773094113281, 43200000, -773094113281, 43200000); + assertSubstractJulianDelta(-386547056640, 43200000, -386547056640, -86400000, -773094113281, 43200000); + assertSubstractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000, -1, 86400000 - 1); + assertSubstractJulianDelta(784354017364, 43200000 - 1, -784354017364, -43200000 + 1, 0, 0); + assertSubstractJulianDelta(784354017364, 43200000 - 1, -1557448130644, -86400000 + 1, -773094113281, 43200000); } END_TEST -START_TEST(test_subtractJulianDay_ProlepticGregorian) +START_TEST(test_substractJulianDay_ProlepticGregorian) { - assertSubtractJulianDay(0, 40000000, 0, 0, '+', 0, 40000000); - assertSubtractJulianDay(0, 0, -1, 1, '+', 0, 86400000 - 1); - assertSubtractJulianDay(0, 0, -1, 0, '+', 1, 0); - assertSubtractJulianDay(0, 20000000, -1, 46400000, '+', 0, 60000000); - assertSubtractJulianDay(0, 20000000, -43, 46400000, '+', 42, 60000000); - assertSubtractJulianDay(789643, 20000000, 789600, 46400000, '+', 42, 60000000); - assertSubtractJulianDay(-789557, 20000000, -789600, 46400000, '+', 42, 60000000); - assertSubtractJulianDay(0, 0, -773094113281, 43200000, '+', 773094113280, 43200000); - assertSubtractJulianDay(-386547056640, 43200000, -773094113281, 43200000, '+', 386547056641, 0); - assertSubtractJulianDay(784354017364, 43200000 - 1, -1, 86400000 - 1, '+', 784354017364, 43200000); - assertSubtractJulianDay(784354017364, 43200000 - 1, 0, 0, '+', 784354017364, 43200000 - 1); - assertSubtractJulianDay(784354017364, 43200000 - 1, -773094113281, 43200000, '+', 1557448130644, 86400000 - 1); - - assertSubtractJulianDay(0, 40000000, 0, 80000000, '-', 0, -40000000); - assertSubtractJulianDay(0, 0, 0, 86400000 - 1, '-', 0, -86400000 + 1); - assertSubtractJulianDay(0, 0, 1, 0, '-', -1, 0); - assertSubtractJulianDay(0, 60000000, 1, 33600000, '-', 0, -60000000); - assertSubtractJulianDay(0, 60000000, 43, 33600000, '-', -42, -60000000); - assertSubtractJulianDay(-789643, 60000000, -789600, 33600000, '-', -42, -60000000); - assertSubtractJulianDay(789557, 60000000, 789600, 33600000, '-', -42, -60000000); - assertSubtractJulianDay(0, 0, 773094113279, 43200000 - 1, '-', -773094113279, -43200000 + 1); - assertSubtractJulianDay(386547056640, 43200000 - 1, 773094113279, 43200000 - 1, '-', -386547056639, 0); - assertSubtractJulianDay(-773094113281, 43200000, 0, 86400000 - 1, '-', -773094113281, -43200000 + 1); - assertSubtractJulianDay(-773094113281, 43200000, 0, 0, '-', -773094113280, -43200000); - assertSubtractJulianDay(-773094113281, 43200000, 784354017364, 43200000 - 1, '-', -1557448130644, -86400000 + 1); + assertSubstractJulianDay(0, 40000000, 0, 0, '+', 0, 40000000); + assertSubstractJulianDay(0, 0, -1, 1, '+', 0, 86400000 - 1); + assertSubstractJulianDay(0, 0, -1, 0, '+', 1, 0); + assertSubstractJulianDay(0, 20000000, -1, 46400000, '+', 0, 60000000); + assertSubstractJulianDay(0, 20000000, -43, 46400000, '+', 42, 60000000); + assertSubstractJulianDay(789643, 20000000, 789600, 46400000, '+', 42, 60000000); + assertSubstractJulianDay(-789557, 20000000, -789600, 46400000, '+', 42, 60000000); + assertSubstractJulianDay(0, 0, -773094113281, 43200000, '+', 773094113280, 43200000); + assertSubstractJulianDay(-386547056640, 43200000, -773094113281, 43200000, '+', 386547056641, 0); + assertSubstractJulianDay(784354017364, 43200000 - 1, -1, 86400000 - 1, '+', 784354017364, 43200000); + assertSubstractJulianDay(784354017364, 43200000 - 1, 0, 0, '+', 784354017364, 43200000 - 1); + assertSubstractJulianDay(784354017364, 43200000 - 1, -773094113281, 43200000, '+', 1557448130644, 86400000 - 1); + + assertSubstractJulianDay(0, 40000000, 0, 80000000, '-', 0, -40000000); + assertSubstractJulianDay(0, 0, 0, 86400000 - 1, '-', 0, -86400000 + 1); + assertSubstractJulianDay(0, 0, 1, 0, '-', -1, 0); + assertSubstractJulianDay(0, 60000000, 1, 33600000, '-', 0, -60000000); + assertSubstractJulianDay(0, 60000000, 43, 33600000, '-', -42, -60000000); + assertSubstractJulianDay(-789643, 60000000, -789600, 33600000, '-', -42, -60000000); + assertSubstractJulianDay(789557, 60000000, 789600, 33600000, '-', -42, -60000000); + assertSubstractJulianDay(0, 0, 773094113279, 43200000 - 1, '-', -773094113279, -43200000 + 1); + assertSubstractJulianDay(386547056640, 43200000 - 1, 773094113279, 43200000 - 1, '-', -386547056639, 0); + assertSubstractJulianDay(-773094113281, 43200000, 0, 86400000 - 1, '-', -773094113281, -43200000 + 1); + assertSubstractJulianDay(-773094113281, 43200000, 0, 0, '-', -773094113280, -43200000); + assertSubstractJulianDay(-773094113281, 43200000, 784354017364, 43200000 - 1, '-', -1557448130644, -86400000 + 1); } END_TEST @@ -226,8 +226,8 @@ void add_mtime_julianDay_test_to_suite(Suite* suite) tcase_add_test(tcase_ProlepticGregorian, test_create_julianDay_ProlepticGregorian); tcase_add_test(tcase_ProlepticGregorian, test_create_julianDelta_ProlepticGregorian); tcase_add_test(tcase_ProlepticGregorian, test_addJulianDelta_ProlepticGregorian); - tcase_add_test(tcase_ProlepticGregorian, test_subtractJulianDelta_ProlepticGregorian); - tcase_add_test(tcase_ProlepticGregorian, test_subtractJulianDay_ProlepticGregorian); + tcase_add_test(tcase_ProlepticGregorian, test_substractJulianDelta_ProlepticGregorian); + tcase_add_test(tcase_ProlepticGregorian, test_substractJulianDay_ProlepticGregorian); TCase *tcase_YearOf365Days = tcase_create("mtime_julianDay_test_YearOf365Days"); suite_add_tcase(suite, tcase_YearOf365Days); @@ -305,10 +305,10 @@ void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t del JulianDelta delta = newJulianDelta('+', delta_day, delta_ms); ck_assert(delta != NULL); - JulianDay resultday = addJulianDeltaToJulianDay(originalday, delta, newJulianDay(0, 0)); + JulianDay resultday = addJulianDelta(originalday, delta, newJulianDay(0, 0)); ck_assert(delta != NULL); - const char* format = "addJulianDeltaToJulianDay failed: expected:(%lld, %lld) actual:(%lld, %lld)."; + const char* format = "addJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld)."; size_t length = snprintf(NULL, 0, format, expected_day, expected_ms, resultday->day, resultday->ms) + 1; char* msg = malloc(length); snprintf(msg, length, format, expected_day, expected_ms, resultday->day, resultday->ms); @@ -322,7 +322,7 @@ void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t del free(msg); } -void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms) +void assertSubstractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms) { JulianDay originalday = newJulianDay(original_day, original_ms); ck_assert(originalday != NULL); @@ -330,10 +330,10 @@ void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_ JulianDelta delta = newJulianDelta('-', delta_day, delta_ms); ck_assert(delta != NULL); - JulianDay resultday = subtractJulianDeltaFromJulianDay(originalday, delta, newJulianDay(0, 0)); + JulianDay resultday = substractJulianDelta(originalday, delta, newJulianDay(0, 0)); ck_assert(delta != NULL); - const char* format = "subtractJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld)."; + const char* format = "substractJulianDelta failed: expected:(%lld, %lld) actual:(%lld, %lld)."; size_t length = snprintf(NULL, 0, format, expected_day, expected_ms, resultday->day, resultday->ms) + 1; char* msg = malloc(length); snprintf(msg, length, format, expected_day, expected_ms, resultday->day, resultday->ms); @@ -347,7 +347,7 @@ void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_ free(msg); } -void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms) +void assertSubstractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms) { JulianDay julianday1 = newJulianDay(day1, ms1); ck_assert(julianday1 != NULL); @@ -355,10 +355,10 @@ void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms JulianDay julianday2 = newJulianDay(day2, ms2); ck_assert(julianday2 != NULL); - JulianDelta delta = subtractJulianDay(julianday1, julianday2, newJulianDelta('+', 0, 0)); + JulianDelta delta = substractJulianDay(julianday1, julianday2, newJulianDelta('+', 0, 0)); ck_assert(delta != NULL); - const char* format = "subtractJulianDay failed: expected:(%c, %lld, %lld) actual:(%c, %lld, %lld)."; + const char* format = "substractJulianDay failed: expected:(%c, %lld, %lld) actual:(%c, %lld, %lld)."; size_t length = snprintf(NULL, 0, format, expected_delta_sign, expected_delta_day, expected_delta_ms, delta->sign, delta->day, delta->ms) + 1; char* msg = malloc(length); snprintf(msg, length, format, expected_delta_sign, expected_delta_day, expected_delta_ms, delta->sign, delta->day, delta->ms); diff --git a/test/mtime_julianDay_test.h b/test/mtime_julianDay_test.h index 82a52aa1..beb21deb 100644 --- a/test/mtime_julianDay_test.h +++ b/test/mtime_julianDay_test.h @@ -15,7 +15,7 @@ void add_mtime_julianDay_test_to_suite(Suite* suite); void assertJulianDay(int64_t day, int64_t ms, const char* expected_string); void assertJulianDelta(char sign, int64_t day, int64_t ms, char expected_sign, int64_t expected_day, int64_t expected_ms); void assertAddJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms); -void assertSubtractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms); -void assertSubtractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms); +void assertSubstractJulianDelta(int64_t original_day, int64_t original_ms, int64_t delta_day, int64_t delta_ms, int64_t expected_day, int64_t expected_ms); +void assertSubstractJulianDay(int64_t day1, int64_t ms1, int64_t day2, int64_t ms2, char expected_delta_sign, int64_t expected_delta_day, int64_t expected_delta_ms); #endif -- GitLab