From 09d9acff625508a75508958fe591229f14d780c1 Mon Sep 17 00:00:00 2001
From: Florian Prill <florian.prill@dwd.de>
Date: Thu, 25 Apr 2019 11:06:02 +0200
Subject: [PATCH] [divide_timespans]  implemented large integer division
 algorithm for (days + msecs). - not yet enabled in mtime library.

---
 examples/Makefile.in       | 446 +++++++++++++++++++------------------
 examples/int_div_example.c |  99 ++++++++
 include/int_div.h          |  46 ++++
 src/Makefile.in            | 287 +++++++++---------------
 src/int_div.c              | 253 +++++++++++++++++++++
 5 files changed, 733 insertions(+), 398 deletions(-)
 create mode 100644 examples/int_div_example.c
 create mode 100644 include/int_div.h
 create mode 100644 src/int_div.c

diff --git a/examples/Makefile.in b/examples/Makefile.in
index c60195b0..8938a376 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -88,26 +88,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@ENABLE_EXAMPLES_TRUE@noinst_PROGRAMS = callback_test$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	comp_weights$(EXEEXT) duration$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	example$(EXEEXT) example_hl$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	iconatm$(EXEEXT) iconoce$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	iconoce_hl$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	model_integration$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	modulo$(EXEEXT) output_control$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	recurrence$(EXEEXT) repetitor$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	simulate_iau$(EXEEXT) tas$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	time_calculus$(EXEEXT) uniq$(EXEEXT) \
-@ENABLE_EXAMPLES_TRUE@	test_dace$(EXEEXT)
+noinst_PROGRAMS = time_calculus$(EXEEXT) model_integration$(EXEEXT) \
+	example$(EXEEXT) example_hl$(EXEEXT) duration$(EXEEXT) \
+	output_control$(EXEEXT) recurrence$(EXEEXT) repetitor$(EXEEXT) \
+	tas$(EXEEXT) uniq$(EXEEXT) modulo$(EXEEXT) \
+	comp_weights$(EXEEXT) callback_test$(EXEEXT) iconatm$(EXEEXT) \
+	iconoce$(EXEEXT) iconoce_hl$(EXEEXT) simulate_iau$(EXEEXT) \
+	int_div_example$(EXEEXT)
 subdir = examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \
-	$(top_srcdir)/m4/acx_lang_lib.m4 \
-	$(top_srcdir)/m4/acx_lang_package.m4 \
-	$(top_srcdir)/m4/ax_prog_doxygen.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \
+	$(top_srcdir)/m4/ax_prog_ragel.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -116,82 +110,122 @@ CONFIG_HEADER = $(top_builddir)/config/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
-callback_test_SOURCES = callback_test.f90
-callback_test_OBJECTS = callback_test.$(OBJEXT)
-callback_test_LDADD = $(LDADD)
-callback_test_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+am_callback_test_OBJECTS = callback_test.$(OBJEXT)
+callback_test_OBJECTS = $(am_callback_test_OBJECTS)
+callback_test_DEPENDENCIES = ../src/libmtime.la
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-comp_weights_SOURCES = comp_weights.f90
-comp_weights_OBJECTS = comp_weights.$(OBJEXT)
-comp_weights_LDADD = $(LDADD)
-comp_weights_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-am_duration_OBJECTS = duration.$(OBJEXT) mo_kind.$(OBJEXT)
+callback_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(callback_test_LDFLAGS) $(LDFLAGS) -o $@
+am_comp_weights_OBJECTS = comp_weights.$(OBJEXT)
+comp_weights_OBJECTS = $(am_comp_weights_OBJECTS)
+comp_weights_DEPENDENCIES = ../src/libmtime.la
+comp_weights_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(comp_weights_LDFLAGS) $(LDFLAGS) -o $@
+am_duration_OBJECTS = duration.$(OBJEXT)
 duration_OBJECTS = $(am_duration_OBJECTS)
-duration_LDADD = $(LDADD)
-duration_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-example_SOURCES = example.f90
-example_OBJECTS = example.$(OBJEXT)
-example_LDADD = $(LDADD)
-example_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-example_hl_SOURCES = example_hl.f90
-example_hl_OBJECTS = example_hl.$(OBJEXT)
-example_hl_LDADD = $(LDADD)
-example_hl_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-am_iconatm_OBJECTS = iconatm.$(OBJEXT) mo_event_manager.$(OBJEXT)
+duration_DEPENDENCIES = ../src/libmtime.la
+duration_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(duration_LDFLAGS) $(LDFLAGS) -o $@
+am_example_OBJECTS = example.$(OBJEXT)
+example_OBJECTS = $(am_example_OBJECTS)
+example_DEPENDENCIES = ../src/libmtime.la
+example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(example_LDFLAGS) $(LDFLAGS) -o $@
+am_example_hl_OBJECTS = example_hl.$(OBJEXT)
+example_hl_OBJECTS = $(am_example_hl_OBJECTS)
+example_hl_DEPENDENCIES = ../src/libmtime.la
+example_hl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(example_hl_LDFLAGS) $(LDFLAGS) -o $@
+am_iconatm_OBJECTS = iconatm.$(OBJEXT)
 iconatm_OBJECTS = $(am_iconatm_OBJECTS)
-iconatm_LDADD = $(LDADD)
-iconatm_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-am_iconoce_OBJECTS = iconoce.$(OBJEXT) mo_event_manager.$(OBJEXT)
+iconatm_DEPENDENCIES = ../src/libmtime.la
+iconatm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(iconatm_LDFLAGS) $(LDFLAGS) -o $@
+am_iconoce_OBJECTS = iconoce.$(OBJEXT) mo_output_event_types.$(OBJEXT) \
+	mo_kind.$(OBJEXT)
 iconoce_OBJECTS = $(am_iconoce_OBJECTS)
-iconoce_LDADD = $(LDADD)
-iconoce_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-iconoce_hl_SOURCES = iconoce_hl.f90
-iconoce_hl_OBJECTS = iconoce_hl.$(OBJEXT)
-iconoce_hl_LDADD = $(LDADD)
-iconoce_hl_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+iconoce_DEPENDENCIES = ../src/libmtime.la
+iconoce_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(iconoce_LDFLAGS) $(LDFLAGS) -o $@
+am_iconoce_hl_OBJECTS = iconoce_hl.$(OBJEXT) \
+	mo_output_event_types.$(OBJEXT) mo_kind.$(OBJEXT)
+iconoce_hl_OBJECTS = $(am_iconoce_hl_OBJECTS)
+iconoce_hl_DEPENDENCIES = ../src/libmtime.la
+iconoce_hl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(iconoce_hl_LDFLAGS) $(LDFLAGS) -o $@
 am_model_integration_OBJECTS = model_integration.$(OBJEXT)
 model_integration_OBJECTS = $(am_model_integration_OBJECTS)
-model_integration_LDADD = $(LDADD)
-model_integration_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+model_integration_DEPENDENCIES = ../src/libmtime.la
+model_integration_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(model_integration_LDFLAGS) $(LDFLAGS) \
+	-o $@
 am_modulo_OBJECTS = modulo.$(OBJEXT)
 modulo_OBJECTS = $(am_modulo_OBJECTS)
-modulo_LDADD = $(LDADD)
-modulo_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-output_control_SOURCES = output_control.f90
-output_control_OBJECTS = output_control.$(OBJEXT)
-output_control_LDADD = $(LDADD)
-output_control_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+modulo_DEPENDENCIES = ../src/libmtime.la
+modulo_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(modulo_LDFLAGS) $(LDFLAGS) -o $@
+am_output_control_OBJECTS = output_control.$(OBJEXT)
+output_control_OBJECTS = $(am_output_control_OBJECTS)
+output_control_DEPENDENCIES = ../src/libmtime.la
+output_control_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
+	$(AM_FCFLAGS) $(FCFLAGS) $(output_control_LDFLAGS) $(LDFLAGS) \
+	-o $@
 am_recurrence_OBJECTS = recurrence.$(OBJEXT)
 recurrence_OBJECTS = $(am_recurrence_OBJECTS)
-recurrence_LDADD = $(LDADD)
-recurrence_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-repetitor_SOURCES = repetitor.f90
-repetitor_OBJECTS = repetitor.$(OBJEXT)
-repetitor_LDADD = $(LDADD)
-repetitor_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-simulate_iau_SOURCES = simulate_iau.f90
-simulate_iau_OBJECTS = simulate_iau.$(OBJEXT)
-simulate_iau_LDADD = $(LDADD)
-simulate_iau_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-tas_SOURCES = tas.f90
-tas_OBJECTS = tas.$(OBJEXT)
-tas_LDADD = $(LDADD)
-tas_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)
-test_dace_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+recurrence_DEPENDENCIES = ../src/libmtime.la
+recurrence_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(recurrence_LDFLAGS) $(LDFLAGS) -o $@
+am_repetitor_OBJECTS = repetitor.$(OBJEXT)
+repetitor_OBJECTS = $(am_repetitor_OBJECTS)
+repetitor_DEPENDENCIES = ../src/libmtime.la
+repetitor_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(repetitor_LDFLAGS) $(LDFLAGS) -o $@
+am_simulate_iau_OBJECTS = simulate_iau.$(OBJEXT)
+simulate_iau_OBJECTS = $(am_simulate_iau_OBJECTS)
+simulate_iau_DEPENDENCIES = ../src/libmtime.la
+simulate_iau_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(simulate_iau_LDFLAGS) $(LDFLAGS) -o $@
+am_tas_OBJECTS = tas.$(OBJEXT)
+tas_OBJECTS = $(am_tas_OBJECTS)
+tas_DEPENDENCIES = ../src/libmtime.la
+tas_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(tas_LDFLAGS) $(LDFLAGS) -o $@
 am_time_calculus_OBJECTS = time_calculus.$(OBJEXT)
 time_calculus_OBJECTS = $(am_time_calculus_OBJECTS)
-time_calculus_LDADD = $(LDADD)
-time_calculus_DEPENDENCIES = $(top_builddir)/src/libmtime.la
-uniq_SOURCES = uniq.f90
-uniq_OBJECTS = uniq.$(OBJEXT)
-uniq_LDADD = $(LDADD)
-uniq_DEPENDENCIES = $(top_builddir)/src/libmtime.la
+time_calculus_DEPENDENCIES = ../src/libmtime.la
+time_calculus_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(time_calculus_LDFLAGS) $(LDFLAGS) -o $@
+am_uniq_OBJECTS = uniq.$(OBJEXT)
+uniq_OBJECTS = $(am_uniq_OBJECTS)
+uniq_DEPENDENCIES = ../src/libmtime.la
+uniq_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(uniq_LDFLAGS) $(LDFLAGS) -o $@
+am_int_div_example_OBJECTS = int_div_example.$(OBJEXT)
+int_div_example_OBJECTS = $(am_int_div_example_OBJECTS)
+int_div_example_DEPENDENCIES = ../src/libmtime.la
+int_div_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(int_div_example_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -244,25 +278,27 @@ AM_V_FCLD = $(am__v_FCLD_@AM_V@)
 am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@)
 am__v_FCLD_0 = @echo "  FCLD    " $@;
 am__v_FCLD_1 = 
-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_dace_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_dace_SOURCES) \
-	$(time_calculus_SOURCES) uniq.f90
+SOURCES = $(callback_test_SOURCES) $(comp_weights_SOURCES) \
+	$(duration_SOURCES) $(example_SOURCES) $(example_hl_SOURCES) \
+	$(iconatm_SOURCES) $(iconoce_SOURCES) $(iconoce_hl_SOURCES) \
+	$(model_integration_SOURCES) $(modulo_SOURCES) \
+	$(output_control_SOURCES) $(recurrence_SOURCES) \
+	$(repetitor_SOURCES) $(simulate_iau_SOURCES) $(tas_SOURCES) \
+	$(time_calculus_SOURCES) $(uniq_SOURCES) \
+	$(int_div_example_SOURCES)
+DIST_SOURCES = $(callback_test_SOURCES) $(comp_weights_SOURCES) \
+	$(duration_SOURCES) $(example_SOURCES) $(example_hl_SOURCES) \
+	$(iconatm_SOURCES) $(iconoce_SOURCES) $(iconoce_hl_SOURCES) \
+	$(model_integration_SOURCES) $(modulo_SOURCES) \
+	$(output_control_SOURCES) $(recurrence_SOURCES) \
+	$(repetitor_SOURCES) $(simulate_iau_SOURCES) $(tas_SOURCES) \
+	$(time_calculus_SOURCES) $(uniq_SOURCES) \
+	$(int_div_example_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-am__extra_recursive_targets = doc-recursive install-doc-recursive \
-	man-recursive install-man-recursive
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -295,8 +331,6 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CHECK_CFLAGS = @CHECK_CFLAGS@
-CHECK_CLIBS = @CHECK_CLIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
@@ -337,8 +371,8 @@ EXEEXT = @EXEEXT@
 FC = @FC@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
-FCMODEXT = @FCMODEXT@
-FCMODINC = @FCMODINC@
+FC_MODEXT = @FC_MODEXT@
+FC_MODINC = @FC_MODINC@
 FGREP = @FGREP@
 GREP = @GREP@
 INSTALL = @INSTALL@
@@ -374,11 +408,13 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RAGEL = @RAGEL@
+RAGELFLAGS = @RAGELFLAGS@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+TAR = @TAR@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -388,6 +424,7 @@ ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 ac_ct_FC = @ac_ct_FC@
+ac_empty = @ac_empty@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -435,30 +472,61 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_FCFLAGS = $(FCMODINC)$(top_builddir)/src
-LDADD = $(top_builddir)/src/libmtime.la
-AM_DEFAULT_SOURCE_EXT = .f90
-duration_SOURCES = duration.f90 mo_kind.f90
-iconatm_SOURCES = iconatm.f90 mo_event_manager.f90
-iconoce_SOURCES = iconoce.f90 mo_event_manager.f90
+AM_FCFLAGS = $(FC_MODINC)../src $(FCFLAGS_f90)
+time_calculus_SOURCES = time_calculus.c
+time_calculus_LDADD = ../src/libmtime.la
+time_calculus_LDFLAGS = 
 model_integration_SOURCES = model_integration.c
-modulo_SOURCES = modulo.c
+model_integration_LDADD = ../src/libmtime.la
+model_integration_LDFLAGS = 
+example_SOURCES = example.f90
+example_LDADD = ../src/libmtime.la
+example_LDFLAGS = 
+example_hl_SOURCES = example_hl.f90
+example_hl_LDADD = ../src/libmtime.la
+example_hl_LDFLAGS = 
+duration_SOURCES = duration.f90
+duration_LDADD = ../src/libmtime.la
+duration_LDFLAGS = 
+output_control_SOURCES = output_control.f90
+output_control_LDADD = ../src/libmtime.la
+output_control_LDFLAGS = 
 recurrence_SOURCES = recurrence.c
-time_calculus_SOURCES = time_calculus.c
-test_dace_SOURCES = test_dace.f90 mo_event_manager.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)
-@FCMODUC_TRUE@mo_exception_mod = MO_EXCEPTION.$(FCMODEXT)
-@FCMODUC_FALSE@mo_kind_mod = mo_kind.$(FCMODEXT)
-@FCMODUC_TRUE@mo_kind_mod = MO_KIND.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_error_handling_mod = mtime_error_handling.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_error_handling_mod = MTIME_ERROR_HANDLING.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_hl_mod = mtime_hl.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_hl_mod = MTIME_HL.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_mod = mtime.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_mod = MTIME.$(FCMODEXT)
-MOSTLYCLEANFILES = $(mo_event_manager_mod) $(mo_exception_mod) $(mo_kind_mod)
+recurrence_LDADD = ../src/libmtime.la
+recurrence_LDFLAGS = 
+repetitor_SOURCES = repetitor.f90
+repetitor_LDADD = ../src/libmtime.la
+repetitor_LDFLAGS = 
+comp_weights_SOURCES = comp_weights.f90
+comp_weights_LDADD = ../src/libmtime.la
+comp_weights_LDFLAGS = 
+tas_SOURCES = tas.f90
+tas_LDADD = ../src/libmtime.la
+tas_LDFLAGS = 
+uniq_SOURCES = uniq.f90
+uniq_LDADD = ../src/libmtime.la
+uniq_LDFLAGS = 
+modulo_SOURCES = modulo.c
+modulo_LDADD = ../src/libmtime.la
+modulo_LDFLAGS = 
+callback_test_SOURCES = callback_test.f90
+callback_test_LDADD = ../src/libmtime.la
+callback_test_LDFLAGS = 
+iconatm_SOURCES = iconatm.f90
+iconatm_LDADD = ../src/libmtime.la
+iconatm_LDFLAGS = 
+iconoce_SOURCES = iconoce.f90 mo_output_event_types.f90 mo_kind.f90 
+iconoce_LDADD = ../src/libmtime.la
+iconoce_LDFLAGS = 
+iconoce_hl_SOURCES = iconoce_hl.f90 mo_output_event_types.f90 mo_kind.f90 
+iconoce_hl_LDADD = ../src/libmtime.la
+iconoce_hl_LDFLAGS = 
+simulate_iau_SOURCES = simulate_iau.f90
+simulate_iau_LDADD = ../src/libmtime.la
+simulate_iau_LDFLAGS = 
+int_div_example_SOURCES = int_div_example.f90
+int_div_example_LDADD = ../src/libmtime.la
+int_div_example_LDFLAGS = 
 all: all-am
 
 .SUFFIXES:
@@ -472,9 +540,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign examples/Makefile
+	  $(AUTOMAKE) --gnu examples/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -504,75 +572,75 @@ clean-noinstPROGRAMS:
 
 callback_test$(EXEEXT): $(callback_test_OBJECTS) $(callback_test_DEPENDENCIES) $(EXTRA_callback_test_DEPENDENCIES) 
 	@rm -f callback_test$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(callback_test_OBJECTS) $(callback_test_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(callback_test_LINK) $(callback_test_OBJECTS) $(callback_test_LDADD) $(LIBS)
 
 comp_weights$(EXEEXT): $(comp_weights_OBJECTS) $(comp_weights_DEPENDENCIES) $(EXTRA_comp_weights_DEPENDENCIES) 
 	@rm -f comp_weights$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(comp_weights_OBJECTS) $(comp_weights_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(comp_weights_LINK) $(comp_weights_OBJECTS) $(comp_weights_LDADD) $(LIBS)
 
 duration$(EXEEXT): $(duration_OBJECTS) $(duration_DEPENDENCIES) $(EXTRA_duration_DEPENDENCIES) 
 	@rm -f duration$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(duration_OBJECTS) $(duration_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(duration_LINK) $(duration_OBJECTS) $(duration_LDADD) $(LIBS)
 
 example$(EXEEXT): $(example_OBJECTS) $(example_DEPENDENCIES) $(EXTRA_example_DEPENDENCIES) 
 	@rm -f example$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(example_OBJECTS) $(example_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(example_LINK) $(example_OBJECTS) $(example_LDADD) $(LIBS)
 
 example_hl$(EXEEXT): $(example_hl_OBJECTS) $(example_hl_DEPENDENCIES) $(EXTRA_example_hl_DEPENDENCIES) 
 	@rm -f example_hl$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(example_hl_OBJECTS) $(example_hl_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(example_hl_LINK) $(example_hl_OBJECTS) $(example_hl_LDADD) $(LIBS)
 
 iconatm$(EXEEXT): $(iconatm_OBJECTS) $(iconatm_DEPENDENCIES) $(EXTRA_iconatm_DEPENDENCIES) 
 	@rm -f iconatm$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(iconatm_OBJECTS) $(iconatm_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(iconatm_LINK) $(iconatm_OBJECTS) $(iconatm_LDADD) $(LIBS)
 
 iconoce$(EXEEXT): $(iconoce_OBJECTS) $(iconoce_DEPENDENCIES) $(EXTRA_iconoce_DEPENDENCIES) 
 	@rm -f iconoce$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(iconoce_OBJECTS) $(iconoce_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(iconoce_LINK) $(iconoce_OBJECTS) $(iconoce_LDADD) $(LIBS)
 
 iconoce_hl$(EXEEXT): $(iconoce_hl_OBJECTS) $(iconoce_hl_DEPENDENCIES) $(EXTRA_iconoce_hl_DEPENDENCIES) 
 	@rm -f iconoce_hl$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(iconoce_hl_OBJECTS) $(iconoce_hl_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(iconoce_hl_LINK) $(iconoce_hl_OBJECTS) $(iconoce_hl_LDADD) $(LIBS)
 
 model_integration$(EXEEXT): $(model_integration_OBJECTS) $(model_integration_DEPENDENCIES) $(EXTRA_model_integration_DEPENDENCIES) 
 	@rm -f model_integration$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(model_integration_OBJECTS) $(model_integration_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(model_integration_LINK) $(model_integration_OBJECTS) $(model_integration_LDADD) $(LIBS)
 
 modulo$(EXEEXT): $(modulo_OBJECTS) $(modulo_DEPENDENCIES) $(EXTRA_modulo_DEPENDENCIES) 
 	@rm -f modulo$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(modulo_OBJECTS) $(modulo_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(modulo_LINK) $(modulo_OBJECTS) $(modulo_LDADD) $(LIBS)
 
 output_control$(EXEEXT): $(output_control_OBJECTS) $(output_control_DEPENDENCIES) $(EXTRA_output_control_DEPENDENCIES) 
 	@rm -f output_control$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(output_control_OBJECTS) $(output_control_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(output_control_LINK) $(output_control_OBJECTS) $(output_control_LDADD) $(LIBS)
 
 recurrence$(EXEEXT): $(recurrence_OBJECTS) $(recurrence_DEPENDENCIES) $(EXTRA_recurrence_DEPENDENCIES) 
 	@rm -f recurrence$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(recurrence_OBJECTS) $(recurrence_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(recurrence_LINK) $(recurrence_OBJECTS) $(recurrence_LDADD) $(LIBS)
 
 repetitor$(EXEEXT): $(repetitor_OBJECTS) $(repetitor_DEPENDENCIES) $(EXTRA_repetitor_DEPENDENCIES) 
 	@rm -f repetitor$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(repetitor_OBJECTS) $(repetitor_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(repetitor_LINK) $(repetitor_OBJECTS) $(repetitor_LDADD) $(LIBS)
 
 simulate_iau$(EXEEXT): $(simulate_iau_OBJECTS) $(simulate_iau_DEPENDENCIES) $(EXTRA_simulate_iau_DEPENDENCIES) 
 	@rm -f simulate_iau$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(simulate_iau_OBJECTS) $(simulate_iau_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(simulate_iau_LINK) $(simulate_iau_OBJECTS) $(simulate_iau_LDADD) $(LIBS)
 
 tas$(EXEEXT): $(tas_OBJECTS) $(tas_DEPENDENCIES) $(EXTRA_tas_DEPENDENCIES) 
 	@rm -f tas$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(tas_OBJECTS) $(tas_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)
+	$(AM_V_FCLD)$(tas_LINK) $(tas_OBJECTS) $(tas_LDADD) $(LIBS)
 
 time_calculus$(EXEEXT): $(time_calculus_OBJECTS) $(time_calculus_DEPENDENCIES) $(EXTRA_time_calculus_DEPENDENCIES) 
 	@rm -f time_calculus$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(time_calculus_OBJECTS) $(time_calculus_LDADD) $(LIBS)
+	$(AM_V_CCLD)$(time_calculus_LINK) $(time_calculus_OBJECTS) $(time_calculus_LDADD) $(LIBS)
 
 uniq$(EXEEXT): $(uniq_OBJECTS) $(uniq_DEPENDENCIES) $(EXTRA_uniq_DEPENDENCIES) 
 	@rm -f uniq$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(uniq_OBJECTS) $(uniq_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(uniq_LINK) $(uniq_OBJECTS) $(uniq_LDADD) $(LIBS)
+
+int_div_example$(EXEEXT): $(int_div_example_OBJECTS) $(int_div_example_DEPENDENCIES) $(EXTRA_int_div_example_DEPENDENCIES) 
+	@rm -f int_div_example$(EXEEXT)
+	$(AM_V_FCLD)$(int_div_example_LINK) $(int_div_example_OBJECTS) $(int_div_example_LDADD) $(LIBS) -lgmp 
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -613,23 +681,19 @@ am--depfiles: $(am__depfiles_remade)
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 .f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $<
 
 .f90.obj:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .f90.lo:
-	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-doc-local: 
-install-doc-local: 
-man-local: 
-install-man-local: 
 
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -740,7 +804,6 @@ install-strip:
 	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 	fi
 mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
 
 clean-generic:
 
@@ -765,10 +828,6 @@ distclean: distclean-am
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
 
-doc: doc-am
-
-doc-am: doc-local
-
 dvi: dvi-am
 
 dvi-am:
@@ -783,10 +842,6 @@ info-am:
 
 install-data-am:
 
-install-doc: install-doc-am
-
-install-doc-am: install-doc-local
-
 install-dvi: install-dvi-am
 
 install-dvi-am:
@@ -801,9 +856,7 @@ install-info: install-info-am
 
 install-info-am:
 
-install-man: install-man-am
-
-install-man-am: install-man-local
+install-man:
 
 install-pdf: install-pdf-am
 
@@ -823,14 +876,10 @@ maintainer-clean: maintainer-clean-am
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-man: man-am
-
-man-am: man-local
-
 mostlyclean: mostlyclean-am
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-local
+	mostlyclean-libtool
 
 pdf: pdf-am
 
@@ -847,61 +896,26 @@ uninstall-am:
 .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
 	clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
 	ctags ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir doc-am doc-local dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-doc-am install-doc-local \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-man install-man-am install-man-local install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic man-am man-local mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
 
-$(mo_event_manager_mod): mo_event_manager.$(OBJEXT)
-$(mo_kind_mod): mo_kind.$(OBJEXT)
-
-$(mo_event_manager_mod) $(mo_kind_mod):
-	@if test -z $<; then \
-	  echo "Cannot find Fortran source file providing module '$(basename $(@F))'." >&2; \
-	elif test ! -f $@; then \
-	  rm -f $<; $(MAKE) $(AM_MAKEFLAGS) $<; \
-	fi
+mo_kind.$(OBJEXT): mo_kind.f90
+mo_output_event_types.$(OBJEXT):  mo_output_event_types.f90 mo_kind.$(OBJEXT)
 
-callback_test.$(OBJEXT)    \
-comp_weights.$(OBJEXT)     \
-duration.$(OBJEXT)         \
-example.$(OBJEXT)          \
-iconatm.$(OBJEXT)          \
-iconoce.$(OBJEXT)          \
-iconoce_hl.$(OBJEXT)       \
-mo_event_manager.$(OBJEXT) \
-output_control.$(OBJEXT)   \
-repetitor.$(OBJEXT)        \
-simulate_iau.$(OBJEXT)     \
-tas.$(OBJEXT)              \
-uniq.$(OBJEXT)             \
-test_dace.$(OBJEXT): $(top_builddir)/src/$(mtime_mod)
-
-example_hl.$(OBJEXT)   \
-iconoce_hl.$(OBJEXT)   \
-simulate_iau.$(OBJEXT): $(top_builddir)/src/$(mtime_hl_mod)
-
-duration.$(OBJEXT):                               \
-    $(mo_kind_mod)                                \
-    $(top_builddir)/src/$(mtime_error_handling_mod)
-
-iconatm.$(OBJEXT) \
-iconoce.$(OBJEXT) \
-test_dace.$(OBJEXT): $(mo_event_manager_mod)
-
-mostlyclean-local:
-	rm -f *.i
+duration.$(OBJEXT): duration.f90 mo_kind.$(OBJEXT)
+iconoce.$(OBJEXT): iconoce.f90 mo_output_event_types.$(OBJEXT)
+iconoce_hl.$(OBJEXT): iconoce_hl.f90 mo_output_event_types.$(OBJEXT)
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/examples/int_div_example.c b/examples/int_div_example.c
new file mode 100644
index 00000000..9bbc075d
--- /dev/null
+++ b/examples/int_div_example.c
@@ -0,0 +1,99 @@
+/* --------------------------------------------------------------------------------
+ * EXAMPLE.C
+ *
+ * 04/2019 : F. Prill, DWD
+ *
+ * limitations:
+ *
+ * - the remainder in the mtime struct "_divisionquotienttimespan" is
+ *   limited to int64_t msecs.
+ *
+ * -------------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include "int_div.h"
+#include <gmp.h>
+
+int divide_timespan_mpz(const t_int days1, const t_int day_fraction1,
+                        const t_int days2, const t_int day_fraction2,
+                        t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms);
+
+int main(void) {
+  const int NREPEAT = 3000000;
+
+  int   ret, i, cnt = 0;
+  t_int days1, day_fraction1, days2, day_fraction2;
+  t_int q_decimal0 = 0, remainder_days0 = 0, remainder_ms0 = 0;
+  t_int q_decimal  = 0, remainder_days  = 0, remainder_ms  = 0;
+
+  double f1 = 1728000000.0 / (double) RAND_MAX;
+  double f2 = 86400000.0   / (double) RAND_MAX;
+
+  printf("test program\n");
+  printf("  checking %d random divisions against GNU Multiple Precision Arithmetic Library\n",NREPEAT);
+  srand ( 123 );
+
+  for (i=0; i<NREPEAT; i++) {
+    /* test randomly generated input against GNU Multiple Precision
+       Arithmetic Library: */
+    days1           = (t_int) ( f1 * (double) rand() );
+    day_fraction1   = (t_int) ( f2 * (double) rand() );
+    days2           = (t_int) ( f1 * (double) rand() );
+    day_fraction2   = (t_int) ( f2 * (double) rand() );
+
+    ret = divide_timespan_mpz(days1, day_fraction1, days2, day_fraction2,
+                              &q_decimal0, &remainder_days0, &remainder_ms0);
+    ret = divide_timespan(days1, day_fraction1, days2, day_fraction2,
+                          &q_decimal, &remainder_days, &remainder_ms);
+
+    if ((ret != 0)                          ||
+        (q_decimal != q_decimal0)           ||
+        (remainder_days != remainder_days0) ||
+        (remainder_ms != remainder_ms0))
+      {
+        printf("dividend: %" PRId64 " : %" PRId64 " \n", days1, day_fraction1);
+        printf("divisor : %" PRId64 " : %" PRId64 " \n", days2, day_fraction2);
+        printf("comparison: quotient_out = %" PRId64 ", remainder = %" PRId64 " : %" PRId64 "\n",
+               q_decimal0, remainder_days0, remainder_ms0);
+        printf("quotient_out = %" PRId64 ", remainder = %" PRId64 " : %" PRId64 "\n",
+               q_decimal, remainder_days, remainder_ms);
+        printf("return code = %d\n",ret);
+        cnt++;
+      }
+  }
+
+  printf("  %d discrepancies reported.\n", cnt);
+  printf("test program done after %d tests.\n", NREPEAT);
+  exit(0);
+}
+
+
+int divide_timespan_mpz(const t_int days1, const t_int day_fraction1,
+                        const t_int days2, const t_int day_fraction2,
+                        t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms)
+{
+  mpz_t a0, a1, a2, b1, b2, q, r;
+
+  mpz_inits(a0,a1,a2,b1,b2,q,r,NULL);
+
+  mpz_set_ui(a0, 86400000);
+  mpz_set_ui(a1,days1);
+  mpz_set_ui(a2,day_fraction1);
+  mpz_set_ui(b1,days2);
+  mpz_set_ui(b2,day_fraction2);
+
+  mpz_addmul(a2,a1,a0);
+  mpz_addmul(b2,b1,a0);
+  mpz_fdiv_qr(q,r,a2,b2);
+
+  *q_decimal = mpz_get_ui(q);
+
+  mpz_fdiv_qr(a2,b2,r,a0);
+  *remainder_days = mpz_get_ui(a2);
+  *remainder_ms   = mpz_get_ui(b2);
+
+  mpz_clears(a0,a1,a2,b1,b2,q,r,NULL);
+  return 0;
+}
diff --git a/include/int_div.h b/include/int_div.h
new file mode 100644
index 00000000..480bc4f9
--- /dev/null
+++ b/include/int_div.h
@@ -0,0 +1,46 @@
+/*
+  Large integer division algorithm for (days + msecs).
+
+  04/2019 : F. Prill, DWD.
+
+  The method uses a basis b=1200 representation for time spans and the
+  division algorithm explained in
+
+  P. B. Hansen: Multiple-Length Division Revisited: A Tour of the Minefield (192)
+                Electrical Engineering and Computer Science Technical Reports. 166.
+*/
+
+#ifndef INT_DIV_H_
+#define INT_DIV_H_
+
+#include <stdint.h>
+
+/* array representation has (w+1) digits: */
+#define W_DIGITS 6
+
+typedef int64_t t_int;
+
+/* data type for a natural number represented by an array of
+   (W_DIGITS+1) digits in radix b. */
+typedef t_int t_number[W_DIGITS + 1];
+
+
+void         number_init(t_number *x, const t_int val, const unsigned int m);
+void         print_number(const t_number x);
+unsigned int length(const t_number x);
+void         product(t_number *x, const t_number y, const t_int k, const t_int b, int* ret);
+void         quotient(t_number *x, const t_number y, t_int k, const t_int b);
+void         iremainder(t_number *x, const t_number y, t_int k, const t_int b);
+t_int        trial(const t_number r, const t_number d, const int k, const int m, const t_int b, int* ret);
+int          smaller(const t_number r, const t_number dq, const int k, const int m);
+void         difference(t_number *r, const t_number dq, const int k, const int m, const t_int b, int *ret);
+int          division(const t_number x, const t_number y, t_number *q, t_number *r, const t_int b);
+
+void         convert_basis(const t_int v_in, t_number *v_out, const int digits, const int istart);
+t_int        convert_to_decimal(const t_number v_in, const int istart, const int iend);
+
+int          divide_timespan(const t_int days1, const t_int day_fraction1,
+                             const t_int days2, const t_int day_fraction2,
+                             t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms);
+
+#endif /* INT_DIV_H_ */
diff --git a/src/Makefile.in b/src/Makefile.in
index 7fc54e1b..a8bad531 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -91,16 +91,15 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \
-	$(top_srcdir)/m4/acx_lang_lib.m4 \
-	$(top_srcdir)/m4/acx_lang_package.m4 \
-	$(top_srcdir)/m4/ax_prog_doxygen.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \
+	$(top_srcdir)/m4/ax_prog_ragel.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+	$(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config/config.h
 CONFIG_CLEAN_FILES =
@@ -135,14 +134,16 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libmtime_la_LIBADD =
-am_libmtime_la_OBJECTS = kepler.lo libmtime.lo libmtime_hl.lo \
-	mtime_c_bindings.lo mtime_calendar.lo mtime_calendar360day.lo \
+am__objects_1 = mtime_calendar.lo mtime_calendar360day.lo \
 	mtime_calendar365day.lo mtime_calendarGregorian.lo \
-	mtime_constants.lo mtime_date.lo mtime_datetime.lo \
-	mtime_error_handling.lo mtime_eventHandling.lo \
-	mtime_eventList.lo mtime_iso8601.lo mtime_julianDay.lo \
-	mtime_time.lo mtime_timedelta.lo mtime_utilities.lo orbit.lo \
-	vsop87.lo
+	mtime_iso8601.lo mtime_date.lo mtime_datetime.lo \
+	mtime_julianDay.lo mtime_time.lo mtime_timedelta.lo \
+	mtime_eventList.lo mtime_eventHandling.lo mtime_utilities.lo \
+	vsop87.lo kepler.lo orbit.lo int_div.lo
+am__objects_2 = error_handling.lo mtime_constants.lo \
+	mtime_error_handling.lo mtime_c_bindings.lo libmtime.lo \
+	libmtime_hl.lo
+am_libmtime_la_OBJECTS = $(am__objects_1) $(am__objects_2)
 libmtime_la_OBJECTS = $(am_libmtime_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -174,7 +175,8 @@ am__depfiles_remade = ./$(DEPDIR)/kepler.Plo \
 	./$(DEPDIR)/mtime_julianDay.Plo ./$(DEPDIR)/mtime_time.Plo \
 	./$(DEPDIR)/mtime_timedelta.Plo \
 	./$(DEPDIR)/mtime_utilities.Plo ./$(DEPDIR)/orbit.Plo \
-	./$(DEPDIR)/vsop87.Plo
+	./$(DEPDIR)/vsop87.Plo \
+	./$(DEPDIR)/int_div.Plo
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -216,9 +218,7 @@ am__can_run_installinfo = \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-HEADERS = $(nodist_include_HEADERS)
-am__extra_recursive_targets = doc-recursive install-doc-recursive \
-	man-recursive install-man-recursive
+HEADERS = $(include_HEADERS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -251,8 +251,6 @@ AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
-CHECK_CFLAGS = @CHECK_CFLAGS@
-CHECK_CLIBS = @CHECK_CLIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
@@ -293,8 +291,8 @@ EXEEXT = @EXEEXT@
 FC = @FC@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
-FCMODEXT = @FCMODEXT@
-FCMODINC = @FCMODINC@
+FC_MODEXT = @FC_MODEXT@
+FC_MODINC = @FC_MODINC@
 FGREP = @FGREP@
 GREP = @GREP@
 INSTALL = @INSTALL@
@@ -330,11 +328,13 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RAGEL = @RAGEL@
+RAGELFLAGS = @RAGELFLAGS@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+TAR = @TAR@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -344,6 +344,7 @@ ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 ac_ct_FC = @ac_ct_FC@
+ac_empty = @ac_empty@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
@@ -390,84 +391,56 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-lib_LTLIBRARIES = libmtime.la
 AM_CPPFLAGS = -I$(top_srcdir)/include
-libmtime_la_SOURCES = \
-    kepler.c                  \
-    libmtime.f90              \
-    libmtime_hl.f90           \
-    mtime_c_bindings.f90      \
-    mtime_calendar.c          \
-    mtime_calendar360day.c    \
-    mtime_calendar365day.c    \
-    mtime_calendarGregorian.c \
-    mtime_constants.f90       \
-    mtime_date.c              \
-    mtime_datetime.c          \
-    mtime_error_handling.f90  \
-    mtime_eventHandling.c     \
-    mtime_eventList.c         \
-    mtime_iso8601.c           \
-    mtime_julianDay.c         \
-    mtime_t_datetime.inc      \
-    mtime_t_event.inc         \
-    mtime_t_juliandelta.inc   \
-    mtime_t_timedelta.inc     \
-    mtime_time.c              \
-    mtime_timedelta.c         \
-    mtime_utilities.c         \
-    orbit.c                   \
-    vsop87.c
-
-@FCMODUC_FALSE@mtime_c_bindings_mod = mtime_c_bindings.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_c_bindings_mod = MTIME_C_BINDINGS.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_constants_mod = mtime_constants.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_constants_mod = MTIME_CONSTANTS.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_error_handling_mod = mtime_error_handling.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_error_handling_mod = MTIME_ERROR_HANDLING.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_hl_mod = mtime_hl.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_hl_mod = MTIME_HL.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_mod = mtime.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_mod = MTIME.$(FCMODEXT)
-@FCMODUC_FALSE@mtime_other_mods = \
-@FCMODUC_FALSE@    mtime_calendar.$(FCMODEXT)    \
-@FCMODUC_FALSE@    mtime_date.$(FCMODEXT)        \
-@FCMODUC_FALSE@    mtime_datetime.$(FCMODEXT)    \
-@FCMODUC_FALSE@    mtime_eventgroups.$(FCMODEXT) \
-@FCMODUC_FALSE@    mtime_events.$(FCMODEXT)      \
-@FCMODUC_FALSE@    mtime_julianday.$(FCMODEXT)   \
-@FCMODUC_FALSE@    mtime_juliandelta.$(FCMODEXT) \
-@FCMODUC_FALSE@    mtime_time.$(FCMODEXT)        \
-@FCMODUC_FALSE@    mtime_timedelta.$(FCMODEXT)   \
-@FCMODUC_FALSE@    mtime_utilities.$(FCMODEXT)
-
-@FCMODUC_TRUE@mtime_other_mods = \
-@FCMODUC_TRUE@    MTIME_CALENDAR.$(FCMODEXT)    \
-@FCMODUC_TRUE@    MTIME_DATE.$(FCMODEXT)        \
-@FCMODUC_TRUE@    MTIME_DATETIME.$(FCMODEXT)    \
-@FCMODUC_TRUE@    MTIME_EVENTGROUPS.$(FCMODEXT) \
-@FCMODUC_TRUE@    MTIME_EVENTS.$(FCMODEXT)      \
-@FCMODUC_TRUE@    MTIME_JULIANDAY.$(FCMODEXT)   \
-@FCMODUC_TRUE@    MTIME_JULIANDELTA.$(FCMODEXT) \
-@FCMODUC_TRUE@    MTIME_TIME.$(FCMODEXT)        \
-@FCMODUC_TRUE@    MTIME_TIMEDELTA.$(FCMODEXT)   \
-@FCMODUC_TRUE@    MTIME_UTILITIES.$(FCMODEXT)
-
-@FCMODUC_FALSE@mtime_print_by_callback_mod = mtime_print_by_callback.$(FCMODEXT)
-@FCMODUC_TRUE@mtime_print_by_callback_mod = MTIME_PRINT_BY_CALLBACK.$(FCMODEXT)
-all_mods = \
-    $(mtime_c_bindings_mod)        \
-    $(mtime_constants_mod)         \
-    $(mtime_error_handling_mod)    \
-    $(mtime_hl_mod)                \
-    $(mtime_mod)                   \
-    $(mtime_other_mods)            \
-    $(mtime_print_by_callback_mod)
-
-nodist_include_HEADERS = $(all_mods)
-MOSTLYCLEANFILES = $(all_mods)
-CLEANFILES = libmtime.pyc
-EXTRA_DIST = mtime_iso8601.rl libmtime.py
+AM_FCFLAGS = $(FCFLAGS_f90)
+lib_LTLIBRARIES = libmtime.la
+c_SOURCES = mtime_calendar.c \
+		      mtime_calendar360day.c \
+		      mtime_calendar365day.c \
+		      mtime_calendarGregorian.c \
+		      mtime_iso8601.c \
+		      mtime_date.c \
+		      mtime_datetime.c \
+		      mtime_julianDay.c \
+		      mtime_time.c \
+		      mtime_timedelta.c \
+		      mtime_eventList.c \
+		      mtime_eventHandling.c \
+		      mtime_utilities.c \
+		      vsop87.c \
+		      kepler.c \
+		      orbit.c \
+		      int_div.c
+
+
+# Fortran sources: this list is ordered with respect to the module
+# dependencies!
+ftn_SOURCES = error_handling.f90 \
+                      mtime_constants.f90 \
+                      mtime_error_handling.f90 \
+                      mtime_c_bindings.f90 \
+                      libmtime.f90 \
+		      libmtime_hl.f90
+
+include_HEADERS = mtime_hl.$(FC_MODEXT) \
+		  mtime.$(FC_MODEXT) \
+		  mtime_calendar.$(FC_MODEXT) \
+		  mtime_date.$(FC_MODEXT) \
+		  mtime_datetime.$(FC_MODEXT) \
+		  mtime_eventgroups.$(FC_MODEXT) \
+		  mtime_events.$(FC_MODEXT) \
+		  mtime_julianday.$(FC_MODEXT) \
+		  mtime_time.$(FC_MODEXT) \
+		  mtime_timedelta.$(FC_MODEXT) \
+		  mtime_error_handling.$(FC_MODEXT) \
+		  mtime_constants.$(FC_MODEXT) \
+		  mtime_c_bindings.$(FC_MODEXT)
+
+libmtime_la_SOURCES = $(c_SOURCES)  $(ftn_SOURCES)
+DISTCLEANFILES = $(include_HEADERS) \
+		 libmtime.pyc
+
+EXTRA_DIST = $(srcdir)/mtime_iso8601.rl  $(srcdir)/libmtime.py
 all: all-am
 
 .SUFFIXES:
@@ -481,9 +454,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign src/Makefile
+	  $(AUTOMAKE) --gnu src/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -562,6 +535,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtime_utilities.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orbit.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsop87.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_div.Plo@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
 	@$(MKDIR_P) $(@D)
@@ -591,22 +565,22 @@ am--depfiles: $(am__depfiles_remade)
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
 .f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $<
 
 .f90.obj:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .f90.lo:
-	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
-install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+install-includeHEADERS: $(include_HEADERS)
 	@$(NORMAL_INSTALL)
-	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
 	if test -n "$$list"; then \
 	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
 	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
@@ -620,15 +594,11 @@ install-nodist_includeHEADERS: $(nodist_include_HEADERS)
 	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
 	done
 
-uninstall-nodist_includeHEADERS:
+uninstall-includeHEADERS:
 	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
-doc-local: 
-install-doc-local: 
-man-local: 
-install-man-local: 
 
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -742,14 +712,13 @@ install-strip:
 	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 	fi
 mostlyclean-generic:
-	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
 
 clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
@@ -776,14 +745,11 @@ distclean: distclean-am
 	-rm -f ./$(DEPDIR)/mtime_utilities.Plo
 	-rm -f ./$(DEPDIR)/orbit.Plo
 	-rm -f ./$(DEPDIR)/vsop87.Plo
+	-rm -f ./$(DEPDIR)/int_div.Plo
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
 
-doc: doc-am
-
-doc-am: doc-local
-
 dvi: dvi-am
 
 dvi-am:
@@ -796,11 +762,7 @@ info: info-am
 
 info-am:
 
-install-data-am: install-nodist_includeHEADERS
-
-install-doc: install-doc-am
-
-install-doc-am: install-doc-local
+install-data-am: install-includeHEADERS
 
 install-dvi: install-dvi-am
 
@@ -816,9 +778,7 @@ install-info: install-info-am
 
 install-info-am:
 
-install-man: install-man-am
-
-install-man-am: install-man-local
+install-man:
 
 install-pdf: install-pdf-am
 
@@ -847,17 +807,14 @@ maintainer-clean: maintainer-clean-am
 	-rm -f ./$(DEPDIR)/mtime_utilities.Plo
 	-rm -f ./$(DEPDIR)/orbit.Plo
 	-rm -f ./$(DEPDIR)/vsop87.Plo
+	-rm -f ./$(DEPDIR)/int_div.Plo
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-man: man-am
-
-man-am: man-local
-
 mostlyclean: mostlyclean-am
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-local
+	mostlyclean-libtool
 
 pdf: pdf-am
 
@@ -867,67 +824,33 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
 	clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
 	ctags ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir doc-am doc-local dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-doc-am install-doc-local \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-man-am \
-	install-man-local install-nodist_includeHEADERS install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic man-am man-local mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am uninstall-libLTLIBRARIES \
-	uninstall-nodist_includeHEADERS
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES
 
 .PRECIOUS: Makefile
 
 
-$(mtime_c_bindings_mod): mtime_c_bindings.lo
-$(mtime_constants_mod): mtime_constants.lo
-$(mtime_error_handling_mod) $(mtime_print_by_callback_mod): mtime_error_handling.lo
-$(mtime_hl_mod): libmtime_hl.lo
-$(mtime_mod) $(mtime_other_mods): libmtime.lo
-
-$(all_mods):
-	@if test -z $<; then \
-	  echo "Cannot find Fortran source file providing module '$(basename $(@F))'." >&2; \
-	elif test ! -f $@; then \
-	  rm -f $<; $(MAKE) $(AM_MAKEFLAGS) $<; \
-	fi
-
-libmtime.lo:                       \
-    $(mtime_c_bindings_mod)        \
-    $(mtime_constants_mod)         \
-    $(mtime_error_handling_mod)    \
-    $(mtime_print_by_callback_mod)
-
-libmtime_hl.lo:                 \
-    $(mtime_c_bindings_mod)     \
-    $(mtime_constants_mod)      \
-    $(mtime_error_handling_mod) \
-    $(mtime_mod)
-
-mtime_c_bindings.lo:            \
-    $(mtime_constants_mod)      \
-    $(mtime_error_handling_mod)
-
-mtime_error_handling.lo: $(mtime_constants_mod)
-
-@ENABLE_RAGEL_RULES_TRUE@mtime_iso8601.c: mtime_iso8601.rl
-@ENABLE_RAGEL_RULES_TRUE@	$(AM_V_GEN)$(RAGEL) -o $@ $<
+libmtime_hl.o: libmtime_hl.f90 libmtime.o libmtime_c_bindings.o
 
-mostlyclean-local:
-	rm -f *.i
+@HAVE_RAGEL_TRUE@mtime_iso8601.c: mtime_iso8601.rl
+@HAVE_RAGEL_TRUE@	$(RAGEL) -o mtime_iso8601.c mtime_iso8601.rl
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/src/int_div.c b/src/int_div.c
new file mode 100644
index 00000000..b947fabc
--- /dev/null
+++ b/src/int_div.c
@@ -0,0 +1,253 @@
+/*
+  Large integer division algorithm for (days + msecs).
+
+  04/2019 : F. Prill, DWD.
+
+  The method uses a basis b=1200 representation for time spans and the
+  division algorithm explained in
+
+  P. B. Hansen: Multiple-Length Division Revisited: A Tour of the Minefield (192).
+                Electrical Engineering and Computer Science Technical Reports. 166.
+*/
+#include "int_div.h"
+
+const int   Fail      = -1;
+const t_int iZero     = (t_int) 0;
+const t_int msecs_day = 86400000;
+t_int const bb[4] = { 1, 1200, 1440000, 1728000000 }; /* powers of b = 1200 */
+
+
+/* initialize digits m,m+1,...,W_DIGITS by a constant val. */
+void number_init(t_number *x, const t_int val, const unsigned int m) {
+  int i;
+  for (i=m; i<=W_DIGITS; ++i)  (*x)[i]=val;
+}
+
+
+/* linear search to determine the length of a natural number. */
+unsigned int length(const t_number x) {
+  int i = W_DIGITS;
+  while ((x[i] == iZero) && (i >= 0))  i--;
+  return (i+1);
+}
+
+
+/* partial arithmetic wrt. radix b: product x=y*k, return ret!=0 if overflow. */
+void product(t_number *x, const t_number y, const t_int k, const t_int b, int* ret) {
+  int   i, m=length(y);
+  t_int temp, carry = 0;
+
+  if (*ret != 0) return;
+  for (i=0; i<m; ++i) {
+    temp = y[i]*k + carry;
+    (*x)[i] = temp % b;
+    carry = temp/b;
+  }
+  if (m<=W_DIGITS)
+    (*x)[m] = carry;
+  else
+    *ret = (carry != iZero);
+  for (i=m+1; i<=W_DIGITS; ++i)  (*x)[i] = iZero;
+}
+
+
+/* partial arithmetic wrt. radix b: quotient x=y/k. */
+void quotient(t_number *x, const t_number y, t_int k, const t_int b) {
+  int i, m = length(y);
+  t_int temp, carry = iZero;
+  number_init(x, iZero, m);
+
+  for (i=m-1; i>=0; i--) {
+    temp = carry*b + y[i];
+    (*x)[i] = temp / k;
+    carry = temp % k;
+  }
+}
+
+
+/* partial arithmetic wrt. radix b: remainder x of y/k. */
+void iremainder(t_number *x, const t_number y, t_int k, const t_int b) {
+  int m = length(y), i;
+  t_int carry = iZero;
+
+  number_init(x, iZero, 1);
+  for (i=m-1; i>=0; i--)
+    carry = (carry*b + y[i]) % k;
+  (*x)[0] = carry;
+}
+
+
+/* prefix arithmetic wrt. radix b: estimate of a quotient digit, return <0 if error. */
+t_int trial(const t_number r, const t_number d,
+            const int k, const int m, const t_int b, int* ret) {
+  t_int d2,r3,t = iZero;
+  int   km = k+m;
+#if DEBUG
+  if ((m < 2) || (km < m) || (km>W_DIGITS))  *ret = Fail;
+#endif
+  if (*ret != 0) return iZero;
+  r3 = (r[km]*b + r[km-1])*b + r[km-2];
+  d2 = d[m-1]*b + d[m-2];
+
+  t = r3/d2;
+  return (t > b-1) ? (b-1) : t;
+}
+
+
+/* prefix arithmetic: prefix comparison r{m+1} < dq, return <0 if error. */
+int smaller(const t_number r, const t_number dq, const int k, const int m) {
+  int i=m;
+
+#if DEBUG
+  if ((k < 0) || (k+m < k) || (k+m>W_DIGITS))  return Fail;
+#endif
+  while ((r[i+k] == dq[i]) && (i>=0))  i--;
+  return r[i+k] < dq[i];
+}
+
+
+/* prefix arithmetic wrt. radix b: prefix subtraction r{m+1} := r{m+1} - dq, return ret!=0 if error. */
+void difference(t_number *r, const t_number dq, const int k, const int m, const t_int b, int *ret) {
+  int i;
+  t_int borrow, diff;
+
+#ifdef DEBUG
+  if ((k < 0) || (k+m < k) || (k+m>W_DIGITS))  *ret = Fail;
+#endif
+  if (*ret != 0) return;
+  borrow = iZero;
+  for (i=0; i<=m; i++) {
+    diff = (*r)[i+k] - dq[i] - borrow + b;
+    (*r)[i+k] = diff % b;
+    borrow = (t_int) 1 - diff / b;
+  }
+  *ret = (borrow != iZero);
+}
+
+
+/* complete algorithm for multiple length division x/y wrt. radix b, return <0 if error. */
+int division(const t_number x, const t_number y,
+             t_number *q, t_number *r, const t_int b) {
+  int i, k, m, n, ret = 0;
+  t_int y1, f, qt;
+  t_number d, dq, rm;
+
+  m = length(y);
+  if (m == 1) {
+    y1 = y[m-1];
+    if (y1 <= 0) return Fail;
+    quotient(q,x,y1,b);
+    iremainder(r,x,y1,b);
+  }
+  else {
+    n = length(x);
+    number_init(q, iZero, 0);
+    number_init(r, iZero, 0);
+    if (m > n)
+      for (i=0; i<n; i++)  (*r)[i] = x[i];
+    else {
+      /* long division algorithm */
+      if ((m < 2) || (n < m) || (n>W_DIGITS)) return Fail;
+      f = b / (y[m-1] + (t_int) 1);
+      product(&rm,x,f,b, &ret);
+      product(&d, y,f,b, &ret);
+      for (k=n-m; (k>=0) && (ret == 0); k--) {
+        qt = trial(rm, d, k, m, b, &ret);
+        product(&dq,d,qt,b, &ret);
+
+        if ((ret == 0) && (smaller(rm,dq,k,m)))
+          product(&dq,d,--qt,b, &ret);
+
+        (*q)[k] = qt;
+        difference(&rm,dq,k,m,b, &ret);
+      }
+      quotient(r,rm,f,b);
+    }
+  }
+  return ret;
+}
+
+
+/* convert to basis "b" by a succession of Euclidean divisions, stores to v_out[istart...]. */
+void convert_basis(const t_int v_in, t_number *v_out,
+                   const int digits, const int istart) {
+  int i;
+  t_int v = v_in;
+  for (i=digits; i>=0; i--) {
+    (*v_out)[istart+i] = v / bb[i];
+    v %= bb[i];
+  }
+}
+
+
+/* convert to decimal basis. */
+t_int convert_to_decimal(const t_number v_in,
+                         const int istart, const int iend) {
+  int i, l = length(v_in);
+  t_int v_out = iZero;
+
+  if (iend < l)  l=iend;
+  if ((l-istart) > 3)  return (t_int) Fail;
+  for (i=0; i<(l-istart+1); i++)
+    v_out += v_in[i+istart] * bb[i];
+  return v_out;
+}
+
+
+/*
+   convert days and day fraction to b=1200 basis by a succession of
+   Euclidean divisions.
+   By pre-multiplying with a factor of 20, the day fraction can be
+   expressed by three digits wrt. the basis b=1200.
+
+   restrictions:
+
+   - the no. of digits in the algorithm restricts numbers to 1200^3
+     days, ie. approx. 4.7 mio years.
+   - the quotient is limited to 1200^3 in order to fit into int64_t
+     after conversion to decimal base.
+   - all numbers and time spans must be positive.
+*/
+int divide_timespan(const t_int days1, const t_int day_fraction1,
+                    const t_int days2, const t_int day_fraction2,
+                    t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms)
+{
+  int      ret = 0;
+  t_number p1, p2, q, r; /* dividend, divisor, quotient, remainder */
+  t_int    qd = 0, rd = 0;
+
+  if ((day_fraction1 > msecs_day) || (day_fraction2 > msecs_day))  return Fail;
+
+  convert_basis(day_fraction1 * (t_int) 20, &p1, 2, 0);
+  convert_basis(days1, &p1, W_DIGITS-3, 3);
+  convert_basis(day_fraction2 * (t_int) 20, &p2, 2, 0);
+  convert_basis(days2, &p2, W_DIGITS-3, 3);
+
+  ret = division(p1, p2, &q, &r, (t_int) 1200);  /* perform division. */
+
+  if (ret == 0) {
+    /* convert result back to b=10 basis. */
+    *q_decimal      = qd = convert_to_decimal(q,0,W_DIGITS);
+    *remainder_days =      convert_to_decimal(r,3,W_DIGITS);
+    *remainder_ms   = rd = convert_to_decimal(r,0,2);
+    ret = (qd < iZero) || (rd < iZero);
+
+    *remainder_ms /= ((t_int) 20);
+  }
+  return ret;
+}
+
+
+#ifdef DEBUG
+
+#include <stdio.h>
+#include <inttypes.h>
+
+/* print number to screen. */
+void  print_number(const t_number x) {
+  int i, m = length(x) - 1;
+  for (i=m; i>=0; i--)
+    printf("%" PRId64 " ", x[i]);
+  printf("\n");
+}
+#endif
-- 
GitLab