Initial round of changes to use boost_date_time
This commit is contained in:
parent
4c460a1c40
commit
ba2a54f3d2
35 changed files with 565 additions and 1330 deletions
|
|
@ -13,10 +13,10 @@ endif
|
||||||
libledger_la_CXXFLAGS = $(WARNFLAGS) -I$(top_builddir)/gdtoa
|
libledger_la_CXXFLAGS = $(WARNFLAGS) -I$(top_builddir)/gdtoa
|
||||||
libledger_la_SOURCES = \
|
libledger_la_SOURCES = \
|
||||||
amount.cc \
|
amount.cc \
|
||||||
|
times.cc \
|
||||||
quotes.cc \
|
quotes.cc \
|
||||||
balance.cc \
|
balance.cc \
|
||||||
value.cc \
|
value.cc \
|
||||||
datetime.cc \
|
|
||||||
xml.cc \
|
xml.cc \
|
||||||
xpath.cc \
|
xpath.cc \
|
||||||
mask.cc \
|
mask.cc \
|
||||||
|
|
@ -76,10 +76,10 @@ libpyledger_la_LDFLAGS = -release 3.0
|
||||||
|
|
||||||
pkginclude_HEADERS = \
|
pkginclude_HEADERS = \
|
||||||
amount.h \
|
amount.h \
|
||||||
|
times.h \
|
||||||
balance.h \
|
balance.h \
|
||||||
binary.h \
|
binary.h \
|
||||||
csv.h \
|
csv.h \
|
||||||
datetime.h \
|
|
||||||
debug.h \
|
debug.h \
|
||||||
derive.h \
|
derive.h \
|
||||||
emacs.h \
|
emacs.h \
|
||||||
|
|
@ -151,7 +151,7 @@ noinst_PROGRAMS = ledger.so
|
||||||
|
|
||||||
ledger_so_SOURCES = pyledger.cc
|
ledger_so_SOURCES = pyledger.cc
|
||||||
|
|
||||||
PYLIBS = pyledger ledger gdtoa boost_python gmp pcre
|
PYLIBS = pyledger ledger gdtoa boost_date_time boost_python gmp pcre
|
||||||
|
|
||||||
if HAVE_EXPAT
|
if HAVE_EXPAT
|
||||||
PYLIBS += expat
|
PYLIBS += expat
|
||||||
|
|
|
||||||
44
Makefile.in
44
Makefile.in
|
|
@ -89,8 +89,8 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
|
||||||
libLTLIBRARIES_INSTALL = $(INSTALL)
|
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
libledger_la_LIBADD =
|
libledger_la_LIBADD =
|
||||||
am__libledger_la_SOURCES_DIST = amount.cc quotes.cc balance.cc \
|
am__libledger_la_SOURCES_DIST = amount.cc times.cc quotes.cc \
|
||||||
value.cc datetime.cc xml.cc xpath.cc mask.cc format.cc util.cc \
|
balance.cc value.cc xml.cc xpath.cc mask.cc format.cc util.cc \
|
||||||
session.cc journal.cc parser.cc textual.cc binary.cc \
|
session.cc journal.cc parser.cc textual.cc binary.cc \
|
||||||
xmlparse.cc qif.cc report.cc transform.cc csv.cc derive.cc \
|
xmlparse.cc qif.cc report.cc transform.cc csv.cc derive.cc \
|
||||||
emacs.cc reconcile.cc gnucash.cc ofx.cc debug.cc trace.cc
|
emacs.cc reconcile.cc gnucash.cc ofx.cc debug.cc trace.cc
|
||||||
|
|
@ -99,10 +99,10 @@ am__libledger_la_SOURCES_DIST = amount.cc quotes.cc balance.cc \
|
||||||
@HAVE_LIBOFX_TRUE@am__objects_3 = libledger_la-ofx.lo
|
@HAVE_LIBOFX_TRUE@am__objects_3 = libledger_la-ofx.lo
|
||||||
@DEBUG_TRUE@am__objects_4 = libledger_la-debug.lo \
|
@DEBUG_TRUE@am__objects_4 = libledger_la-debug.lo \
|
||||||
@DEBUG_TRUE@ libledger_la-trace.lo
|
@DEBUG_TRUE@ libledger_la-trace.lo
|
||||||
am_libledger_la_OBJECTS = libledger_la-amount.lo \
|
am_libledger_la_OBJECTS = libledger_la-amount.lo libledger_la-times.lo \
|
||||||
libledger_la-quotes.lo libledger_la-balance.lo \
|
libledger_la-quotes.lo libledger_la-balance.lo \
|
||||||
libledger_la-value.lo libledger_la-datetime.lo \
|
libledger_la-value.lo libledger_la-xml.lo \
|
||||||
libledger_la-xml.lo libledger_la-xpath.lo libledger_la-mask.lo \
|
libledger_la-xpath.lo libledger_la-mask.lo \
|
||||||
libledger_la-format.lo libledger_la-util.lo \
|
libledger_la-format.lo libledger_la-util.lo \
|
||||||
libledger_la-session.lo libledger_la-journal.lo \
|
libledger_la-session.lo libledger_la-journal.lo \
|
||||||
libledger_la-parser.lo libledger_la-textual.lo \
|
libledger_la-parser.lo libledger_la-textual.lo \
|
||||||
|
|
@ -341,12 +341,12 @@ lib_LTLIBRARIES = libledger.la $(am__append_1)
|
||||||
libledger_la_CXXFLAGS = $(WARNFLAGS) -I$(top_builddir)/gdtoa \
|
libledger_la_CXXFLAGS = $(WARNFLAGS) -I$(top_builddir)/gdtoa \
|
||||||
$(am__append_2) $(am__append_4) $(am__append_6) \
|
$(am__append_2) $(am__append_4) $(am__append_6) \
|
||||||
$(am__append_8) $(am__append_10)
|
$(am__append_8) $(am__append_10)
|
||||||
libledger_la_SOURCES = amount.cc quotes.cc balance.cc value.cc \
|
libledger_la_SOURCES = amount.cc times.cc quotes.cc balance.cc \
|
||||||
datetime.cc xml.cc xpath.cc mask.cc format.cc util.cc \
|
value.cc xml.cc xpath.cc mask.cc format.cc util.cc session.cc \
|
||||||
session.cc journal.cc parser.cc textual.cc binary.cc \
|
journal.cc parser.cc textual.cc binary.cc xmlparse.cc qif.cc \
|
||||||
xmlparse.cc qif.cc report.cc transform.cc csv.cc derive.cc \
|
report.cc transform.cc csv.cc derive.cc emacs.cc reconcile.cc \
|
||||||
emacs.cc reconcile.cc $(am__append_3) $(am__append_5) \
|
$(am__append_3) $(am__append_5) $(am__append_7) \
|
||||||
$(am__append_7) $(am__append_9)
|
$(am__append_9)
|
||||||
libledger_la_LDFLAGS = -release 3.0
|
libledger_la_LDFLAGS = -release 3.0
|
||||||
libpyledger_la_CXXFLAGS = -DUSE_BOOST_PYTHON=1 $(am__append_11)
|
libpyledger_la_CXXFLAGS = -DUSE_BOOST_PYTHON=1 $(am__append_11)
|
||||||
libpyledger_la_SOURCES = \
|
libpyledger_la_SOURCES = \
|
||||||
|
|
@ -356,10 +356,10 @@ libpyledger_la_SOURCES = \
|
||||||
libpyledger_la_LDFLAGS = -release 3.0
|
libpyledger_la_LDFLAGS = -release 3.0
|
||||||
pkginclude_HEADERS = \
|
pkginclude_HEADERS = \
|
||||||
amount.h \
|
amount.h \
|
||||||
|
times.h \
|
||||||
balance.h \
|
balance.h \
|
||||||
binary.h \
|
binary.h \
|
||||||
csv.h \
|
csv.h \
|
||||||
datetime.h \
|
|
||||||
debug.h \
|
debug.h \
|
||||||
derive.h \
|
derive.h \
|
||||||
emacs.h \
|
emacs.h \
|
||||||
|
|
@ -399,8 +399,8 @@ ledger_LDADD = $(LIBOBJS) libledger.la gdtoa/libgdtoa.la \
|
||||||
ledger_LDFLAGS = -static # for the sake of command-line speed
|
ledger_LDFLAGS = -static # for the sake of command-line speed
|
||||||
info_TEXINFOS = ledger.texi
|
info_TEXINFOS = ledger.texi
|
||||||
@HAVE_BOOST_PYTHON_TRUE@ledger_so_SOURCES = pyledger.cc
|
@HAVE_BOOST_PYTHON_TRUE@ledger_so_SOURCES = pyledger.cc
|
||||||
@HAVE_BOOST_PYTHON_TRUE@PYLIBS = pyledger ledger gdtoa boost_python \
|
@HAVE_BOOST_PYTHON_TRUE@PYLIBS = pyledger ledger gdtoa boost_date_time \
|
||||||
@HAVE_BOOST_PYTHON_TRUE@ gmp pcre $(am__append_18) \
|
@HAVE_BOOST_PYTHON_TRUE@ boost_python gmp pcre $(am__append_18) \
|
||||||
@HAVE_BOOST_PYTHON_TRUE@ $(am__append_19) $(am__append_20)
|
@HAVE_BOOST_PYTHON_TRUE@ $(am__append_19) $(am__append_20)
|
||||||
@DEBUG_FALSE@@HAVE_BOOST_PYTHON_TRUE@DEBUG_LEVEL = 0
|
@DEBUG_FALSE@@HAVE_BOOST_PYTHON_TRUE@DEBUG_LEVEL = 0
|
||||||
@DEBUG_TRUE@@HAVE_BOOST_PYTHON_TRUE@DEBUG_LEVEL = 4
|
@DEBUG_TRUE@@HAVE_BOOST_PYTHON_TRUE@DEBUG_LEVEL = 4
|
||||||
|
|
@ -569,7 +569,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-balance.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-balance.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-binary.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-binary.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-csv.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-csv.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-datetime.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-debug.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-debug.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-derive.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-derive.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-emacs.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-emacs.Plo@am__quote@
|
||||||
|
|
@ -585,6 +584,7 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-report.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-report.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-session.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-session.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-textual.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-textual.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-times.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-trace.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-trace.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-transform.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-transform.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-util.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libledger_la-util.Plo@am__quote@
|
||||||
|
|
@ -624,6 +624,13 @@ libledger_la-amount.lo: amount.cc
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-amount.lo `test -f 'amount.cc' || echo '$(srcdir)/'`amount.cc
|
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-amount.lo `test -f 'amount.cc' || echo '$(srcdir)/'`amount.cc
|
||||||
|
|
||||||
|
libledger_la-times.lo: times.cc
|
||||||
|
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-times.lo -MD -MP -MF $(DEPDIR)/libledger_la-times.Tpo -c -o libledger_la-times.lo `test -f 'times.cc' || echo '$(srcdir)/'`times.cc
|
||||||
|
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-times.Tpo $(DEPDIR)/libledger_la-times.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='times.cc' object='libledger_la-times.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-times.lo `test -f 'times.cc' || echo '$(srcdir)/'`times.cc
|
||||||
|
|
||||||
libledger_la-quotes.lo: quotes.cc
|
libledger_la-quotes.lo: quotes.cc
|
||||||
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-quotes.lo -MD -MP -MF $(DEPDIR)/libledger_la-quotes.Tpo -c -o libledger_la-quotes.lo `test -f 'quotes.cc' || echo '$(srcdir)/'`quotes.cc
|
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-quotes.lo -MD -MP -MF $(DEPDIR)/libledger_la-quotes.Tpo -c -o libledger_la-quotes.lo `test -f 'quotes.cc' || echo '$(srcdir)/'`quotes.cc
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-quotes.Tpo $(DEPDIR)/libledger_la-quotes.Plo
|
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-quotes.Tpo $(DEPDIR)/libledger_la-quotes.Plo
|
||||||
|
|
@ -645,13 +652,6 @@ libledger_la-value.lo: value.cc
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-value.lo `test -f 'value.cc' || echo '$(srcdir)/'`value.cc
|
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-value.lo `test -f 'value.cc' || echo '$(srcdir)/'`value.cc
|
||||||
|
|
||||||
libledger_la-datetime.lo: datetime.cc
|
|
||||||
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-datetime.lo -MD -MP -MF $(DEPDIR)/libledger_la-datetime.Tpo -c -o libledger_la-datetime.lo `test -f 'datetime.cc' || echo '$(srcdir)/'`datetime.cc
|
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-datetime.Tpo $(DEPDIR)/libledger_la-datetime.Plo
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='datetime.cc' object='libledger_la-datetime.lo' libtool=yes @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -c -o libledger_la-datetime.lo `test -f 'datetime.cc' || echo '$(srcdir)/'`datetime.cc
|
|
||||||
|
|
||||||
libledger_la-xml.lo: xml.cc
|
libledger_la-xml.lo: xml.cc
|
||||||
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-xml.lo -MD -MP -MF $(DEPDIR)/libledger_la-xml.Tpo -c -o libledger_la-xml.lo `test -f 'xml.cc' || echo '$(srcdir)/'`xml.cc
|
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libledger_la_CXXFLAGS) $(CXXFLAGS) -MT libledger_la-xml.lo -MD -MP -MF $(DEPDIR)/libledger_la-xml.Tpo -c -o libledger_la-xml.lo `test -f 'xml.cc' || echo '$(srcdir)/'`xml.cc
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-xml.Tpo $(DEPDIR)/libledger_la-xml.Plo
|
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libledger_la-xml.Tpo $(DEPDIR)/libledger_la-xml.Plo
|
||||||
|
|
|
||||||
|
|
@ -33,18 +33,12 @@
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
#undef HAVE_STDLIB_H
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `strftime' function. */
|
|
||||||
#undef HAVE_STRFTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
#undef HAVE_STRINGS_H
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
#undef HAVE_STRING_H
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `strptime' function. */
|
|
||||||
#undef HAVE_STRPTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
|
|
||||||
91
amount.cc
91
amount.cc
|
|
@ -210,18 +210,6 @@ static void mpz_round(mpz_t out, mpz_t value, int value_prec, int round_prec)
|
||||||
mpz_tdiv_q(out, out, divisor);
|
mpz_tdiv_q(out, out, divisor);
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t::amount_t(const bool val)
|
|
||||||
{
|
|
||||||
TRACE_CTOR("amount_t(const bool)");
|
|
||||||
if (val) {
|
|
||||||
quantity = &true_value;
|
|
||||||
quantity->ref++;
|
|
||||||
} else {
|
|
||||||
quantity = NULL;
|
|
||||||
}
|
|
||||||
commodity_ = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
amount_t::amount_t(const long val)
|
amount_t::amount_t(const long val)
|
||||||
{
|
{
|
||||||
TRACE_CTOR("amount_t(const long)");
|
TRACE_CTOR("amount_t(const long)");
|
||||||
|
|
@ -419,21 +407,6 @@ amount_t& amount_t::operator=(const amount_t& amt)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t& amount_t::operator=(const bool val)
|
|
||||||
{
|
|
||||||
if (! val) {
|
|
||||||
if (quantity)
|
|
||||||
_clear();
|
|
||||||
} else {
|
|
||||||
commodity_ = NULL;
|
|
||||||
if (quantity)
|
|
||||||
_release();
|
|
||||||
quantity = &true_value;
|
|
||||||
quantity->ref++;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
amount_t& amount_t::operator=(const long val)
|
amount_t& amount_t::operator=(const long val)
|
||||||
{
|
{
|
||||||
if (val == 0) {
|
if (val == 0) {
|
||||||
|
|
@ -774,12 +747,12 @@ amount_t::operator double() const
|
||||||
return std::atof(num.str().c_str());
|
return std::atof(num.str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t amount_t::value(const datetime_t& moment) const
|
amount_t amount_t::value(const ptime& moment) const
|
||||||
{
|
{
|
||||||
if (quantity) {
|
if (quantity) {
|
||||||
amount_t amt(commodity().value(moment));
|
amount_t amt(commodity().value(moment));
|
||||||
if (! amt.realzero())
|
if (! amt.realzero())
|
||||||
return (amt * *this).round();
|
return (amt * number()).round();
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
@ -1159,7 +1132,7 @@ static void parse_commodity(std::istream& in, std::string& symbol)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse_annotations(std::istream& in, amount_t& price,
|
bool parse_annotations(std::istream& in, amount_t& price,
|
||||||
datetime_t& date, std::string& tag)
|
ptime& date, std::string& tag)
|
||||||
{
|
{
|
||||||
bool has_date = false;
|
bool has_date = false;
|
||||||
|
|
||||||
|
|
@ -1189,7 +1162,7 @@ bool parse_annotations(std::istream& in, amount_t& price,
|
||||||
price = price.round(); // no need to retain individual precision
|
price = price.round(); // no need to retain individual precision
|
||||||
}
|
}
|
||||||
else if (c == '[') {
|
else if (c == '[') {
|
||||||
if (date)
|
if (date.is_not_a_date_time())
|
||||||
throw new amount_error("Commodity specifies more than one date");
|
throw new amount_error("Commodity specifies more than one date");
|
||||||
|
|
||||||
in.get(c);
|
in.get(c);
|
||||||
|
|
@ -1199,7 +1172,7 @@ bool parse_annotations(std::istream& in, amount_t& price,
|
||||||
else
|
else
|
||||||
throw new amount_error("Commodity date lacks closing bracket");
|
throw new amount_error("Commodity date lacks closing bracket");
|
||||||
|
|
||||||
date = buf;
|
date = ptime_from_local_date_string(buf);
|
||||||
has_date = true;
|
has_date = true;
|
||||||
}
|
}
|
||||||
else if (c == '(') {
|
else if (c == '(') {
|
||||||
|
|
@ -1239,7 +1212,7 @@ void amount_t::parse(std::istream& in, unsigned char flags)
|
||||||
std::string symbol;
|
std::string symbol;
|
||||||
std::string quant;
|
std::string quant;
|
||||||
amount_t tprice;
|
amount_t tprice;
|
||||||
datetime_t tdate;
|
ptime tdate;
|
||||||
bool had_date = false;
|
bool had_date = false;
|
||||||
std::string tag;
|
std::string tag;
|
||||||
unsigned int comm_flags = COMMODITY_STYLE_DEFAULTS;
|
unsigned int comm_flags = COMMODITY_STYLE_DEFAULTS;
|
||||||
|
|
@ -1579,7 +1552,7 @@ bool amount_t::valid() const
|
||||||
}
|
}
|
||||||
|
|
||||||
void amount_t::annotate_commodity(const amount_t& tprice,
|
void amount_t::annotate_commodity(const amount_t& tprice,
|
||||||
const datetime_t& tdate,
|
const ptime& tdate,
|
||||||
const std::string& tag)
|
const std::string& tag)
|
||||||
{
|
{
|
||||||
const commodity_t * this_base;
|
const commodity_t * this_base;
|
||||||
|
|
@ -1602,7 +1575,7 @@ void amount_t::annotate_commodity(const amount_t& tprice,
|
||||||
commodity_t * ann_comm =
|
commodity_t * ann_comm =
|
||||||
annotated_commodity_t::find_or_create
|
annotated_commodity_t::find_or_create
|
||||||
(*this_base, ! tprice && this_ann ? this_ann->price : tprice,
|
(*this_base, ! tprice && this_ann ? this_ann->price : tprice,
|
||||||
! tdate && this_ann ? this_ann->date : tdate,
|
tdate.is_not_a_date_time() && this_ann ? this_ann->date : tdate,
|
||||||
tag.empty() && this_ann ? this_ann->tag : tag);
|
tag.empty() && this_ann ? this_ann->tag : tag);
|
||||||
if (ann_comm)
|
if (ann_comm)
|
||||||
set_commodity(*ann_comm);
|
set_commodity(*ann_comm);
|
||||||
|
|
@ -1631,12 +1604,12 @@ amount_t amount_t::strip_annotations(const bool _keep_price,
|
||||||
commodity_t * new_comm;
|
commodity_t * new_comm;
|
||||||
|
|
||||||
if ((_keep_price && ann_comm.price) ||
|
if ((_keep_price && ann_comm.price) ||
|
||||||
(_keep_date && ann_comm.date) ||
|
(_keep_date && ! ann_comm.date.is_not_a_date_time()) ||
|
||||||
(_keep_tag && ! ann_comm.tag.empty()))
|
(_keep_tag && ! ann_comm.tag.empty()))
|
||||||
{
|
{
|
||||||
new_comm = annotated_commodity_t::find_or_create
|
new_comm = annotated_commodity_t::find_or_create
|
||||||
(*ann_comm.ptr, _keep_price ? ann_comm.price : amount_t(),
|
(*ann_comm.ptr, _keep_price ? ann_comm.price : amount_t(),
|
||||||
_keep_date ? ann_comm.date : datetime_t(),
|
_keep_date ? ann_comm.date : ptime(),
|
||||||
_keep_tag ? ann_comm.tag : "");
|
_keep_tag ? ann_comm.tag : "");
|
||||||
} else {
|
} else {
|
||||||
new_comm = commodity_t::find_or_create(ann_comm.base_symbol());
|
new_comm = commodity_t::find_or_create(ann_comm.base_symbol());
|
||||||
|
|
@ -1662,7 +1635,7 @@ amount_t amount_t::price() const
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t amount_t::date() const
|
ptime amount_t::date() const
|
||||||
{
|
{
|
||||||
if (commodity_ && commodity_->annotated) {
|
if (commodity_ && commodity_->annotated) {
|
||||||
DEBUG_PRINT("amounts.commodities",
|
DEBUG_PRINT("amounts.commodities",
|
||||||
|
|
@ -1670,11 +1643,11 @@ datetime_t amount_t::date() const
|
||||||
<< ((annotated_commodity_t *)commodity_)->date);
|
<< ((annotated_commodity_t *)commodity_)->date);
|
||||||
return ((annotated_commodity_t *)commodity_)->date;
|
return ((annotated_commodity_t *)commodity_)->date;
|
||||||
}
|
}
|
||||||
return 0L;
|
return ptime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void commodity_base_t::add_price(const datetime_t& date,
|
void commodity_base_t::add_price(const ptime& date,
|
||||||
const amount_t& price)
|
const amount_t& price)
|
||||||
{
|
{
|
||||||
if (! history)
|
if (! history)
|
||||||
|
|
@ -1690,7 +1663,7 @@ void commodity_base_t::add_price(const datetime_t& date,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool commodity_base_t::remove_price(const datetime_t& date)
|
bool commodity_base_t::remove_price(const ptime& date)
|
||||||
{
|
{
|
||||||
if (history) {
|
if (history) {
|
||||||
history_map::size_type n = history->prices.erase(date);
|
history_map::size_type n = history->prices.erase(date);
|
||||||
|
|
@ -1800,15 +1773,15 @@ commodity_t * commodity_t::find(const std::string& symbol)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t commodity_base_t::value(const datetime_t& moment)
|
amount_t commodity_base_t::value(const ptime& moment)
|
||||||
{
|
{
|
||||||
datetime_t age;
|
ptime age;
|
||||||
amount_t price;
|
amount_t price;
|
||||||
|
|
||||||
if (history) {
|
if (history) {
|
||||||
assert(history->prices.size() > 0);
|
assert(history->prices.size() > 0);
|
||||||
|
|
||||||
if (! moment) {
|
if (moment.is_not_a_date_time()) {
|
||||||
history_map::reverse_iterator r = history->prices.rbegin();
|
history_map::reverse_iterator r = history->prices.rbegin();
|
||||||
age = (*r).first;
|
age = (*r).first;
|
||||||
price = (*r).second;
|
price = (*r).second;
|
||||||
|
|
@ -1826,7 +1799,7 @@ amount_t commodity_base_t::value(const datetime_t& moment)
|
||||||
age = (*i).first;
|
age = (*i).first;
|
||||||
price = (*i).second;
|
price = (*i).second;
|
||||||
} else {
|
} else {
|
||||||
age = 0;
|
age = ptime();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
price = (*i).second;
|
price = (*i).second;
|
||||||
|
|
@ -1838,7 +1811,7 @@ amount_t commodity_base_t::value(const datetime_t& moment)
|
||||||
if (updater && ! (flags & COMMODITY_STYLE_NOMARKET))
|
if (updater && ! (flags & COMMODITY_STYLE_NOMARKET))
|
||||||
(*updater)(*this, moment, age,
|
(*updater)(*this, moment, age,
|
||||||
(history && history->prices.size() > 0 ?
|
(history && history->prices.size() > 0 ?
|
||||||
(*history->prices.rbegin()).first : datetime_t()), price);
|
(*history->prices.rbegin()).first : ptime()), price);
|
||||||
|
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
@ -1854,7 +1827,7 @@ bool annotated_commodity_t::operator==(const commodity_t& comm) const
|
||||||
price != static_cast<const annotated_commodity_t&>(comm).price))
|
price != static_cast<const annotated_commodity_t&>(comm).price))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (date &&
|
if (! date.is_not_a_date_time() &&
|
||||||
(! comm.annotated ||
|
(! comm.annotated ||
|
||||||
date != static_cast<const annotated_commodity_t&>(comm).date))
|
date != static_cast<const annotated_commodity_t&>(comm).date))
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1870,13 +1843,13 @@ bool annotated_commodity_t::operator==(const commodity_t& comm) const
|
||||||
void
|
void
|
||||||
annotated_commodity_t::write_annotations(std::ostream& out,
|
annotated_commodity_t::write_annotations(std::ostream& out,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag)
|
const std::string& tag)
|
||||||
{
|
{
|
||||||
if (price)
|
if (price)
|
||||||
out << " {" << price << '}';
|
out << " {" << price << '}';
|
||||||
|
|
||||||
if (date)
|
if (! date.is_not_a_date_time())
|
||||||
out << " [" << date << ']';
|
out << " [" << date << ']';
|
||||||
|
|
||||||
if (! tag.empty())
|
if (! tag.empty())
|
||||||
|
|
@ -1886,7 +1859,7 @@ annotated_commodity_t::write_annotations(std::ostream& out,
|
||||||
commodity_t *
|
commodity_t *
|
||||||
annotated_commodity_t::create(const commodity_t& comm,
|
annotated_commodity_t::create(const commodity_t& comm,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag,
|
const std::string& tag,
|
||||||
const std::string& mapping_key)
|
const std::string& mapping_key)
|
||||||
{
|
{
|
||||||
|
|
@ -1927,7 +1900,7 @@ annotated_commodity_t::create(const commodity_t& comm,
|
||||||
namespace {
|
namespace {
|
||||||
std::string make_qualified_name(const commodity_t& comm,
|
std::string make_qualified_name(const commodity_t& comm,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag)
|
const std::string& tag)
|
||||||
{
|
{
|
||||||
if (price < 0)
|
if (price < 0)
|
||||||
|
|
@ -1953,7 +1926,7 @@ namespace {
|
||||||
commodity_t *
|
commodity_t *
|
||||||
annotated_commodity_t::find_or_create(const commodity_t& comm,
|
annotated_commodity_t::find_or_create(const commodity_t& comm,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag)
|
const std::string& tag)
|
||||||
{
|
{
|
||||||
std::string name = make_qualified_name(comm, price, date, tag);
|
std::string name = make_qualified_name(comm, price, date, tag);
|
||||||
|
|
@ -2016,15 +1989,17 @@ bool compare_amount_commodities::operator()(const amount_t * left,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! aleftcomm.date && arightcomm.date)
|
if (aleftcomm.date.is_not_a_date_time() &&
|
||||||
|
! arightcomm.date.is_not_a_date_time())
|
||||||
return true;
|
return true;
|
||||||
if (aleftcomm.date && ! arightcomm.date)
|
if (! aleftcomm.date.is_not_a_date_time() &&
|
||||||
|
arightcomm.date.is_not_a_date_time())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (aleftcomm.date && arightcomm.date) {
|
if (! aleftcomm.date.is_not_a_date_time() &&
|
||||||
int diff = aleftcomm.date - arightcomm.date;
|
! arightcomm.date.is_not_a_date_time()) {
|
||||||
if (diff)
|
time_duration diff = aleftcomm.date - arightcomm.date;
|
||||||
return diff < 0;
|
return diff.is_negative();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aleftcomm.tag.empty() && ! arightcomm.tag.empty())
|
if (aleftcomm.tag.empty() && ! arightcomm.tag.empty())
|
||||||
|
|
|
||||||
146
amount.h
146
amount.h
|
|
@ -42,7 +42,7 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
#include "datetime.h"
|
#include "times.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
|
|
@ -94,7 +94,6 @@ class amount_t
|
||||||
TRACE_CTOR("amount_t(const char *)");
|
TRACE_CTOR("amount_t(const char *)");
|
||||||
parse(val);
|
parse(val);
|
||||||
}
|
}
|
||||||
amount_t(const bool val);
|
|
||||||
amount_t(const long val);
|
amount_t(const long val);
|
||||||
amount_t(const unsigned long val);
|
amount_t(const unsigned long val);
|
||||||
amount_t(const double val);
|
amount_t(const double val);
|
||||||
|
|
@ -118,7 +117,7 @@ class amount_t
|
||||||
commodity_ = &comm;
|
commodity_ = &comm;
|
||||||
}
|
}
|
||||||
void annotate_commodity(const amount_t& price,
|
void annotate_commodity(const amount_t& price,
|
||||||
const datetime_t& date = datetime_t(),
|
const ptime& date = ptime(),
|
||||||
const std::string& tag = "");
|
const std::string& tag = "");
|
||||||
amount_t strip_annotations(const bool _keep_price = keep_price,
|
amount_t strip_annotations(const bool _keep_price = keep_price,
|
||||||
const bool _keep_date = keep_date,
|
const bool _keep_date = keep_date,
|
||||||
|
|
@ -127,7 +126,7 @@ class amount_t
|
||||||
commodity_ = NULL;
|
commodity_ = NULL;
|
||||||
}
|
}
|
||||||
amount_t price() const;
|
amount_t price() const;
|
||||||
datetime_t date() const;
|
ptime date() const;
|
||||||
|
|
||||||
bool null() const {
|
bool null() const {
|
||||||
return ! quantity && ! has_commodity();
|
return ! quantity && ! has_commodity();
|
||||||
|
|
@ -137,7 +136,6 @@ class amount_t
|
||||||
amount_t& operator=(const amount_t& amt);
|
amount_t& operator=(const amount_t& amt);
|
||||||
amount_t& operator=(const std::string& val);
|
amount_t& operator=(const std::string& val);
|
||||||
amount_t& operator=(const char * val);
|
amount_t& operator=(const char * val);
|
||||||
amount_t& operator=(const bool val);
|
|
||||||
amount_t& operator=(const long val);
|
amount_t& operator=(const long val);
|
||||||
amount_t& operator=(const unsigned long val);
|
amount_t& operator=(const unsigned long val);
|
||||||
amount_t& operator=(const double val);
|
amount_t& operator=(const double val);
|
||||||
|
|
@ -299,7 +297,7 @@ class amount_t
|
||||||
return ! (*this == num);
|
return ! (*this == num);
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t value(const datetime_t& moment) const;
|
amount_t value(const ptime& moment) const;
|
||||||
|
|
||||||
// jww (2007-04-17): change the name here
|
// jww (2007-04-17): change the name here
|
||||||
void abs() {
|
void abs() {
|
||||||
|
|
@ -327,7 +325,7 @@ class amount_t
|
||||||
char * item_pool_end);
|
char * item_pool_end);
|
||||||
|
|
||||||
friend bool parse_annotations(std::istream& in, amount_t& price,
|
friend bool parse_annotations(std::istream& in, amount_t& price,
|
||||||
datetime_t& date, std::string& tag);
|
ptime& date, std::string& tag);
|
||||||
|
|
||||||
// Streaming interface
|
// Streaming interface
|
||||||
|
|
||||||
|
|
@ -387,63 +385,50 @@ inline amount_t abs(const amount_t& amt) {
|
||||||
return amt < 0 ? amt.negated() : amt;
|
return amt < 0 ? amt.negated() : amt;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
#define DEFINE_AMOUNT_OPERATORS(T) \
|
||||||
inline amount_t operator+(const T val, const amount_t& amt) {
|
inline amount_t operator+(const T val, const amount_t& amt) { \
|
||||||
amount_t temp(val);
|
amount_t temp(val); \
|
||||||
temp += amt;
|
temp += amt; \
|
||||||
return temp;
|
return temp; \
|
||||||
|
} \
|
||||||
|
inline amount_t operator-(const T val, const amount_t& amt) { \
|
||||||
|
amount_t temp(val); \
|
||||||
|
temp -= amt; \
|
||||||
|
return temp; \
|
||||||
|
} \
|
||||||
|
inline amount_t operator*(const T val, const amount_t& amt) { \
|
||||||
|
amount_t temp(val); \
|
||||||
|
temp *= amt; \
|
||||||
|
return temp; \
|
||||||
|
} \
|
||||||
|
inline amount_t operator/(const T val, const amount_t& amt) { \
|
||||||
|
amount_t temp(val); \
|
||||||
|
temp /= amt; \
|
||||||
|
return temp; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
inline bool operator<(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) < amt; \
|
||||||
|
} \
|
||||||
|
inline bool operator<=(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) <= amt; \
|
||||||
|
} \
|
||||||
|
inline bool operator>(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) > amt; \
|
||||||
|
} \
|
||||||
|
inline bool operator>=(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) >= amt; \
|
||||||
|
} \
|
||||||
|
inline bool operator==(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) == amt; \
|
||||||
|
} \
|
||||||
|
inline bool operator!=(const T val, const amount_t& amt) { \
|
||||||
|
return amount_t(val) != amt; \
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
DEFINE_AMOUNT_OPERATORS(long)
|
||||||
inline amount_t operator-(const T val, const amount_t& amt) {
|
DEFINE_AMOUNT_OPERATORS(unsigned long)
|
||||||
amount_t temp(val);
|
DEFINE_AMOUNT_OPERATORS(double)
|
||||||
temp -= amt;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline amount_t operator*(const T val, const amount_t& amt) {
|
|
||||||
amount_t temp(val);
|
|
||||||
temp *= amt;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline amount_t operator/(const T val, const amount_t& amt) {
|
|
||||||
amount_t temp(val);
|
|
||||||
temp /= amt;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator<(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) < amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator<=(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) <= amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator>(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) > amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator>=(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) >= amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator==(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) == amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator!=(const T val, const amount_t& amt) {
|
|
||||||
return amount_t(val) != amt;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, const amount_t& amt) {
|
inline std::ostream& operator<<(std::ostream& out, const amount_t& amt) {
|
||||||
amt.print(out, false, amount_t::full_strings);
|
amt.print(out, false, amount_t::full_strings);
|
||||||
|
|
@ -463,8 +448,8 @@ inline std::istream& operator>>(std::istream& in, amount_t& amt) {
|
||||||
#define COMMODITY_STYLE_NOMARKET 0x0010
|
#define COMMODITY_STYLE_NOMARKET 0x0010
|
||||||
#define COMMODITY_STYLE_BUILTIN 0x0020
|
#define COMMODITY_STYLE_BUILTIN 0x0020
|
||||||
|
|
||||||
typedef std::map<const datetime_t, amount_t> history_map;
|
typedef std::map<const ptime, amount_t> history_map;
|
||||||
typedef std::pair<const datetime_t, amount_t> history_pair;
|
typedef std::pair<const ptime, amount_t> history_pair;
|
||||||
|
|
||||||
class commodity_base_t;
|
class commodity_base_t;
|
||||||
|
|
||||||
|
|
@ -510,23 +495,24 @@ class commodity_base_t
|
||||||
|
|
||||||
struct history_t {
|
struct history_t {
|
||||||
history_map prices;
|
history_map prices;
|
||||||
datetime_t last_lookup;
|
ptime last_lookup;
|
||||||
datetime_t bogus_time;
|
// jww (2007-04-18): What is bogus_time?
|
||||||
history_t() : last_lookup(0), bogus_time(0) {}
|
ptime bogus_time;
|
||||||
|
history_t() : last_lookup(), bogus_time() {}
|
||||||
};
|
};
|
||||||
history_t * history;
|
history_t * history;
|
||||||
|
|
||||||
void add_price(const datetime_t& date, const amount_t& price);
|
void add_price(const ptime& date, const amount_t& price);
|
||||||
bool remove_price(const datetime_t& date);
|
bool remove_price(const ptime& date);
|
||||||
amount_t value(const datetime_t& moment = datetime_t::now);
|
amount_t value(const ptime& moment = now);
|
||||||
|
|
||||||
class updater_t {
|
class updater_t {
|
||||||
public:
|
public:
|
||||||
virtual ~updater_t() {}
|
virtual ~updater_t() {}
|
||||||
virtual void operator()(commodity_base_t& commodity,
|
virtual void operator()(commodity_base_t& commodity,
|
||||||
const datetime_t& moment,
|
const ptime& moment,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const datetime_t& last,
|
const ptime& last,
|
||||||
amount_t& price) = 0;
|
amount_t& price) = 0;
|
||||||
};
|
};
|
||||||
friend class updater_t;
|
friend class updater_t;
|
||||||
|
|
@ -657,13 +643,13 @@ class commodity_t
|
||||||
return base->history;
|
return base->history;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_price(const datetime_t& date, const amount_t& price) {
|
void add_price(const ptime& date, const amount_t& price) {
|
||||||
return base->add_price(date, price);
|
return base->add_price(date, price);
|
||||||
}
|
}
|
||||||
bool remove_price(const datetime_t& date) {
|
bool remove_price(const ptime& date) {
|
||||||
return base->remove_price(date);
|
return base->remove_price(date);
|
||||||
}
|
}
|
||||||
amount_t value(const datetime_t& moment = datetime_t::now) const {
|
amount_t value(const ptime& moment = now) const {
|
||||||
return base->value(moment);
|
return base->value(moment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -676,7 +662,7 @@ class annotated_commodity_t : public commodity_t
|
||||||
const commodity_t * ptr;
|
const commodity_t * ptr;
|
||||||
|
|
||||||
amount_t price;
|
amount_t price;
|
||||||
datetime_t date;
|
ptime date;
|
||||||
std::string tag;
|
std::string tag;
|
||||||
|
|
||||||
explicit annotated_commodity_t() {
|
explicit annotated_commodity_t() {
|
||||||
|
|
@ -692,19 +678,19 @@ class annotated_commodity_t : public commodity_t
|
||||||
|
|
||||||
static void write_annotations(std::ostream& out,
|
static void write_annotations(std::ostream& out,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag);
|
const std::string& tag);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static commodity_t * create(const commodity_t& comm,
|
static commodity_t * create(const commodity_t& comm,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag,
|
const std::string& tag,
|
||||||
const std::string& mapping_key);
|
const std::string& mapping_key);
|
||||||
|
|
||||||
static commodity_t * find_or_create(const commodity_t& comm,
|
static commodity_t * find_or_create(const commodity_t& comm,
|
||||||
const amount_t& price,
|
const amount_t& price,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const std::string& tag);
|
const std::string& tag);
|
||||||
|
|
||||||
friend class amount_t;
|
friend class amount_t;
|
||||||
|
|
|
||||||
13
balance.cc
13
balance.cc
|
|
@ -33,7 +33,7 @@ amount_t balance_t::amount(const commodity_t& commodity) const
|
||||||
return amount_t();
|
return amount_t();
|
||||||
}
|
}
|
||||||
|
|
||||||
balance_t balance_t::value(const datetime_t& moment) const
|
balance_t balance_t::value(const ptime& moment) const
|
||||||
{
|
{
|
||||||
balance_t temp;
|
balance_t temp;
|
||||||
|
|
||||||
|
|
@ -57,20 +57,19 @@ balance_t balance_t::price() const
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t balance_t::date() const
|
ptime balance_t::date() const
|
||||||
{
|
{
|
||||||
datetime_t temp;
|
ptime temp;
|
||||||
|
|
||||||
for (amounts_map::const_iterator i = amounts.begin();
|
for (amounts_map::const_iterator i = amounts.begin();
|
||||||
i != amounts.end();
|
i != amounts.end();
|
||||||
i++) {
|
i++) {
|
||||||
datetime_t tdate = (*i).second.date();
|
ptime tdate = (*i).second.date();
|
||||||
if (! temp && tdate)
|
if (temp.is_not_a_date_time() && ! tdate.is_not_a_date_time())
|
||||||
temp = tdate;
|
temp = tdate;
|
||||||
else if (temp != tdate)
|
else if (temp != tdate)
|
||||||
return datetime_t();
|
return ptime();
|
||||||
}
|
}
|
||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -430,9 +430,9 @@ class balance_t
|
||||||
|
|
||||||
amount_t amount(const commodity_t& commodity =
|
amount_t amount(const commodity_t& commodity =
|
||||||
*commodity_t::null_commodity) const;
|
*commodity_t::null_commodity) const;
|
||||||
balance_t value(const datetime_t& moment = datetime_t::now) const;
|
balance_t value(const ptime& moment = now) const;
|
||||||
balance_t price() const;
|
balance_t price() const;
|
||||||
datetime_t date() const;
|
ptime date() const;
|
||||||
|
|
||||||
balance_t
|
balance_t
|
||||||
strip_annotations(const bool keep_price = amount_t::keep_price,
|
strip_annotations(const bool keep_price = amount_t::keep_price,
|
||||||
|
|
@ -880,13 +880,13 @@ class balance_pair_t
|
||||||
*commodity_t::null_commodity) const {
|
*commodity_t::null_commodity) const {
|
||||||
return quantity.amount(commodity);
|
return quantity.amount(commodity);
|
||||||
}
|
}
|
||||||
balance_t value(const datetime_t& moment = datetime_t::now) const {
|
balance_t value(const ptime& moment = now) const {
|
||||||
return quantity.value(moment);
|
return quantity.value(moment);
|
||||||
}
|
}
|
||||||
balance_t price() const {
|
balance_t price() const {
|
||||||
return quantity.price();
|
return quantity.price();
|
||||||
}
|
}
|
||||||
datetime_t date() const {
|
ptime date() const {
|
||||||
return quantity.date();
|
return quantity.date();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ inline void read_binary_value(char *& data, value_t& val)
|
||||||
read_binary_long(data, *((long *) val.data));
|
read_binary_long(data, *((long *) val.data));
|
||||||
break;
|
break;
|
||||||
case value_t::DATETIME:
|
case value_t::DATETIME:
|
||||||
read_binary_number(data, *((datetime_t *) val.data));
|
read_binary_number(data, *((ptime *) val.data));
|
||||||
break;
|
break;
|
||||||
case value_t::AMOUNT:
|
case value_t::AMOUNT:
|
||||||
read_binary_amount(data, *((amount_t *) val.data));
|
read_binary_amount(data, *((amount_t *) val.data));
|
||||||
|
|
@ -281,7 +281,7 @@ inline void read_binary_commodity_base_extra(char *& data,
|
||||||
for (unsigned long i = 0, count = read_binary_long<unsigned long>(data);
|
for (unsigned long i = 0, count = read_binary_long<unsigned long>(data);
|
||||||
i < count;
|
i < count;
|
||||||
i++) {
|
i++) {
|
||||||
datetime_t when;
|
ptime when;
|
||||||
read_binary_number(data, when);
|
read_binary_number(data, when);
|
||||||
amount_t amt;
|
amount_t amt;
|
||||||
read_binary_amount(data, amt);
|
read_binary_amount(data, amt);
|
||||||
|
|
@ -661,7 +661,7 @@ void write_binary_value(std::ostream& out, const value_t& val)
|
||||||
write_binary_long(out, *((long *) val.data));
|
write_binary_long(out, *((long *) val.data));
|
||||||
break;
|
break;
|
||||||
case value_t::DATETIME:
|
case value_t::DATETIME:
|
||||||
write_binary_number(out, *((datetime_t *) val.data));
|
write_binary_number(out, *((ptime *) val.data));
|
||||||
break;
|
break;
|
||||||
case value_t::AMOUNT:
|
case value_t::AMOUNT:
|
||||||
write_binary_amount(out, *((amount_t *) val.data));
|
write_binary_amount(out, *((amount_t *) val.data));
|
||||||
|
|
|
||||||
191
configure
vendored
191
configure
vendored
|
|
@ -875,10 +875,6 @@ LIBTOOL
|
||||||
EMACS
|
EMACS
|
||||||
EMACSLOADPATH
|
EMACSLOADPATH
|
||||||
lispdir
|
lispdir
|
||||||
HAVE_GMP_TRUE
|
|
||||||
HAVE_GMP_FALSE
|
|
||||||
HAVE_PCRE_TRUE
|
|
||||||
HAVE_PCRE_FALSE
|
|
||||||
USE_XML_TRUE
|
USE_XML_TRUE
|
||||||
USE_XML_FALSE
|
USE_XML_FALSE
|
||||||
HAVE_EXPAT_TRUE
|
HAVE_EXPAT_TRUE
|
||||||
|
|
@ -4852,7 +4848,7 @@ ia64-*-hpux*)
|
||||||
;;
|
;;
|
||||||
*-*-irix6*)
|
*-*-irix6*)
|
||||||
# Find out which ABI we are using.
|
# Find out which ABI we are using.
|
||||||
echo '#line 4855 "configure"' > conftest.$ac_ext
|
echo '#line 4851 "configure"' > conftest.$ac_ext
|
||||||
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
|
||||||
(eval $ac_compile) 2>&5
|
(eval $ac_compile) 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
|
|
@ -7111,11 +7107,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:7114: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:7110: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:7118: \$? = $ac_status" >&5
|
echo "$as_me:7114: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -7379,11 +7375,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:7382: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:7378: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:7386: \$? = $ac_status" >&5
|
echo "$as_me:7382: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -7483,11 +7479,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:7486: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:7482: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:7490: \$? = $ac_status" >&5
|
echo "$as_me:7486: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
|
@ -9791,7 +9787,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 9794 "configure"
|
#line 9790 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
|
@ -9891,7 +9887,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 9894 "configure"
|
#line 9890 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
|
@ -12227,11 +12223,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:12230: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:12226: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:12234: \$? = $ac_status" >&5
|
echo "$as_me:12230: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -12331,11 +12327,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:12334: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:12330: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:12338: \$? = $ac_status" >&5
|
echo "$as_me:12334: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
|
@ -13901,11 +13897,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:13904: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:13900: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:13908: \$? = $ac_status" >&5
|
echo "$as_me:13904: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -14005,11 +14001,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:14008: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:14004: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:14012: \$? = $ac_status" >&5
|
echo "$as_me:14008: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
|
@ -16203,11 +16199,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:16206: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:16202: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:16210: \$? = $ac_status" >&5
|
echo "$as_me:16206: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -16471,11 +16467,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:16474: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:16470: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>conftest.err)
|
(eval "$lt_compile" 2>conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat conftest.err >&5
|
cat conftest.err >&5
|
||||||
echo "$as_me:16478: \$? = $ac_status" >&5
|
echo "$as_me:16474: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s "$ac_outfile"; then
|
if (exit $ac_status) && test -s "$ac_outfile"; then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
# So say no if there are warnings other than the usual output.
|
# So say no if there are warnings other than the usual output.
|
||||||
|
|
@ -16575,11 +16571,11 @@ else
|
||||||
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
|
||||||
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
|
||||||
-e 's:$: $lt_compiler_flag:'`
|
-e 's:$: $lt_compiler_flag:'`
|
||||||
(eval echo "\"\$as_me:16578: $lt_compile\"" >&5)
|
(eval echo "\"\$as_me:16574: $lt_compile\"" >&5)
|
||||||
(eval "$lt_compile" 2>out/conftest.err)
|
(eval "$lt_compile" 2>out/conftest.err)
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
cat out/conftest.err >&5
|
cat out/conftest.err >&5
|
||||||
echo "$as_me:16582: \$? = $ac_status" >&5
|
echo "$as_me:16578: \$? = $ac_status" >&5
|
||||||
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
if (exit $ac_status) && test -s out/conftest2.$ac_objext
|
||||||
then
|
then
|
||||||
# The compiler can only warn and ignore the option if not recognized
|
# The compiler can only warn and ignore the option if not recognized
|
||||||
|
|
@ -19503,14 +19499,6 @@ fi
|
||||||
echo "${ECHO_T}$libgmp_avail" >&6; }
|
echo "${ECHO_T}$libgmp_avail" >&6; }
|
||||||
|
|
||||||
if test x$libgmp_avail = xtrue ; then
|
if test x$libgmp_avail = xtrue ; then
|
||||||
if true; then
|
|
||||||
HAVE_GMP_TRUE=
|
|
||||||
HAVE_GMP_FALSE='#'
|
|
||||||
else
|
|
||||||
HAVE_GMP_TRUE='#'
|
|
||||||
HAVE_GMP_FALSE=
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBS="-lgmp $LIBS"
|
LIBS="-lgmp $LIBS"
|
||||||
else
|
else
|
||||||
{ { echo "$as_me:$LINENO: error: \"Could not find gmp library (set CPPFLAGS and LDFLAGS?)\"
|
{ { echo "$as_me:$LINENO: error: \"Could not find gmp library (set CPPFLAGS and LDFLAGS?)\"
|
||||||
|
|
@ -19589,14 +19577,6 @@ fi
|
||||||
echo "${ECHO_T}$libpcre_avail" >&6; }
|
echo "${ECHO_T}$libpcre_avail" >&6; }
|
||||||
|
|
||||||
if test x$libpcre_avail = xtrue ; then
|
if test x$libpcre_avail = xtrue ; then
|
||||||
if true; then
|
|
||||||
HAVE_PCRE_TRUE=
|
|
||||||
HAVE_PCRE_FALSE='#'
|
|
||||||
else
|
|
||||||
HAVE_PCRE_TRUE='#'
|
|
||||||
HAVE_PCRE_FALSE=
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBS="-lpcre $LIBS"
|
LIBS="-lpcre $LIBS"
|
||||||
else
|
else
|
||||||
{ { echo "$as_me:$LINENO: error: \"Could not find pcre library (set CPPFLAGS and LDFLAGS?)\"
|
{ { echo "$as_me:$LINENO: error: \"Could not find pcre library (set CPPFLAGS and LDFLAGS?)\"
|
||||||
|
|
@ -19606,6 +19586,102 @@ See \`config.log' for more details." >&2;}
|
||||||
{ (exit 1); exit 1; }; }
|
{ (exit 1); exit 1; }; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check for Boost date_time
|
||||||
|
{ echo "$as_me:$LINENO: checking if boost_date_time is available" >&5
|
||||||
|
echo $ECHO_N "checking if boost_date_time is available... $ECHO_C" >&6; }
|
||||||
|
if test "${boost_date_time_cpplib_avail+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
boost_date_time_save_libs=$LIBS
|
||||||
|
LIBS="-lboost_date_time $LIBS"
|
||||||
|
ac_ext=cpp
|
||||||
|
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||||
|
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||||
|
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||||
|
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||||
|
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||||
|
#include <boost/date_time/local_time_adjustor.hpp>
|
||||||
|
#include <boost/date_time/time_duration.hpp>
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
using namespace boost::date_time;
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
inline ptime time_to_system_local(const ptime& when) {
|
||||||
|
struct std::tm tm_gmt = to_tm(when);
|
||||||
|
return from_time_t(mktime(&tm_gmt));
|
||||||
|
}
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
ptime t10 = ptime(boost::gregorian::from_string("2007-01-15"),
|
||||||
|
ptime::time_duration_type());
|
||||||
|
|
||||||
|
ptime t12 = time_to_system_local(t10);
|
||||||
|
|
||||||
|
return t10 != t12;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (ac_try="$ac_link"
|
||||||
|
case "(($ac_try" in
|
||||||
|
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
*) ac_try_echo=$ac_try;;
|
||||||
|
esac
|
||||||
|
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||||
|
(eval "$ac_link") 2>conftest.er1
|
||||||
|
ac_status=$?
|
||||||
|
grep -v '^ *+' conftest.er1 >conftest.err
|
||||||
|
rm -f conftest.er1
|
||||||
|
cat conftest.err >&5
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } && {
|
||||||
|
test -z "$ac_cxx_werror_flag" ||
|
||||||
|
test ! -s conftest.err
|
||||||
|
} && test -s conftest$ac_exeext &&
|
||||||
|
$as_test_x conftest$ac_exeext; then
|
||||||
|
boost_date_time_cpplib_avail=true
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
boost_date_time_cpplib_avail=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
ac_ext=c
|
||||||
|
ac_cpp='$CPP $CPPFLAGS'
|
||||||
|
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||||
|
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||||
|
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
|
|
||||||
|
LIBS=$boost_date_time_save_libs
|
||||||
|
fi
|
||||||
|
{ echo "$as_me:$LINENO: result: $boost_date_time_cpplib_avail" >&5
|
||||||
|
echo "${ECHO_T}$boost_date_time_cpplib_avail" >&6; }
|
||||||
|
|
||||||
|
if test x$boost_date_time_cpplib_avail = xtrue ; then
|
||||||
|
LIBS="-lboost_date_time $LIBS"
|
||||||
|
else
|
||||||
|
{ { echo "$as_me:$LINENO: error: \"Could not find boost_date_time library (set CPPFLAGS and LDFLAGS?)\"
|
||||||
|
See \`config.log' for more details." >&5
|
||||||
|
echo "$as_me: error: \"Could not find boost_date_time library (set CPPFLAGS and LDFLAGS?)\"
|
||||||
|
See \`config.log' for more details." >&2;}
|
||||||
|
{ (exit 1); exit 1; }; }
|
||||||
|
fi
|
||||||
|
|
||||||
# check for expat or xmlparse
|
# check for expat or xmlparse
|
||||||
# Check whether --enable-xml was given.
|
# Check whether --enable-xml was given.
|
||||||
if test "${enable_xml+set}" = set; then
|
if test "${enable_xml+set}" = set; then
|
||||||
|
|
@ -19620,6 +19696,7 @@ else
|
||||||
xml=true
|
xml=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test x$xml = xtrue; then
|
if test x$xml = xtrue; then
|
||||||
USE_XML_TRUE=
|
USE_XML_TRUE=
|
||||||
USE_XML_FALSE='#'
|
USE_XML_FALSE='#'
|
||||||
|
|
@ -19860,6 +19937,7 @@ else
|
||||||
ofx=true
|
ofx=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test x$ofx = xtrue; then
|
if test x$ofx = xtrue; then
|
||||||
USE_OFX_TRUE=
|
USE_OFX_TRUE=
|
||||||
USE_OFX_FALSE='#'
|
USE_OFX_FALSE='#'
|
||||||
|
|
@ -19982,6 +20060,7 @@ else
|
||||||
python=false
|
python=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test x$python = xtrue; then
|
if test x$python = xtrue; then
|
||||||
USE_PYTHON_TRUE=
|
USE_PYTHON_TRUE=
|
||||||
USE_PYTHON_FALSE='#'
|
USE_PYTHON_FALSE='#'
|
||||||
|
|
@ -20248,6 +20327,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
fi
|
fi
|
||||||
{ echo "$as_me:$LINENO: result: $boost_python_cpplib_avail" >&5
|
{ echo "$as_me:$LINENO: result: $boost_python_cpplib_avail" >&5
|
||||||
echo "${ECHO_T}$boost_python_cpplib_avail" >&6; }
|
echo "${ECHO_T}$boost_python_cpplib_avail" >&6; }
|
||||||
|
|
||||||
if test x$boost_python_cpplib_avail = xtrue ; then
|
if test x$boost_python_cpplib_avail = xtrue ; then
|
||||||
if true; then
|
if true; then
|
||||||
HAVE_BOOST_PYTHON_TRUE=
|
HAVE_BOOST_PYTHON_TRUE=
|
||||||
|
|
@ -20303,6 +20383,7 @@ else
|
||||||
debug=false
|
debug=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if test x$debug = xtrue; then
|
if test x$debug = xtrue; then
|
||||||
DEBUG_TRUE=
|
DEBUG_TRUE=
|
||||||
DEBUG_FALSE='#'
|
DEBUG_FALSE='#'
|
||||||
|
|
@ -21126,9 +21207,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for ac_func in access mktime realpath getpwuid getpwnam
|
||||||
|
|
||||||
for ac_func in access mktime realpath strftime strptime getpwuid getpwnam
|
|
||||||
do
|
do
|
||||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
|
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
|
|
@ -21341,20 +21420,6 @@ echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
|
||||||
Usually this means the macro was only invoked conditionally." >&2;}
|
Usually this means the macro was only invoked conditionally." >&2;}
|
||||||
{ (exit 1); exit 1; }; }
|
{ (exit 1); exit 1; }; }
|
||||||
fi
|
fi
|
||||||
if test -z "${HAVE_GMP_TRUE}" && test -z "${HAVE_GMP_FALSE}"; then
|
|
||||||
{ { echo "$as_me:$LINENO: error: conditional \"HAVE_GMP\" was never defined.
|
|
||||||
Usually this means the macro was only invoked conditionally." >&5
|
|
||||||
echo "$as_me: error: conditional \"HAVE_GMP\" was never defined.
|
|
||||||
Usually this means the macro was only invoked conditionally." >&2;}
|
|
||||||
{ (exit 1); exit 1; }; }
|
|
||||||
fi
|
|
||||||
if test -z "${HAVE_PCRE_TRUE}" && test -z "${HAVE_PCRE_FALSE}"; then
|
|
||||||
{ { echo "$as_me:$LINENO: error: conditional \"HAVE_PCRE\" was never defined.
|
|
||||||
Usually this means the macro was only invoked conditionally." >&5
|
|
||||||
echo "$as_me: error: conditional \"HAVE_PCRE\" was never defined.
|
|
||||||
Usually this means the macro was only invoked conditionally." >&2;}
|
|
||||||
{ (exit 1); exit 1; }; }
|
|
||||||
fi
|
|
||||||
if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then
|
if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then
|
||||||
{ { echo "$as_me:$LINENO: error: conditional \"USE_XML\" was never defined.
|
{ { echo "$as_me:$LINENO: error: conditional \"USE_XML\" was never defined.
|
||||||
Usually this means the macro was only invoked conditionally." >&5
|
Usually this means the macro was only invoked conditionally." >&5
|
||||||
|
|
@ -22159,10 +22224,6 @@ LIBTOOL!$LIBTOOL$ac_delim
|
||||||
EMACS!$EMACS$ac_delim
|
EMACS!$EMACS$ac_delim
|
||||||
EMACSLOADPATH!$EMACSLOADPATH$ac_delim
|
EMACSLOADPATH!$EMACSLOADPATH$ac_delim
|
||||||
lispdir!$lispdir$ac_delim
|
lispdir!$lispdir$ac_delim
|
||||||
HAVE_GMP_TRUE!$HAVE_GMP_TRUE$ac_delim
|
|
||||||
HAVE_GMP_FALSE!$HAVE_GMP_FALSE$ac_delim
|
|
||||||
HAVE_PCRE_TRUE!$HAVE_PCRE_TRUE$ac_delim
|
|
||||||
HAVE_PCRE_FALSE!$HAVE_PCRE_FALSE$ac_delim
|
|
||||||
USE_XML_TRUE!$USE_XML_TRUE$ac_delim
|
USE_XML_TRUE!$USE_XML_TRUE$ac_delim
|
||||||
USE_XML_FALSE!$USE_XML_FALSE$ac_delim
|
USE_XML_FALSE!$USE_XML_FALSE$ac_delim
|
||||||
HAVE_EXPAT_TRUE!$HAVE_EXPAT_TRUE$ac_delim
|
HAVE_EXPAT_TRUE!$HAVE_EXPAT_TRUE$ac_delim
|
||||||
|
|
@ -22192,7 +22253,7 @@ LIBOBJS!$LIBOBJS$ac_delim
|
||||||
LTLIBOBJS!$LTLIBOBJS$ac_delim
|
LTLIBOBJS!$LTLIBOBJS$ac_delim
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 39; then
|
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 35; then
|
||||||
break
|
break
|
||||||
elif $ac_last_try; then
|
elif $ac_last_try; then
|
||||||
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
|
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
|
||||||
|
|
|
||||||
48
configure.in
48
configure.in
|
|
@ -77,7 +77,6 @@ AC_CACHE_CHECK(
|
||||||
LIBS=$libgmp_save_libs])
|
LIBS=$libgmp_save_libs])
|
||||||
|
|
||||||
if [test x$libgmp_avail = xtrue ]; then
|
if [test x$libgmp_avail = xtrue ]; then
|
||||||
AM_CONDITIONAL(HAVE_GMP, true)
|
|
||||||
LIBS="-lgmp $LIBS"
|
LIBS="-lgmp $LIBS"
|
||||||
else
|
else
|
||||||
AC_MSG_FAILURE("Could not find gmp library (set CPPFLAGS and LDFLAGS?)")
|
AC_MSG_FAILURE("Could not find gmp library (set CPPFLAGS and LDFLAGS?)")
|
||||||
|
|
@ -99,12 +98,50 @@ AC_CACHE_CHECK(
|
||||||
LIBS=$libpcre_save_libs])
|
LIBS=$libpcre_save_libs])
|
||||||
|
|
||||||
if [test x$libpcre_avail = xtrue ]; then
|
if [test x$libpcre_avail = xtrue ]; then
|
||||||
AM_CONDITIONAL(HAVE_PCRE, true)
|
|
||||||
LIBS="-lpcre $LIBS"
|
LIBS="-lpcre $LIBS"
|
||||||
else
|
else
|
||||||
AC_MSG_FAILURE("Could not find pcre library (set CPPFLAGS and LDFLAGS?)")
|
AC_MSG_FAILURE("Could not find pcre library (set CPPFLAGS and LDFLAGS?)")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check for Boost date_time
|
||||||
|
AC_CACHE_CHECK(
|
||||||
|
[if boost_date_time is available],
|
||||||
|
[boost_date_time_cpplib_avail],
|
||||||
|
[boost_date_time_save_libs=$LIBS
|
||||||
|
LIBS="-lboost_date_time $LIBS"
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_TRY_LINK(
|
||||||
|
[#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||||
|
#include <boost/date_time/local_time_adjustor.hpp>
|
||||||
|
#include <boost/date_time/time_duration.hpp>
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
using namespace boost::date_time;
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
inline ptime time_to_system_local(const ptime& when) {
|
||||||
|
struct std::tm tm_gmt = to_tm(when);
|
||||||
|
return from_time_t(mktime(&tm_gmt));
|
||||||
|
}],
|
||||||
|
[ptime t10 = ptime(boost::gregorian::from_string("2007-01-15"),
|
||||||
|
ptime::time_duration_type());
|
||||||
|
|
||||||
|
ptime t12 = time_to_system_local(t10);
|
||||||
|
|
||||||
|
return t10 != t12;],
|
||||||
|
[boost_date_time_cpplib_avail=true],
|
||||||
|
[boost_date_time_cpplib_avail=false])
|
||||||
|
AC_LANG_POP
|
||||||
|
LIBS=$boost_date_time_save_libs])
|
||||||
|
|
||||||
|
if [test x$boost_date_time_cpplib_avail = xtrue ]; then
|
||||||
|
LIBS="-lboost_date_time $LIBS"
|
||||||
|
else
|
||||||
|
AC_MSG_FAILURE("Could not find boost_date_time library (set CPPFLAGS and LDFLAGS?)")
|
||||||
|
fi
|
||||||
|
|
||||||
# check for expat or xmlparse
|
# check for expat or xmlparse
|
||||||
AC_ARG_ENABLE(xml,
|
AC_ARG_ENABLE(xml,
|
||||||
[ --enable-xml Turn on support for XML parsing],
|
[ --enable-xml Turn on support for XML parsing],
|
||||||
|
|
@ -113,6 +150,7 @@ AC_ARG_ENABLE(xml,
|
||||||
no) xml=false ;;
|
no) xml=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-xml) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-xml) ;;
|
||||||
esac],[xml=true])
|
esac],[xml=true])
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_XML, test x$xml = xtrue)
|
AM_CONDITIONAL(USE_XML, test x$xml = xtrue)
|
||||||
|
|
||||||
if [test x$xml = xtrue ]; then
|
if [test x$xml = xtrue ]; then
|
||||||
|
|
@ -185,6 +223,7 @@ AC_ARG_ENABLE(ofx,
|
||||||
no) ofx=false ;;
|
no) ofx=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-ofx) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-ofx) ;;
|
||||||
esac],[ofx=true])
|
esac],[ofx=true])
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_OFX, test x$ofx = xtrue)
|
AM_CONDITIONAL(USE_OFX, test x$ofx = xtrue)
|
||||||
|
|
||||||
if [test x$ofx = xtrue ]; then
|
if [test x$ofx = xtrue ]; then
|
||||||
|
|
@ -220,6 +259,7 @@ AC_ARG_ENABLE(python,
|
||||||
no) python=false ;;
|
no) python=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-python) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-python) ;;
|
||||||
esac],[python=false])
|
esac],[python=false])
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_PYTHON, test x$python = xtrue)
|
AM_CONDITIONAL(USE_PYTHON, test x$python = xtrue)
|
||||||
|
|
||||||
if [test x$python = xtrue ]; then
|
if [test x$python = xtrue ]; then
|
||||||
|
|
@ -243,6 +283,7 @@ if [test x$python = xtrue ]; then
|
||||||
[boost_python_cpplib_avail=false])
|
[boost_python_cpplib_avail=false])
|
||||||
AC_LANG_POP
|
AC_LANG_POP
|
||||||
LIBS=$boost_python_save_libs])
|
LIBS=$boost_python_save_libs])
|
||||||
|
|
||||||
if [test x$boost_python_cpplib_avail = xtrue ]; then
|
if [test x$boost_python_cpplib_avail = xtrue ]; then
|
||||||
AM_CONDITIONAL(HAVE_BOOST_PYTHON, true)
|
AM_CONDITIONAL(HAVE_BOOST_PYTHON, true)
|
||||||
LIBS="-lboost_python -lpython$PYTHON_VERSION $LIBS"
|
LIBS="-lboost_python -lpython$PYTHON_VERSION $LIBS"
|
||||||
|
|
@ -264,6 +305,7 @@ AC_ARG_ENABLE(debug,
|
||||||
no) debug=false ;;
|
no) debug=false ;;
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
|
||||||
esac],[debug=false])
|
esac],[debug=false])
|
||||||
|
|
||||||
AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
|
AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
|
|
@ -278,7 +320,7 @@ AC_STRUCT_TM
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
#AC_FUNC_ERROR_AT_LINE
|
#AC_FUNC_ERROR_AT_LINE
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_FUNCS([access mktime realpath strftime strptime getpwuid getpwnam])
|
AC_CHECK_FUNCS([access mktime realpath getpwuid getpwnam])
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile])
|
AC_CONFIG_FILES([Makefile])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
|
||||||
575
datetime.cc
575
datetime.cc
|
|
@ -1,575 +0,0 @@
|
||||||
#if defined(__GNUG__) && __GNUG__ < 3
|
|
||||||
#define _XOPEN_SOURCE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "datetime.h"
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
#include <ctime>
|
|
||||||
#include <cctype>
|
|
||||||
|
|
||||||
date_t date_t::now(std::time(NULL));
|
|
||||||
int date_t::current_year = date_t::now.year();
|
|
||||||
std::string date_t::input_format;
|
|
||||||
std::string date_t::output_format = "%Y/%m/%d";
|
|
||||||
|
|
||||||
const char * date_t::formats[] = {
|
|
||||||
"%Y/%m/%d",
|
|
||||||
"%m/%d",
|
|
||||||
"%Y.%m.%d",
|
|
||||||
"%m.%d",
|
|
||||||
"%Y-%m-%d",
|
|
||||||
"%m-%d",
|
|
||||||
"%a",
|
|
||||||
"%A",
|
|
||||||
"%b",
|
|
||||||
"%B",
|
|
||||||
"%Y",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
datetime_t datetime_t::now(std::time(NULL));
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
#if 0
|
|
||||||
static std::time_t base = -1;
|
|
||||||
static int base_year = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const int month_days[12] = {
|
|
||||||
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
||||||
};
|
|
||||||
|
|
||||||
bool parse_date_mask(const char * date_str, struct std::tm * result)
|
|
||||||
{
|
|
||||||
if (! date_t::input_format.empty()) {
|
|
||||||
std::memset(result, INT_MAX, sizeof(struct std::tm));
|
|
||||||
if (strptime(date_str, date_t::input_format.c_str(), result))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (const char ** f = date_t::formats; *f; f++) {
|
|
||||||
std::memset(result, INT_MAX, sizeof(struct std::tm));
|
|
||||||
if (strptime(date_str, *f, result))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool parse_date(const char * date_str, std::time_t * result, const int year)
|
|
||||||
{
|
|
||||||
struct std::tm when;
|
|
||||||
|
|
||||||
if (! parse_date_mask(date_str, &when))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
when.tm_hour = 0;
|
|
||||||
when.tm_min = 0;
|
|
||||||
when.tm_sec = 0;
|
|
||||||
|
|
||||||
if (when.tm_year == -1)
|
|
||||||
when.tm_year = ((year == -1) ? date_t::current_year : (year - 1900));
|
|
||||||
|
|
||||||
if (when.tm_mon == -1)
|
|
||||||
when.tm_mon = 0;
|
|
||||||
|
|
||||||
if (when.tm_mday == -1)
|
|
||||||
when.tm_mday = 1;
|
|
||||||
|
|
||||||
*result = std::mktime(&when);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool quick_parse_date(const char * date_str, std::time_t * result)
|
|
||||||
{
|
|
||||||
return parse_date(date_str, result, date_t::current_year + 1900);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
date_t::date_t(const std::string& _when)
|
|
||||||
{
|
|
||||||
if (! quick_parse_date(_when.c_str(), &when))
|
|
||||||
throw new date_error
|
|
||||||
(std::string("Invalid date string: ") + _when);
|
|
||||||
}
|
|
||||||
|
|
||||||
void date_t::parse(std::istream& in)
|
|
||||||
{
|
|
||||||
char buf[256];
|
|
||||||
char c = peek_next_nonws(in);
|
|
||||||
READ_INTO(in, buf, 255, c,
|
|
||||||
std::isalnum(c) || c == '-' || c == '.' || c == '/');
|
|
||||||
|
|
||||||
if (! quick_parse_date(buf, &when))
|
|
||||||
throw new date_error
|
|
||||||
(std::string("Invalid date string: ") + buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
datetime_t::datetime_t(const std::string& _when)
|
|
||||||
{
|
|
||||||
std::istringstream datestr(_when);
|
|
||||||
parse(datestr); // parse both the date and optional time
|
|
||||||
}
|
|
||||||
|
|
||||||
void datetime_t::parse(std::istream& in)
|
|
||||||
{
|
|
||||||
date_t::parse(in); // first grab the date part
|
|
||||||
|
|
||||||
istream_pos_type beg_pos = in.tellg();
|
|
||||||
|
|
||||||
int thour = 0;
|
|
||||||
int tmin = 0;
|
|
||||||
int tsec = 0;
|
|
||||||
|
|
||||||
// Now look for the (optional) time specifier. If no time is given,
|
|
||||||
// we use midnight of the given day.
|
|
||||||
char buf[256];
|
|
||||||
char c = peek_next_nonws(in);
|
|
||||||
if (! std::isdigit(c))
|
|
||||||
goto abort;
|
|
||||||
READ_INTO(in, buf, 255, c, std::isdigit(c));
|
|
||||||
if (buf[0] == '\0')
|
|
||||||
goto abort;
|
|
||||||
|
|
||||||
thour = std::atoi(buf);
|
|
||||||
if (thour > 23)
|
|
||||||
goto abort;
|
|
||||||
|
|
||||||
if (in.peek() == ':') {
|
|
||||||
in.get(c);
|
|
||||||
READ_INTO(in, buf, 255, c, std::isdigit(c));
|
|
||||||
if (buf[0] == '\0')
|
|
||||||
goto abort;
|
|
||||||
|
|
||||||
tmin = std::atoi(buf);
|
|
||||||
if (tmin > 59)
|
|
||||||
goto abort;
|
|
||||||
|
|
||||||
if (in.peek() == ':') {
|
|
||||||
in.get(c);
|
|
||||||
READ_INTO(in, buf, 255, c, std::isdigit(c));
|
|
||||||
if (buf[0] == '\0')
|
|
||||||
goto abort;
|
|
||||||
|
|
||||||
tsec = std::atoi(buf);
|
|
||||||
if (tsec > 59)
|
|
||||||
goto abort;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c = peek_next_nonws(in);
|
|
||||||
if (c == 'a' || c == 'p' || c == 'A' || c == 'P') {
|
|
||||||
if (thour > 12)
|
|
||||||
goto abort;
|
|
||||||
in.get(c);
|
|
||||||
|
|
||||||
if (c == 'p' || c == 'P') {
|
|
||||||
if (thour != 12)
|
|
||||||
thour += 12;
|
|
||||||
} else {
|
|
||||||
if (thour == 12)
|
|
||||||
thour = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = in.peek();
|
|
||||||
if (c == 'm' || c == 'M')
|
|
||||||
in.get(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct std::tm * desc = std::localtime(&when);
|
|
||||||
|
|
||||||
desc->tm_hour = thour;
|
|
||||||
desc->tm_min = tmin;
|
|
||||||
desc->tm_sec = tsec;
|
|
||||||
desc->tm_isdst = -1;
|
|
||||||
|
|
||||||
when = std::mktime(desc);
|
|
||||||
|
|
||||||
return; // the time has been successfully parsed
|
|
||||||
|
|
||||||
abort: // there was no valid time string to parse
|
|
||||||
in.clear();
|
|
||||||
in.seekg(beg_pos, std::ios::beg);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const datetime_t& moment)
|
|
||||||
{
|
|
||||||
std::string format = datetime_t::output_format;
|
|
||||||
std::tm * when = moment.localtime();
|
|
||||||
if (when->tm_hour != 0 || when->tm_min != 0 || when->tm_sec != 0)
|
|
||||||
format += " %H:%M:%S";
|
|
||||||
|
|
||||||
char buf[64];
|
|
||||||
std::strftime(buf, 63, format.c_str(), when);
|
|
||||||
out << buf;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
datetime_t interval_t::first(const datetime_t& moment) const
|
|
||||||
{
|
|
||||||
datetime_t quant(begin);
|
|
||||||
|
|
||||||
if (moment && moment > quant) {
|
|
||||||
// Find an efficient starting point for the upcoming while loop.
|
|
||||||
// We want a date early enough that the range will be correct, but
|
|
||||||
// late enough that we don't spend hundreds of thousands of loops
|
|
||||||
// skipping through time.
|
|
||||||
|
|
||||||
struct std::tm * desc = std::localtime(&moment.when);
|
|
||||||
|
|
||||||
if (years)
|
|
||||||
desc->tm_mon = 0;
|
|
||||||
desc->tm_mday = 1;
|
|
||||||
|
|
||||||
desc->tm_hour = 0;
|
|
||||||
desc->tm_min = 0;
|
|
||||||
desc->tm_sec = 0;
|
|
||||||
desc->tm_isdst = -1;
|
|
||||||
|
|
||||||
quant = std::mktime(desc);
|
|
||||||
|
|
||||||
datetime_t temp;
|
|
||||||
while (moment >= (temp = increment(quant))) {
|
|
||||||
if (quant == temp)
|
|
||||||
break;
|
|
||||||
quant = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return quant;
|
|
||||||
}
|
|
||||||
|
|
||||||
datetime_t interval_t::increment(const datetime_t& moment) const
|
|
||||||
{
|
|
||||||
struct std::tm * desc = std::localtime(&moment.when);
|
|
||||||
|
|
||||||
if (years)
|
|
||||||
desc->tm_year += years;
|
|
||||||
if (months)
|
|
||||||
desc->tm_mon += months;
|
|
||||||
if (days)
|
|
||||||
desc->tm_mon += days;
|
|
||||||
|
|
||||||
desc->tm_hour += hours;
|
|
||||||
desc->tm_min += minutes;
|
|
||||||
desc->tm_sec += seconds;
|
|
||||||
|
|
||||||
desc->tm_isdst = -1;
|
|
||||||
|
|
||||||
return std::mktime(desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
void parse_inclusion_specifier(const std::string& word,
|
|
||||||
datetime_t * begin, datetime_t * end)
|
|
||||||
{
|
|
||||||
struct std::tm when;
|
|
||||||
|
|
||||||
if (! parse_date_mask(word.c_str(), &when))
|
|
||||||
throw new datetime_error(std::string("Could not parse date mask: ") + word);
|
|
||||||
|
|
||||||
when.tm_hour = 0;
|
|
||||||
when.tm_min = 0;
|
|
||||||
when.tm_sec = 0;
|
|
||||||
when.tm_isdst = -1;
|
|
||||||
|
|
||||||
bool saw_year = true;
|
|
||||||
bool saw_mon = true;
|
|
||||||
bool saw_day = true;
|
|
||||||
|
|
||||||
if (when.tm_year == -1) {
|
|
||||||
when.tm_year = date_t::current_year;
|
|
||||||
saw_year = false;
|
|
||||||
}
|
|
||||||
if (when.tm_mon == -1) {
|
|
||||||
when.tm_mon = 0;
|
|
||||||
saw_mon = false;
|
|
||||||
} else {
|
|
||||||
saw_year = false; // don't increment by year if month used
|
|
||||||
}
|
|
||||||
if (when.tm_mday == -1) {
|
|
||||||
when.tm_mday = 1;
|
|
||||||
saw_day = false;
|
|
||||||
} else {
|
|
||||||
saw_mon = false; // don't increment by month if day used
|
|
||||||
saw_year = false; // don't increment by year if day used
|
|
||||||
}
|
|
||||||
|
|
||||||
if (begin) {
|
|
||||||
*begin = std::mktime(&when);
|
|
||||||
if (end)
|
|
||||||
*end = interval_t(saw_day ? 86400 : 0, saw_mon ? 1 : 0,
|
|
||||||
saw_year ? 1 : 0).increment(*begin);
|
|
||||||
}
|
|
||||||
else if (end) {
|
|
||||||
*end = std::mktime(&when);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void read_lower_word(std::istream& in, std::string& word) {
|
|
||||||
in >> word;
|
|
||||||
for (int i = 0, l = word.length(); i < l; i++)
|
|
||||||
word[i] = std::tolower(word[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse_date_words(std::istream& in, std::string& word,
|
|
||||||
datetime_t * begin, datetime_t * end)
|
|
||||||
{
|
|
||||||
std::string type;
|
|
||||||
|
|
||||||
bool mon_spec = false;
|
|
||||||
char buf[32];
|
|
||||||
|
|
||||||
if (word == "this" || word == "last" || word == "next") {
|
|
||||||
type = word;
|
|
||||||
if (! in.eof())
|
|
||||||
read_lower_word(in, word);
|
|
||||||
else
|
|
||||||
word = "month";
|
|
||||||
} else {
|
|
||||||
type = "this";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (word == "month") {
|
|
||||||
std::strftime(buf, 31, "%B", datetime_t::now.localtime());
|
|
||||||
word = buf;
|
|
||||||
mon_spec = true;
|
|
||||||
}
|
|
||||||
else if (word == "year") {
|
|
||||||
std::strftime(buf, 31, "%Y", datetime_t::now.localtime());
|
|
||||||
word = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_inclusion_specifier(word, begin, end);
|
|
||||||
|
|
||||||
if (type == "last") {
|
|
||||||
if (mon_spec) {
|
|
||||||
if (begin)
|
|
||||||
*begin = interval_t(0, -1, 0).increment(*begin);
|
|
||||||
if (end)
|
|
||||||
*end = interval_t(0, -1, 0).increment(*end);
|
|
||||||
} else {
|
|
||||||
if (begin)
|
|
||||||
*begin = interval_t(0, 0, -1).increment(*begin);
|
|
||||||
if (end)
|
|
||||||
*end = interval_t(0, 0, -1).increment(*end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (type == "next") {
|
|
||||||
if (mon_spec) {
|
|
||||||
if (begin)
|
|
||||||
*begin = interval_t(0, 1, 0).increment(*begin);
|
|
||||||
if (end)
|
|
||||||
*end = interval_t(0, 1, 0).increment(*end);
|
|
||||||
} else {
|
|
||||||
if (begin)
|
|
||||||
*begin = interval_t(0, 0, 1).increment(*begin);
|
|
||||||
if (end)
|
|
||||||
*end = interval_t(0, 0, 1).increment(*end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void interval_t::parse(std::istream& in)
|
|
||||||
{
|
|
||||||
std::string word;
|
|
||||||
|
|
||||||
while (! in.eof()) {
|
|
||||||
read_lower_word(in, word);
|
|
||||||
if (word == "every") {
|
|
||||||
read_lower_word(in, word);
|
|
||||||
if (std::isdigit(word[0])) {
|
|
||||||
int quantity = std::atol(word.c_str());
|
|
||||||
read_lower_word(in, word);
|
|
||||||
if (word == "days")
|
|
||||||
days = quantity;
|
|
||||||
else if (word == "weeks")
|
|
||||||
days = 7 * quantity;
|
|
||||||
else if (word == "months")
|
|
||||||
months = quantity;
|
|
||||||
else if (word == "quarters")
|
|
||||||
months = 3 * quantity;
|
|
||||||
else if (word == "years")
|
|
||||||
years = quantity;
|
|
||||||
else if (word == "hours")
|
|
||||||
hours = quantity;
|
|
||||||
else if (word == "minutes")
|
|
||||||
minutes = quantity;
|
|
||||||
else if (word == "seconds")
|
|
||||||
seconds = quantity;
|
|
||||||
}
|
|
||||||
else if (word == "day")
|
|
||||||
days = 1;
|
|
||||||
else if (word == "week")
|
|
||||||
days = 7;
|
|
||||||
else if (word == "month")
|
|
||||||
months = 1;
|
|
||||||
else if (word == "quarter")
|
|
||||||
months = 3;
|
|
||||||
else if (word == "year")
|
|
||||||
years = 1;
|
|
||||||
else if (word == "hour")
|
|
||||||
hours = 1;
|
|
||||||
else if (word == "minute")
|
|
||||||
minutes = 1;
|
|
||||||
else if (word == "second")
|
|
||||||
seconds = 1;
|
|
||||||
}
|
|
||||||
else if (word == "daily")
|
|
||||||
days = 1;
|
|
||||||
else if (word == "weekly")
|
|
||||||
days = 7;
|
|
||||||
else if (word == "biweekly")
|
|
||||||
days = 14;
|
|
||||||
else if (word == "monthly")
|
|
||||||
months = 1;
|
|
||||||
else if (word == "bimonthly")
|
|
||||||
months = 2;
|
|
||||||
else if (word == "quarterly")
|
|
||||||
months = 3;
|
|
||||||
else if (word == "yearly")
|
|
||||||
years = 1;
|
|
||||||
else if (word == "hourly")
|
|
||||||
hours = 1;
|
|
||||||
else if (word == "this" || word == "last" || word == "next") {
|
|
||||||
parse_date_words(in, word, &begin, &end);
|
|
||||||
}
|
|
||||||
else if (word == "in") {
|
|
||||||
read_lower_word(in, word);
|
|
||||||
parse_date_words(in, word, &begin, &end);
|
|
||||||
}
|
|
||||||
else if (word == "from" || word == "since") {
|
|
||||||
read_lower_word(in, word);
|
|
||||||
parse_date_words(in, word, &begin, NULL);
|
|
||||||
}
|
|
||||||
else if (word == "to" || word == "until") {
|
|
||||||
read_lower_word(in, word);
|
|
||||||
parse_date_words(in, word, NULL, &end);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parse_inclusion_specifier(word, &begin, &end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifdef USE_BOOST_PYTHON
|
|
||||||
|
|
||||||
#include <boost/python.hpp>
|
|
||||||
|
|
||||||
using namespace boost::python;
|
|
||||||
|
|
||||||
unsigned int interval_len(interval_t& interval)
|
|
||||||
{
|
|
||||||
int periods = 1;
|
|
||||||
std::time_t when = interval.first();
|
|
||||||
while (interval.end && when < interval.end) {
|
|
||||||
when = interval.increment(when);
|
|
||||||
if (when < interval.end)
|
|
||||||
periods++;
|
|
||||||
}
|
|
||||||
return periods;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::time_t interval_getitem(interval_t& interval, int i)
|
|
||||||
{
|
|
||||||
static std::time_t last_index = 0;
|
|
||||||
static std::time_t last_moment = 0;
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
last_index = 0;
|
|
||||||
last_moment = interval.first();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
last_moment = interval.increment(last_moment);
|
|
||||||
if (interval.end && last_moment >= interval.end) {
|
|
||||||
PyErr_SetString(PyExc_IndexError, "Index out of range");
|
|
||||||
throw_error_already_set();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return last_moment;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::time_t py_parse_date(const char * date_str)
|
|
||||||
{
|
|
||||||
std::time_t temp;
|
|
||||||
if (parse_date(date_str, &temp))
|
|
||||||
return temp;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::time_t py_parse_date_yr(const char * date_str, const int year)
|
|
||||||
{
|
|
||||||
std::time_t temp;
|
|
||||||
if (parse_date(date_str, &temp, year))
|
|
||||||
return temp;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void export_datetime()
|
|
||||||
{
|
|
||||||
class_< date_t > ("Date")
|
|
||||||
.def("now", &date_t::now)
|
|
||||||
.def("formats", &date_t::formats)
|
|
||||||
.def("current_year", &date_t::current_year)
|
|
||||||
.def("input_format", &date_t::input_format)
|
|
||||||
.def("output_format", &date_t::output_format)
|
|
||||||
|
|
||||||
.def(init<>())
|
|
||||||
.def(init<const date_t&>())
|
|
||||||
.def(init<const std::time_t&>())
|
|
||||||
.def(init<const interval_t&>())
|
|
||||||
.def(init<const std::string&>())
|
|
||||||
|
|
||||||
.def(self += other<const interval_t&>())
|
|
||||||
.def(self -= other<const date_t&>())
|
|
||||||
.def(self += long())
|
|
||||||
.def(self -= long())
|
|
||||||
|
|
||||||
.def(self < other<const date_t&>())
|
|
||||||
.def(self <= other<const date_t&>())
|
|
||||||
.def(self > other<const date_t&>())
|
|
||||||
.def(self >= other<const date_t&>())
|
|
||||||
.def(self == other<const date_t&>())
|
|
||||||
.def(self != other<const date_t&>())
|
|
||||||
|
|
||||||
.def("year", &date_t::year)
|
|
||||||
.def("month", &date_t::month)
|
|
||||||
.def("day", &date_t::day)
|
|
||||||
.def("wday", &date_t::wday)
|
|
||||||
.def("localtime", &date_t::localtime)
|
|
||||||
|
|
||||||
.def("write", &date_t::write)
|
|
||||||
.def("parse", &date_t::parse)
|
|
||||||
;
|
|
||||||
|
|
||||||
class_< interval_t >
|
|
||||||
("Interval", init<optional<int, int, int, std::time_t, std::time_t> >())
|
|
||||||
.def(init<std::string>())
|
|
||||||
.def(! self)
|
|
||||||
|
|
||||||
.def_readwrite("years", &interval_t::years)
|
|
||||||
.def_readwrite("months", &interval_t::months)
|
|
||||||
.def_readwrite("days", &interval_t::days)
|
|
||||||
.def_readwrite("hours", &interval_t::hours)
|
|
||||||
.def_readwrite("minutes", &interval_t::minutes)
|
|
||||||
.def_readwrite("seconds", &interval_t::seconds)
|
|
||||||
|
|
||||||
.def_readwrite("begin", &interval_t::begin)
|
|
||||||
.def_readwrite("end", &interval_t::end)
|
|
||||||
|
|
||||||
.def("__len__", interval_len)
|
|
||||||
.def("__getitem__", interval_getitem)
|
|
||||||
|
|
||||||
.def("start", &interval_t::start)
|
|
||||||
.def("first", &interval_t::first)
|
|
||||||
.def("increment", &interval_t::increment)
|
|
||||||
;
|
|
||||||
|
|
||||||
def("parse_date", py_parse_date);
|
|
||||||
def("parse_date", py_parse_date_yr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // USE_BOOST_PYTHON
|
|
||||||
#endif
|
|
||||||
320
datetime.h
320
datetime.h
|
|
@ -1,320 +0,0 @@
|
||||||
#ifndef _DATETIME_H
|
|
||||||
#define _DATETIME_H
|
|
||||||
|
|
||||||
#include <ctime>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include "error.h"
|
|
||||||
|
|
||||||
class date_error : public error {
|
|
||||||
public:
|
|
||||||
date_error(const std::string& _reason) throw() : error(_reason) {}
|
|
||||||
virtual ~date_error() throw() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct interval_t;
|
|
||||||
class datetime_t;
|
|
||||||
|
|
||||||
class date_t
|
|
||||||
{
|
|
||||||
date_t(const datetime_t& _when);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::time_t when;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static date_t now;
|
|
||||||
static const char * formats[];
|
|
||||||
static int current_year;
|
|
||||||
static std::string input_format;
|
|
||||||
static std::string output_format;
|
|
||||||
|
|
||||||
date_t() : when(0) {}
|
|
||||||
date_t(const date_t& _when) : when(_when.when) {}
|
|
||||||
|
|
||||||
date_t(const std::time_t _when) : when(_when) {
|
|
||||||
#if 0
|
|
||||||
struct std::tm * moment = std::localtime(&_when);
|
|
||||||
moment->tm_hour = 0;
|
|
||||||
moment->tm_min = 0;
|
|
||||||
moment->tm_sec = 0;
|
|
||||||
when = std::mktime(moment);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
date_t(const interval_t& period);
|
|
||||||
date_t(const std::string& _when);
|
|
||||||
|
|
||||||
virtual ~date_t() {}
|
|
||||||
|
|
||||||
date_t& operator=(const date_t& _when) {
|
|
||||||
when = _when.when;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
date_t& operator=(const std::time_t _when) {
|
|
||||||
return *this = date_t(_when);
|
|
||||||
}
|
|
||||||
date_t& operator=(const datetime_t& _when) {
|
|
||||||
return *this = date_t(_when);
|
|
||||||
}
|
|
||||||
date_t& operator=(const interval_t& period) {
|
|
||||||
return *this = date_t(period);
|
|
||||||
}
|
|
||||||
date_t& operator=(const std::string& _when) {
|
|
||||||
return *this = date_t(_when);
|
|
||||||
}
|
|
||||||
|
|
||||||
date_t& operator+=(const interval_t& period);
|
|
||||||
|
|
||||||
long operator-=(const date_t& date) {
|
|
||||||
return (when - date.when) / 86400;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual date_t& operator+=(const long days) {
|
|
||||||
// jww (2006-03-26): This is not accurate enough when DST is in effect!
|
|
||||||
when += days * 86400;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
virtual date_t& operator-=(const long days) {
|
|
||||||
// jww (2006-03-26): This is not accurate enough when DST is in effect!
|
|
||||||
when -= days * 86400;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEF_DATE_OP(OP) \
|
|
||||||
bool operator OP(const date_t& other) const { \
|
|
||||||
return when OP other.when; \
|
|
||||||
}
|
|
||||||
|
|
||||||
DEF_DATE_OP(<)
|
|
||||||
DEF_DATE_OP(<=)
|
|
||||||
DEF_DATE_OP(>)
|
|
||||||
DEF_DATE_OP(>=)
|
|
||||||
DEF_DATE_OP(==)
|
|
||||||
DEF_DATE_OP(!=)
|
|
||||||
|
|
||||||
operator bool() const {
|
|
||||||
return when != 0;
|
|
||||||
}
|
|
||||||
operator std::time_t() const {
|
|
||||||
return when;
|
|
||||||
}
|
|
||||||
operator std::string() const {
|
|
||||||
return to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string to_string(const std::string& format = output_format) const {
|
|
||||||
char buf[64];
|
|
||||||
std::strftime(buf, 63, format.c_str(), localtime());
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int year() const {
|
|
||||||
return localtime()->tm_year + 1900;
|
|
||||||
}
|
|
||||||
int month() const {
|
|
||||||
return localtime()->tm_mon + 1;
|
|
||||||
}
|
|
||||||
int day() const {
|
|
||||||
return localtime()->tm_mday;
|
|
||||||
}
|
|
||||||
int wday() const {
|
|
||||||
return localtime()->tm_wday;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::tm * localtime() const {
|
|
||||||
return std::localtime(&when);
|
|
||||||
}
|
|
||||||
|
|
||||||
void write(std::ostream& out,
|
|
||||||
const std::string& format = output_format) const {
|
|
||||||
out << to_string(format);
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse(std::istream& in);
|
|
||||||
|
|
||||||
friend class datetime_t;
|
|
||||||
friend struct interval_t;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline long operator-(const date_t& left, const date_t& right) {
|
|
||||||
date_t temp(left);
|
|
||||||
temp -= right;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline date_t operator+(const date_t& left, const long days) {
|
|
||||||
date_t temp(left);
|
|
||||||
temp += days;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline date_t operator-(const date_t& left, const long days) {
|
|
||||||
date_t temp(left);
|
|
||||||
temp -= days;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, const date_t& moment) {
|
|
||||||
moment.write(out);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::istream& operator>>(std::istream& in, date_t& moment) {
|
|
||||||
moment.parse(in);
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
class datetime_error : public error {
|
|
||||||
public:
|
|
||||||
datetime_error(const std::string& _reason) throw() : error(_reason) {}
|
|
||||||
virtual ~datetime_error() throw() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class datetime_t : public date_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static datetime_t now;
|
|
||||||
|
|
||||||
datetime_t() : date_t(now.when) {}
|
|
||||||
datetime_t(const datetime_t& _when) : date_t(_when.when) {}
|
|
||||||
datetime_t(const date_t& _when) : date_t(_when) {}
|
|
||||||
|
|
||||||
datetime_t(const std::time_t _when) : date_t(_when) {}
|
|
||||||
datetime_t(const std::string& _when);
|
|
||||||
|
|
||||||
datetime_t& operator=(const datetime_t& _when) {
|
|
||||||
when = _when.when;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
datetime_t& operator=(const date_t& _when) {
|
|
||||||
when = _when.when;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
datetime_t& operator=(const std::time_t _when) {
|
|
||||||
return *this = datetime_t(_when);
|
|
||||||
}
|
|
||||||
datetime_t& operator=(const std::string& _when) {
|
|
||||||
return *this = datetime_t(_when);
|
|
||||||
}
|
|
||||||
|
|
||||||
long operator-=(const datetime_t& date) {
|
|
||||||
return when - date.when;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual datetime_t& operator+=(const long secs) {
|
|
||||||
when += secs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
virtual datetime_t& operator-=(const long secs) {
|
|
||||||
when -= secs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEF_DATETIME_OP(OP) \
|
|
||||||
bool operator OP(const datetime_t& other) const { \
|
|
||||||
return when OP other.when; \
|
|
||||||
}
|
|
||||||
|
|
||||||
DEF_DATETIME_OP(<)
|
|
||||||
DEF_DATETIME_OP(<=)
|
|
||||||
DEF_DATETIME_OP(>)
|
|
||||||
DEF_DATETIME_OP(>=)
|
|
||||||
DEF_DATETIME_OP(==)
|
|
||||||
DEF_DATETIME_OP(!=)
|
|
||||||
|
|
||||||
int hour() const {
|
|
||||||
return localtime()->tm_hour;
|
|
||||||
}
|
|
||||||
int min() const {
|
|
||||||
return localtime()->tm_min;
|
|
||||||
}
|
|
||||||
int sec() const {
|
|
||||||
return localtime()->tm_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse(std::istream& in);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline long operator-(const datetime_t& left, const datetime_t& right) {
|
|
||||||
std::time_t left_time(left);
|
|
||||||
std::time_t right_time(right);
|
|
||||||
return left_time - right_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline datetime_t operator+(const datetime_t& left, const long seconds) {
|
|
||||||
datetime_t temp(left);
|
|
||||||
temp += seconds;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline datetime_t operator-(const datetime_t& left, const long seconds) {
|
|
||||||
datetime_t temp(left);
|
|
||||||
temp -= seconds;
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const datetime_t& moment);
|
|
||||||
|
|
||||||
inline std::istream& operator>>(std::istream& in, datetime_t& moment) {
|
|
||||||
moment.parse(in);
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct interval_t
|
|
||||||
{
|
|
||||||
unsigned short years;
|
|
||||||
unsigned short months;
|
|
||||||
unsigned short days;
|
|
||||||
unsigned short hours;
|
|
||||||
unsigned short minutes;
|
|
||||||
unsigned short seconds;
|
|
||||||
|
|
||||||
datetime_t begin;
|
|
||||||
datetime_t end;
|
|
||||||
|
|
||||||
interval_t(int _days = 0, int _months = 0, int _years = 0,
|
|
||||||
const date_t& _begin = date_t(),
|
|
||||||
const date_t& _end = date_t())
|
|
||||||
: years(_years), months(_months), days(_days),
|
|
||||||
hours(0), minutes(0), seconds(0),
|
|
||||||
begin(_begin), end(_end) {}
|
|
||||||
|
|
||||||
interval_t(const std::string& desc)
|
|
||||||
: years(0), months(0), days(0),
|
|
||||||
hours(0), minutes(0), seconds(0) {
|
|
||||||
std::istringstream stream(desc);
|
|
||||||
parse(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
operator bool() const {
|
|
||||||
return (years > 0 || months > 0 || days > 0 ||
|
|
||||||
hours > 0 || minutes > 0 || seconds > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void start(const datetime_t& moment) {
|
|
||||||
begin = first(moment);
|
|
||||||
}
|
|
||||||
datetime_t first(const datetime_t& moment = datetime_t()) const;
|
|
||||||
datetime_t increment(const datetime_t&) const;
|
|
||||||
|
|
||||||
void parse(std::istream& in);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline date_t::date_t(const interval_t& period) {
|
|
||||||
when = period.first().when;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline date_t& date_t::operator+=(const interval_t& period) {
|
|
||||||
return *this = period.increment(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline date_t::date_t(const datetime_t& _when) {
|
|
||||||
assert(0);
|
|
||||||
struct std::tm * moment = _when.localtime();
|
|
||||||
moment->tm_hour = 0;
|
|
||||||
moment->tm_min = 0;
|
|
||||||
moment->tm_sec = 0;
|
|
||||||
when = std::mktime(moment);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _DATETIME_H
|
|
||||||
2
debug.h
2
debug.h
|
|
@ -63,8 +63,6 @@ void debug_assert(const std::string& reason,
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "datetime.h"
|
|
||||||
|
|
||||||
#define DEBUG_ENABLED
|
#define DEBUG_ENABLED
|
||||||
|
|
||||||
extern std::ostream * _debug_stream;
|
extern std::ostream * _debug_stream;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
#include "derive.h"
|
#include "derive.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "mask.h"
|
#include "mask.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -318,7 +318,7 @@ unsigned int gnucash_parser_t::parse(std::istream& in,
|
||||||
// user specified.
|
// user specified.
|
||||||
//
|
//
|
||||||
// jww (2006-09-13): Make this parser local somehow.
|
// jww (2006-09-13): Make this parser local somehow.
|
||||||
date_t::input_format = "%Y-%m-%d %H:%M:%S %z";
|
//date_t::input_format = "%Y-%m-%d %H:%M:%S %z";
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
action = NO_ACTION;
|
action = NO_ACTION;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
#include "journal.h"
|
#include "journal.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "mask.h"
|
#include "mask.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#if 0
|
#if 0
|
||||||
|
|
@ -23,14 +22,14 @@ transaction_t::~transaction_t()
|
||||||
if (cost) delete cost;
|
if (cost) delete cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t transaction_t::actual_date() const
|
ptime transaction_t::actual_date() const
|
||||||
{
|
{
|
||||||
if (! _date && entry)
|
if (! _date && entry)
|
||||||
return entry->actual_date();
|
return entry->actual_date();
|
||||||
return _date;
|
return _date;
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t transaction_t::effective_date() const
|
ptime transaction_t::effective_date() const
|
||||||
{
|
{
|
||||||
if (! _date_eff && entry)
|
if (! _date_eff && entry)
|
||||||
return entry->effective_date();
|
return entry->effective_date();
|
||||||
|
|
@ -182,7 +181,7 @@ bool entry_base_t::finalize()
|
||||||
! (*x)->amount.commodity().annotated)
|
! (*x)->amount.commodity().annotated)
|
||||||
(*x)->amount.annotate_commodity
|
(*x)->amount.annotate_commodity
|
||||||
(abs(per_unit_cost),
|
(abs(per_unit_cost),
|
||||||
entry ? entry->actual_date() : datetime_t(),
|
entry ? entry->actual_date() : ptime(),
|
||||||
entry ? entry->code : "");
|
entry ? entry->code : "");
|
||||||
|
|
||||||
(*x)->cost = new amount_t(- (per_unit_cost * (*x)->amount));
|
(*x)->cost = new amount_t(- (per_unit_cost * (*x)->amount));
|
||||||
|
|
|
||||||
22
journal.h
22
journal.h
|
|
@ -23,8 +23,8 @@ class transaction_t
|
||||||
enum state_t { UNCLEARED, CLEARED, PENDING };
|
enum state_t { UNCLEARED, CLEARED, PENDING };
|
||||||
|
|
||||||
entry_t * entry;
|
entry_t * entry;
|
||||||
datetime_t _date;
|
ptime _date;
|
||||||
datetime_t _date_eff;
|
ptime _date_eff;
|
||||||
account_t * account;
|
account_t * account;
|
||||||
amount_t amount;
|
amount_t amount;
|
||||||
std::string amount_expr;
|
std::string amount_expr;
|
||||||
|
|
@ -67,9 +67,9 @@ class transaction_t
|
||||||
}
|
}
|
||||||
~transaction_t();
|
~transaction_t();
|
||||||
|
|
||||||
datetime_t actual_date() const;
|
ptime actual_date() const;
|
||||||
datetime_t effective_date() const;
|
ptime effective_date() const;
|
||||||
datetime_t date() const {
|
ptime date() const {
|
||||||
if (use_effective_date)
|
if (use_effective_date)
|
||||||
return effective_date();
|
return effective_date();
|
||||||
else
|
else
|
||||||
|
|
@ -151,8 +151,8 @@ class entry_base_t
|
||||||
class entry_t : public entry_base_t
|
class entry_t : public entry_base_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
datetime_t _date;
|
ptime _date;
|
||||||
datetime_t _date_eff;
|
ptime _date_eff;
|
||||||
std::string code;
|
std::string code;
|
||||||
std::string payee;
|
std::string payee;
|
||||||
|
|
||||||
|
|
@ -167,15 +167,15 @@ class entry_t : public entry_base_t
|
||||||
TRACE_DTOR("entry_t");
|
TRACE_DTOR("entry_t");
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t actual_date() const {
|
ptime actual_date() const {
|
||||||
return _date;
|
return _date;
|
||||||
}
|
}
|
||||||
datetime_t effective_date() const {
|
ptime effective_date() const {
|
||||||
if (! _date_eff)
|
if (_date_eff.is_not_a_date_time())
|
||||||
return _date;
|
return _date;
|
||||||
return _date_eff;
|
return _date_eff;
|
||||||
}
|
}
|
||||||
datetime_t date() const {
|
ptime date() const {
|
||||||
if (transaction_t::use_effective_date)
|
if (transaction_t::use_effective_date)
|
||||||
return effective_date();
|
return effective_date();
|
||||||
else
|
else
|
||||||
|
|
|
||||||
1
ledger.h
1
ledger.h
|
|
@ -13,7 +13,6 @@
|
||||||
#include <amount.h>
|
#include <amount.h>
|
||||||
#include <balance.h>
|
#include <balance.h>
|
||||||
#include <value.h>
|
#include <value.h>
|
||||||
#include <datetime.h>
|
|
||||||
#include <xml.h>
|
#include <xml.h>
|
||||||
#include <xpath.h>
|
#include <xpath.h>
|
||||||
#include <format.h>
|
#include <format.h>
|
||||||
|
|
|
||||||
1
ofx.cc
1
ofx.cc
|
|
@ -1,7 +1,6 @@
|
||||||
#include "journal.h"
|
#include "journal.h"
|
||||||
#include "ofx.h"
|
#include "ofx.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,9 @@ struct commodity_updater_wrap : public commodity_base_t::updater_t
|
||||||
commodity_updater_wrap(PyObject * self_) : self(self_) {}
|
commodity_updater_wrap(PyObject * self_) : self(self_) {}
|
||||||
|
|
||||||
virtual void operator()(commodity_base_t& commodity,
|
virtual void operator()(commodity_base_t& commodity,
|
||||||
const datetime_t& moment,
|
const ptime& moment,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const datetime_t& last,
|
const ptime& last,
|
||||||
amount_t& price) {
|
amount_t& price) {
|
||||||
call_method<void>(self, "__call__", commodity, moment, date, last, price);
|
call_method<void>(self, "__call__", commodity, moment, date, last, price);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ void export_amount();
|
||||||
#if 0
|
#if 0
|
||||||
void export_balance();
|
void export_balance();
|
||||||
void export_value();
|
void export_value();
|
||||||
void export_datetime();
|
|
||||||
|
|
||||||
void export_journal();
|
void export_journal();
|
||||||
void export_parser();
|
void export_parser();
|
||||||
|
|
@ -29,7 +28,6 @@ void initialize_ledger_for_python()
|
||||||
#if 0
|
#if 0
|
||||||
export_balance();
|
export_balance();
|
||||||
export_value();
|
export_value();
|
||||||
export_datetime();
|
|
||||||
|
|
||||||
export_journal();
|
export_journal();
|
||||||
export_parser();
|
export_parser();
|
||||||
|
|
|
||||||
1
qif.cc
1
qif.cc
|
|
@ -1,6 +1,5 @@
|
||||||
#include "journal.h"
|
#include "journal.h"
|
||||||
#include "qif.h"
|
#include "qif.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
|
||||||
25
quotes.cc
25
quotes.cc
|
|
@ -1,5 +1,4 @@
|
||||||
#include "quotes.h"
|
#include "quotes.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
@ -10,15 +9,15 @@
|
||||||
namespace ledger {
|
namespace ledger {
|
||||||
|
|
||||||
void quotes_by_script::operator()(commodity_base_t& commodity,
|
void quotes_by_script::operator()(commodity_base_t& commodity,
|
||||||
const datetime_t& moment,
|
const ptime& moment,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const datetime_t& last,
|
const ptime& last,
|
||||||
amount_t& price)
|
amount_t& price)
|
||||||
{
|
{
|
||||||
DEBUG_CLASS("ledger.quotes.download");
|
DEBUG_CLASS("ledger.quotes.download");
|
||||||
|
|
||||||
DEBUG_PRINT_("commodity: " << commodity.symbol);
|
DEBUG_PRINT_("commodity: " << commodity.symbol);
|
||||||
DEBUG_PRINT_TIME_(datetime_t::now);
|
DEBUG_PRINT_TIME_(now);
|
||||||
DEBUG_PRINT_TIME_(moment);
|
DEBUG_PRINT_TIME_(moment);
|
||||||
DEBUG_PRINT_TIME_(date);
|
DEBUG_PRINT_TIME_(date);
|
||||||
DEBUG_PRINT_TIME_(last);
|
DEBUG_PRINT_TIME_(last);
|
||||||
|
|
@ -27,9 +26,9 @@ void quotes_by_script::operator()(commodity_base_t& commodity,
|
||||||
DEBUG_PRINT_("pricing_leeway is " << pricing_leeway);
|
DEBUG_PRINT_("pricing_leeway is " << pricing_leeway);
|
||||||
|
|
||||||
if ((commodity.history &&
|
if ((commodity.history &&
|
||||||
(datetime_t::now - commodity.history->last_lookup) < (long)pricing_leeway) ||
|
(now - commodity.history->last_lookup) < pricing_leeway) ||
|
||||||
(datetime_t::now - last) < (long)pricing_leeway ||
|
(now - last) < pricing_leeway ||
|
||||||
(price && moment > date && (moment - date) <= (long)pricing_leeway))
|
(price && moment > date && (moment - date) <= pricing_leeway))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
@ -58,9 +57,9 @@ void quotes_by_script::operator()(commodity_base_t& commodity,
|
||||||
DEBUG_PRINT_("downloaded quote: " << buf);
|
DEBUG_PRINT_("downloaded quote: " << buf);
|
||||||
|
|
||||||
price.parse(buf);
|
price.parse(buf);
|
||||||
commodity.add_price(datetime_t::now, price);
|
commodity.add_price(now, price);
|
||||||
|
|
||||||
commodity.history->last_lookup = datetime_t::now;
|
commodity.history->last_lookup = now;
|
||||||
cache_dirty = true;
|
cache_dirty = true;
|
||||||
|
|
||||||
if (price && ! price_db.empty()) {
|
if (price && ! price_db.empty()) {
|
||||||
|
|
@ -69,8 +68,12 @@ void quotes_by_script::operator()(commodity_base_t& commodity,
|
||||||
#else
|
#else
|
||||||
ofstream database(price_db.c_str(), ios_base::out | ios_base::app);
|
ofstream database(price_db.c_str(), ios_base::out | ios_base::app);
|
||||||
#endif
|
#endif
|
||||||
database << "P " << datetime_t::now.to_string("%Y/%m/%d %H:%M:%S")
|
#if 0
|
||||||
|
// jww (2007-04-18): Need to convert to local time and print
|
||||||
|
// here, print with UTC timezone specifier
|
||||||
|
database << "P " << now.to_string("%Y/%m/%d %H:%M:%S")
|
||||||
<< " " << commodity.symbol << " " << price << endl;
|
<< " " << commodity.symbol << " " << price << endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new error(std::string("Failed to download price for '") +
|
throw new error(std::string("Failed to download price for '") +
|
||||||
|
|
|
||||||
10
quotes.h
10
quotes.h
|
|
@ -8,20 +8,20 @@ namespace ledger {
|
||||||
class quotes_by_script : public commodity_base_t::updater_t
|
class quotes_by_script : public commodity_base_t::updater_t
|
||||||
{
|
{
|
||||||
std::string price_db;
|
std::string price_db;
|
||||||
unsigned long pricing_leeway;
|
time_duration pricing_leeway;
|
||||||
bool& cache_dirty;
|
bool& cache_dirty;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
quotes_by_script(std::string _price_db,
|
quotes_by_script(std::string _price_db,
|
||||||
unsigned long _pricing_leeway,
|
time_duration _pricing_leeway,
|
||||||
bool& _cache_dirty)
|
bool& _cache_dirty)
|
||||||
: price_db(_price_db), pricing_leeway(_pricing_leeway),
|
: price_db(_price_db), pricing_leeway(_pricing_leeway),
|
||||||
cache_dirty(_cache_dirty) {}
|
cache_dirty(_cache_dirty) {}
|
||||||
|
|
||||||
virtual void operator()(commodity_base_t& commodity,
|
virtual void operator()(commodity_base_t& commodity,
|
||||||
const datetime_t& moment,
|
const ptime& moment,
|
||||||
const datetime_t& date,
|
const ptime& date,
|
||||||
const datetime_t& last,
|
const ptime& last,
|
||||||
amount_t& price);
|
amount_t& price);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,13 +44,13 @@ void report_t::ftime(value_t& result, xml::xpath_t::scope_t * locals)
|
||||||
if (locals->args.size() < 1)
|
if (locals->args.size() < 1)
|
||||||
throw new error("usage: ftime(DATE [, DATE_FORMAT])");
|
throw new error("usage: ftime(DATE [, DATE_FORMAT])");
|
||||||
|
|
||||||
datetime_t date = locals->args[0].to_datetime();
|
ptime date = locals->args[0].to_datetime();
|
||||||
|
|
||||||
std::string date_format;
|
std::string date_format;
|
||||||
if (locals->args.size() == 2)
|
if (locals->args.size() == 2)
|
||||||
date_format = locals->args[1].to_string();
|
date_format = locals->args[1].to_string();
|
||||||
else
|
else
|
||||||
date_format = datetime_t::output_format;
|
date_format = ptime::output_format;
|
||||||
|
|
||||||
result.set_string(date.to_string(date_format));
|
result.set_string(date.to_string(date_format));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ bool session_t::resolve(const std::string& name, value_t& result,
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
case 'd':
|
case 'd':
|
||||||
if (name == "date_format") {
|
if (name == "date_format") {
|
||||||
result.set_string(datetime_t::output_format);
|
result.set_string(ptime::output_format);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ class session_t : public xml::xpath_t::scope_t
|
||||||
bool verbose_mode;
|
bool verbose_mode;
|
||||||
bool trace_mode;
|
bool trace_mode;
|
||||||
|
|
||||||
datetime_t now;
|
ptime now;
|
||||||
|
|
||||||
elision_style_t elision_style;
|
elision_style_t elision_style;
|
||||||
|
|
||||||
|
|
@ -90,7 +90,7 @@ class session_t : public xml::xpath_t::scope_t
|
||||||
verbose_mode(false),
|
verbose_mode(false),
|
||||||
trace_mode(false),
|
trace_mode(false),
|
||||||
|
|
||||||
now(datetime_t::now),
|
now(now),
|
||||||
|
|
||||||
elision_style(ABBREVIATE),
|
elision_style(ABBREVIATE),
|
||||||
abbrev_length(2),
|
abbrev_length(2),
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,23 @@ void CommodityTestCase::testConstructors()
|
||||||
|
|
||||||
void CommodityTestCase::testPriceHistory()
|
void CommodityTestCase::testPriceHistory()
|
||||||
{
|
{
|
||||||
|
datetime_t jan17_07("2007/01/17 00:00:00");
|
||||||
|
datetime_t feb27_07("2007/02/27 18:00:00");
|
||||||
|
datetime_t feb28_07("2007/02/28 06:00:00");
|
||||||
|
datetime_t feb28_07sbm("2007/02/28 11:59:59");
|
||||||
|
datetime_t mar01_07("2007/03/01 00:00:00");
|
||||||
|
datetime_t apr15_07("2007/04/15 13:00:00");
|
||||||
|
|
||||||
// jww (2007-04-17): tbd
|
// jww (2007-04-17): tbd
|
||||||
amount_t x1("100.10 AAPL");
|
amount_t x1("100.10 AAPL");
|
||||||
|
|
||||||
assertEqual(x1, x1.value(datetime_t()));
|
// Commodities cannot be constructed by themselves, since a great
|
||||||
|
// deal of their state depends on how they were seen to be used.
|
||||||
|
commodity_t& aapl(x1.commodity());
|
||||||
|
|
||||||
|
aapl.add_price(datetime_t(), amount_t("$10.20"));
|
||||||
|
|
||||||
|
assertEqual(amount_t("$1021.02"), x1.value(datetime_t()));
|
||||||
|
|
||||||
assertValid(x1);
|
assertValid(x1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
textual.cc
15
textual.cc
|
|
@ -30,7 +30,7 @@ static std::list<std::pair<std::string, int> > include_stack;
|
||||||
|
|
||||||
#ifdef TIMELOG_SUPPORT
|
#ifdef TIMELOG_SUPPORT
|
||||||
struct time_entry_t {
|
struct time_entry_t {
|
||||||
datetime_t checkin;
|
ptime checkin;
|
||||||
account_t * account;
|
account_t * account;
|
||||||
std::string desc;
|
std::string desc;
|
||||||
};
|
};
|
||||||
|
|
@ -491,7 +491,7 @@ bool textual_parser_t::test(std::istream& in) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clock_out_from_timelog(const datetime_t& when,
|
static void clock_out_from_timelog(const ptime& when,
|
||||||
account_t * account,
|
account_t * account,
|
||||||
const char * desc,
|
const char * desc,
|
||||||
journal_t * journal)
|
journal_t * journal)
|
||||||
|
|
@ -675,15 +675,16 @@ unsigned int textual_parser_t::parse(std::istream& in,
|
||||||
std::string date_field = date_field_ptr;
|
std::string date_field = date_field_ptr;
|
||||||
|
|
||||||
char * symbol_and_price;
|
char * symbol_and_price;
|
||||||
datetime_t datetime;
|
ptime datetime;
|
||||||
|
|
||||||
if (std::isdigit(time_field_ptr[0])) {
|
if (std::isdigit(time_field_ptr[0])) {
|
||||||
symbol_and_price = next_element(time_field_ptr);
|
symbol_and_price = next_element(time_field_ptr);
|
||||||
if (! symbol_and_price) break;
|
if (! symbol_and_price) break;
|
||||||
datetime = date_field + " " + time_field_ptr;
|
datetime = ptime_from_local_time_string(date_field + " " +
|
||||||
|
time_field_ptr);
|
||||||
} else {
|
} else {
|
||||||
symbol_and_price = time_field_ptr;
|
symbol_and_price = time_field_ptr;
|
||||||
datetime = date_t(date_field);
|
datetime = ptime_from_local_date_string(date_field);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string symbol;
|
std::string symbol;
|
||||||
|
|
@ -706,7 +707,7 @@ unsigned int textual_parser_t::parse(std::istream& in,
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'Y': // set current year
|
case 'Y': // set current year
|
||||||
date_t::current_year = std::atoi(skip_ws(line + 1)) - 1900;
|
date_t::current_year = std::atoi(skip_ws(line + 1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef TIMELOG_SUPPORT
|
#ifdef TIMELOG_SUPPORT
|
||||||
|
|
@ -879,7 +880,7 @@ unsigned int textual_parser_t::parse(std::istream& in,
|
||||||
for (std::list<time_entry_t>::iterator i = time_entries.begin();
|
for (std::list<time_entry_t>::iterator i = time_entries.begin();
|
||||||
i != time_entries.end();
|
i != time_entries.end();
|
||||||
i++)
|
i++)
|
||||||
clock_out_from_timelog(datetime_t::now, (*i).account, NULL, journal);
|
clock_out_from_timelog(now, (*i).account, NULL, journal);
|
||||||
time_entries.clear();
|
time_entries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
7
times.cc
Normal file
7
times.cc
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "times.h"
|
||||||
|
|
||||||
|
namespace ledger {
|
||||||
|
|
||||||
|
ptime now = boost::posix_time::second_clock::universal_time();
|
||||||
|
|
||||||
|
}
|
||||||
41
times.h
Normal file
41
times.h
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
#ifndef _TIMES_H
|
||||||
|
#define _TIMES_H
|
||||||
|
|
||||||
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <boost/date_time/posix_time/posix_time_duration.hpp>
|
||||||
|
#include <boost/date_time/posix_time/posix_time_config.hpp>
|
||||||
|
#include <boost/date_time/local_time_adjustor.hpp>
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace ledger {
|
||||||
|
|
||||||
|
using namespace boost::posix_time;
|
||||||
|
using namespace boost::date_time;
|
||||||
|
|
||||||
|
typedef ptime::time_duration_type time_duration;
|
||||||
|
|
||||||
|
class interval_t {};
|
||||||
|
|
||||||
|
inline ptime ptime_local_to_utc(const ptime& when) {
|
||||||
|
struct std::tm tm_gmt = to_tm(when);
|
||||||
|
return from_time_t(std::mktime(&tm_gmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
// jww (2007-04-18): I need to make a general parsing function
|
||||||
|
// instead, and then make these into private methods.
|
||||||
|
inline ptime ptime_from_local_date_string(const std::string& date_string) {
|
||||||
|
return ptime_local_to_utc(ptime(boost::gregorian::from_string(date_string),
|
||||||
|
time_duration()));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ptime ptime_from_local_time_string(const std::string& time_string) {
|
||||||
|
return ptime_local_to_utc(time_from_string(time_string));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern ptime now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _TIMES_H */
|
||||||
4
trace.cc
4
trace.cc
|
|
@ -8,8 +8,8 @@ bool trace_mode;
|
||||||
void trace(const std::string& cat, const std::string& str)
|
void trace(const std::string& cat, const std::string& str)
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
std::strftime(buf, 31, "%H:%M:%S", datetime_t::now.localtime());
|
std::cerr << now.to_short_string() << " " << cat << ": " << str
|
||||||
std::cerr << buf << " " << cat << ": " << str << std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void trace_push(const std::string& cat, const std::string& str,
|
void trace_push(const std::string& cat, const std::string& str,
|
||||||
|
|
|
||||||
102
value.cc
102
value.cc
|
|
@ -27,14 +27,14 @@ long value_t::to_integer() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
datetime_t value_t::to_datetime() const
|
ptime value_t::to_datetime() const
|
||||||
{
|
{
|
||||||
if (type == DATETIME) {
|
if (type == DATETIME) {
|
||||||
return *(datetime_t *) data;
|
return *(ptime *) data;
|
||||||
} else {
|
} else {
|
||||||
value_t temp(*this);
|
value_t temp(*this);
|
||||||
temp.cast(DATETIME);
|
temp.cast(DATETIME);
|
||||||
return *(datetime_t *) temp.data;
|
return *(ptime *) temp.data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,7 +171,7 @@ value_t& value_t::operator=(const value_t& val)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
else if (type == DATETIME && val.type == DATETIME) {
|
else if (type == DATETIME && val.type == DATETIME) {
|
||||||
*((datetime_t *) data) = *((datetime_t *) val.data);
|
*((ptime *) data) = *((ptime *) val.data);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
else if (type == AMOUNT && val.type == AMOUNT) {
|
else if (type == AMOUNT && val.type == AMOUNT) {
|
||||||
|
|
@ -207,7 +207,7 @@ value_t& value_t::operator=(const value_t& val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
*((datetime_t *) data) = *((datetime_t *) val.data);
|
*((ptime *) data) = *((ptime *) val.data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
|
|
@ -293,16 +293,16 @@ value_t& value_t::operator+=(const value_t& val)
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
switch (val.type) {
|
switch (val.type) {
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
*((datetime_t *) data) += *((long *) val.data);
|
*((ptime *) data) += seconds(*((long *) val.data));
|
||||||
break;
|
break;
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
*((datetime_t *) data) += long(*((amount_t *) val.data));
|
*((ptime *) data) += seconds(long(*((amount_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
*((datetime_t *) data) += long(*((balance_t *) val.data));
|
*((ptime *) data) += seconds(long(*((balance_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
case BALANCE_PAIR:
|
case BALANCE_PAIR:
|
||||||
*((datetime_t *) data) += long(*((balance_pair_t *) val.data));
|
*((ptime *) data) += seconds(long(*((balance_pair_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
case STRING:
|
case STRING:
|
||||||
throw new value_error("Cannot add a string to an date/time");
|
throw new value_error("Cannot add a string to an date/time");
|
||||||
|
|
@ -476,22 +476,22 @@ value_t& value_t::operator-=(const value_t& val)
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
switch (val.type) {
|
switch (val.type) {
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
*((datetime_t *) data) -= *((long *) val.data);
|
*((ptime *) data) -= seconds(*((long *) val.data));
|
||||||
break;
|
break;
|
||||||
case DATETIME: {
|
case DATETIME: {
|
||||||
long tval = *((datetime_t *) data) - *((datetime_t *) val.data);
|
time_duration tval = ((ptime *) data)->operator-(*((ptime *) val.data));
|
||||||
cast(INTEGER);
|
cast(INTEGER);
|
||||||
*((long *) data) = tval;
|
*((long *) data) = tval.total_seconds();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
*((datetime_t *) data) -= long(*((amount_t *) val.data));
|
*((ptime *) data) -= seconds(long(*((amount_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
*((datetime_t *) data) -= long(*((balance_t *) val.data));
|
*((ptime *) data) -= seconds(long(*((balance_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
case BALANCE_PAIR:
|
case BALANCE_PAIR:
|
||||||
*((datetime_t *) data) -= long(*((balance_pair_t *) val.data));
|
*((ptime *) data) -= seconds(long(*((balance_pair_t *) val.data)));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
@ -877,7 +877,7 @@ value_t::operator bool() const
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *(long *) data;
|
return *(long *) data;
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return *(datetime_t *) data;
|
return ! ((ptime *) data)->is_not_a_date_time();
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
return *(amount_t *) data;
|
return *(amount_t *) data;
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
|
|
@ -911,7 +911,7 @@ value_t::operator long() const
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *((long *) data);
|
return *((long *) data);
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return *((datetime_t *) data);
|
throw new value_error("Cannot convert a date/time to an integer");
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
return *((amount_t *) data);
|
return *((amount_t *) data);
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
|
|
@ -936,15 +936,15 @@ value_t::operator long() const
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
value_t::operator datetime_t() const
|
value_t::operator ptime() const
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
throw new value_error("Cannot convert a boolean to a date/time");
|
throw new value_error("Cannot convert a boolean to a date/time");
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *((long *) data);
|
throw new value_error("Cannot convert an integer to a date/time");
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return *((datetime_t *) data);
|
return *((ptime *) data);
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
throw new value_error("Cannot convert an amount to a date/time");
|
throw new value_error("Cannot convert an amount to a date/time");
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
|
|
@ -965,7 +965,7 @@ value_t::operator datetime_t() const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
assert(0);
|
assert(0);
|
||||||
return 0;
|
return ptime();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
|
@ -1047,7 +1047,7 @@ bool value_t::operator OP(const value_t& val) \
|
||||||
return *((bool *) data) OP bool(*((long *) val.data)); \
|
return *((bool *) data) OP bool(*((long *) val.data)); \
|
||||||
\
|
\
|
||||||
case DATETIME: \
|
case DATETIME: \
|
||||||
return *((bool *) data) OP bool(*((datetime_t *) val.data)); \
|
throw new value_error("Cannot compare a boolean to a date/time"); \
|
||||||
\
|
\
|
||||||
case AMOUNT: \
|
case AMOUNT: \
|
||||||
return *((bool *) data) OP bool(*((amount_t *) val.data)); \
|
return *((bool *) data) OP bool(*((amount_t *) val.data)); \
|
||||||
|
|
@ -1083,8 +1083,7 @@ bool value_t::operator OP(const value_t& val) \
|
||||||
return (*((long *) data) OP *((long *) val.data)); \
|
return (*((long *) data) OP *((long *) val.data)); \
|
||||||
\
|
\
|
||||||
case DATETIME: \
|
case DATETIME: \
|
||||||
return (*((long *) data) OP \
|
throw new value_error("Cannot compare an integer to a date/time"); \
|
||||||
((long) *((datetime_t *) val.data))); \
|
|
||||||
\
|
\
|
||||||
case AMOUNT: \
|
case AMOUNT: \
|
||||||
return (amount_t(*((long *) data)) OP \
|
return (amount_t(*((long *) data)) OP \
|
||||||
|
|
@ -1119,12 +1118,10 @@ bool value_t::operator OP(const value_t& val) \
|
||||||
throw new value_error("Cannot compare a date/time to a boolean"); \
|
throw new value_error("Cannot compare a date/time to a boolean"); \
|
||||||
\
|
\
|
||||||
case INTEGER: \
|
case INTEGER: \
|
||||||
return (*((datetime_t *) data) OP \
|
throw new value_error("Cannot compare a date/time to an integer"); \
|
||||||
datetime_t(*((long *) val.data))); \
|
|
||||||
\
|
\
|
||||||
case DATETIME: \
|
case DATETIME: \
|
||||||
return (*((datetime_t *) data) OP \
|
return *((ptime *) data) OP *((ptime *) val.data); \
|
||||||
*((datetime_t *) val.data)); \
|
|
||||||
\
|
\
|
||||||
case AMOUNT: \
|
case AMOUNT: \
|
||||||
throw new value_error("Cannot compare a date/time to an amount"); \
|
throw new value_error("Cannot compare a date/time to an amount"); \
|
||||||
|
|
@ -1414,8 +1411,8 @@ void value_t::cast(type_t cast_type)
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
break;
|
break;
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
*((datetime_t *) data) = datetime_t(*((long *) data));
|
throw new value_error("Cannot convert an integer to a date/time");
|
||||||
break;
|
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
new((amount_t *)data) amount_t(*((long *) data));
|
new((amount_t *)data) amount_t(*((long *) data));
|
||||||
break;
|
break;
|
||||||
|
|
@ -1447,11 +1444,10 @@ void value_t::cast(type_t cast_type)
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
switch (cast_type) {
|
switch (cast_type) {
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
*((bool *) data) = *((datetime_t *) data);
|
*((bool *) data) = ! ((ptime *) data)->is_not_a_date_time();
|
||||||
break;
|
break;
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
*((long *) data) = *((datetime_t *) data);
|
throw new value_error("Cannot convert a date/time to an integer");
|
||||||
break;
|
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
break;
|
break;
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
|
|
@ -1856,7 +1852,7 @@ void value_t::abs()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t value_t::value(const datetime_t& moment) const
|
value_t value_t::value(const ptime& moment) const
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
|
|
@ -2014,18 +2010,18 @@ value_t value_t::date() const
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
throw new value_error("Cannot find the date of a boolean");
|
throw new value_error("Cannot find the date of a boolean");
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return datetime_t();
|
return ptime();
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
return datetime_t(((amount_t *) data)->date());
|
return ptime(((amount_t *) data)->date());
|
||||||
|
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
return datetime_t(((balance_t *) data)->date());
|
return ptime(((balance_t *) data)->date());
|
||||||
|
|
||||||
case BALANCE_PAIR:
|
case BALANCE_PAIR:
|
||||||
return datetime_t(((balance_pair_t *) data)->quantity.date());
|
return ptime(((balance_pair_t *) data)->quantity.date());
|
||||||
|
|
||||||
case STRING:
|
case STRING:
|
||||||
throw new value_error("Cannot find the date of a string");
|
throw new value_error("Cannot find the date of a string");
|
||||||
|
|
@ -2209,7 +2205,7 @@ std::ostream& operator<<(std::ostream& out, const value_t& val)
|
||||||
out << *(long *) val.data;
|
out << *(long *) val.data;
|
||||||
break;
|
break;
|
||||||
case value_t::DATETIME:
|
case value_t::DATETIME:
|
||||||
out << *(datetime_t *) val.data;
|
out << *(ptime *) val.data;
|
||||||
break;
|
break;
|
||||||
case value_t::AMOUNT:
|
case value_t::AMOUNT:
|
||||||
out << *(amount_t *) val.data;
|
out << *(amount_t *) val.data;
|
||||||
|
|
@ -2284,7 +2280,7 @@ void value_context::describe(std::ostream& out) const throw()
|
||||||
out << *((long *) bal->data);
|
out << *((long *) bal->data);
|
||||||
break;
|
break;
|
||||||
case value_t::DATETIME:
|
case value_t::DATETIME:
|
||||||
out << *((datetime_t *) bal->data);
|
out << *((ptime *) bal->data);
|
||||||
break;
|
break;
|
||||||
case value_t::AMOUNT:
|
case value_t::AMOUNT:
|
||||||
out << *((amount_t *) bal->data);
|
out << *((amount_t *) bal->data);
|
||||||
|
|
@ -2415,7 +2411,7 @@ void export_value()
|
||||||
.def(init<std::string>())
|
.def(init<std::string>())
|
||||||
.def(init<double>())
|
.def(init<double>())
|
||||||
.def(init<long>())
|
.def(init<long>())
|
||||||
.def(init<datetime_t>())
|
.def(init<ptime>())
|
||||||
|
|
||||||
.def(self + self)
|
.def(self + self)
|
||||||
.def(self + other<std::string>())
|
.def(self + other<std::string>())
|
||||||
|
|
@ -2517,7 +2513,7 @@ void export_value()
|
||||||
.def(self < other<balance_t>())
|
.def(self < other<balance_t>())
|
||||||
.def(self < other<amount_t>())
|
.def(self < other<amount_t>())
|
||||||
.def(self < long())
|
.def(self < long())
|
||||||
.def(self < other<datetime_t>())
|
.def(self < other<ptime>())
|
||||||
.def(self < double())
|
.def(self < double())
|
||||||
|
|
||||||
.def(other<std::string>() < self)
|
.def(other<std::string>() < self)
|
||||||
|
|
@ -2525,7 +2521,7 @@ void export_value()
|
||||||
.def(other<balance_t>() < self)
|
.def(other<balance_t>() < self)
|
||||||
.def(other<amount_t>() < self)
|
.def(other<amount_t>() < self)
|
||||||
.def(long() < self)
|
.def(long() < self)
|
||||||
.def(other<datetime_t>() < self)
|
.def(other<ptime>() < self)
|
||||||
.def(double() < self)
|
.def(double() < self)
|
||||||
|
|
||||||
.def(self <= self)
|
.def(self <= self)
|
||||||
|
|
@ -2534,7 +2530,7 @@ void export_value()
|
||||||
.def(self <= other<balance_t>())
|
.def(self <= other<balance_t>())
|
||||||
.def(self <= other<amount_t>())
|
.def(self <= other<amount_t>())
|
||||||
.def(self <= long())
|
.def(self <= long())
|
||||||
.def(self <= other<datetime_t>())
|
.def(self <= other<ptime>())
|
||||||
.def(self <= double())
|
.def(self <= double())
|
||||||
|
|
||||||
.def(other<std::string>() <= self)
|
.def(other<std::string>() <= self)
|
||||||
|
|
@ -2542,7 +2538,7 @@ void export_value()
|
||||||
.def(other<balance_t>() <= self)
|
.def(other<balance_t>() <= self)
|
||||||
.def(other<amount_t>() <= self)
|
.def(other<amount_t>() <= self)
|
||||||
.def(long() <= self)
|
.def(long() <= self)
|
||||||
.def(other<datetime_t>() <= self)
|
.def(other<ptime>() <= self)
|
||||||
.def(double() <= self)
|
.def(double() <= self)
|
||||||
|
|
||||||
.def(self > self)
|
.def(self > self)
|
||||||
|
|
@ -2551,7 +2547,7 @@ void export_value()
|
||||||
.def(self > other<balance_t>())
|
.def(self > other<balance_t>())
|
||||||
.def(self > other<amount_t>())
|
.def(self > other<amount_t>())
|
||||||
.def(self > long())
|
.def(self > long())
|
||||||
.def(self > other<datetime_t>())
|
.def(self > other<ptime>())
|
||||||
.def(self > double())
|
.def(self > double())
|
||||||
|
|
||||||
.def(other<std::string>() > self)
|
.def(other<std::string>() > self)
|
||||||
|
|
@ -2559,7 +2555,7 @@ void export_value()
|
||||||
.def(other<balance_t>() > self)
|
.def(other<balance_t>() > self)
|
||||||
.def(other<amount_t>() > self)
|
.def(other<amount_t>() > self)
|
||||||
.def(long() > self)
|
.def(long() > self)
|
||||||
.def(other<datetime_t>() > self)
|
.def(other<ptime>() > self)
|
||||||
.def(double() > self)
|
.def(double() > self)
|
||||||
|
|
||||||
.def(self >= self)
|
.def(self >= self)
|
||||||
|
|
@ -2568,7 +2564,7 @@ void export_value()
|
||||||
.def(self >= other<balance_t>())
|
.def(self >= other<balance_t>())
|
||||||
.def(self >= other<amount_t>())
|
.def(self >= other<amount_t>())
|
||||||
.def(self >= long())
|
.def(self >= long())
|
||||||
.def(self >= other<datetime_t>())
|
.def(self >= other<ptime>())
|
||||||
.def(self >= double())
|
.def(self >= double())
|
||||||
|
|
||||||
.def(other<std::string>() >= self)
|
.def(other<std::string>() >= self)
|
||||||
|
|
@ -2576,7 +2572,7 @@ void export_value()
|
||||||
.def(other<balance_t>() >= self)
|
.def(other<balance_t>() >= self)
|
||||||
.def(other<amount_t>() >= self)
|
.def(other<amount_t>() >= self)
|
||||||
.def(long() >= self)
|
.def(long() >= self)
|
||||||
.def(other<datetime_t>() >= self)
|
.def(other<ptime>() >= self)
|
||||||
.def(double() >= self)
|
.def(double() >= self)
|
||||||
|
|
||||||
.def(self == self)
|
.def(self == self)
|
||||||
|
|
@ -2585,7 +2581,7 @@ void export_value()
|
||||||
.def(self == other<balance_t>())
|
.def(self == other<balance_t>())
|
||||||
.def(self == other<amount_t>())
|
.def(self == other<amount_t>())
|
||||||
.def(self == long())
|
.def(self == long())
|
||||||
.def(self == other<datetime_t>())
|
.def(self == other<ptime>())
|
||||||
.def(self == double())
|
.def(self == double())
|
||||||
|
|
||||||
.def(other<std::string>() == self)
|
.def(other<std::string>() == self)
|
||||||
|
|
@ -2593,7 +2589,7 @@ void export_value()
|
||||||
.def(other<balance_t>() == self)
|
.def(other<balance_t>() == self)
|
||||||
.def(other<amount_t>() == self)
|
.def(other<amount_t>() == self)
|
||||||
.def(long() == self)
|
.def(long() == self)
|
||||||
.def(other<datetime_t>() == self)
|
.def(other<ptime>() == self)
|
||||||
.def(double() == self)
|
.def(double() == self)
|
||||||
|
|
||||||
.def(self != self)
|
.def(self != self)
|
||||||
|
|
@ -2602,7 +2598,7 @@ void export_value()
|
||||||
.def(self != other<balance_t>())
|
.def(self != other<balance_t>())
|
||||||
.def(self != other<amount_t>())
|
.def(self != other<amount_t>())
|
||||||
.def(self != long())
|
.def(self != long())
|
||||||
.def(self != other<datetime_t>())
|
.def(self != other<ptime>())
|
||||||
.def(self != double())
|
.def(self != double())
|
||||||
|
|
||||||
.def(other<std::string>() != self)
|
.def(other<std::string>() != self)
|
||||||
|
|
@ -2610,7 +2606,7 @@ void export_value()
|
||||||
.def(other<balance_t>() != self)
|
.def(other<balance_t>() != self)
|
||||||
.def(other<amount_t>() != self)
|
.def(other<amount_t>() != self)
|
||||||
.def(long() != self)
|
.def(long() != self)
|
||||||
.def(other<datetime_t>() != self)
|
.def(other<ptime>() != self)
|
||||||
.def(double() != self)
|
.def(double() != self)
|
||||||
|
|
||||||
.def(! self)
|
.def(! self)
|
||||||
|
|
|
||||||
96
value.h
96
value.h
|
|
@ -63,9 +63,9 @@ class value_t
|
||||||
*((long *) data) = val;
|
*((long *) data) = val;
|
||||||
type = INTEGER;
|
type = INTEGER;
|
||||||
}
|
}
|
||||||
value_t(const datetime_t val) {
|
value_t(const ptime val) {
|
||||||
TRACE_CTOR("value_t(const datetime_t)");
|
TRACE_CTOR("value_t(const ptime)");
|
||||||
*((datetime_t *) data) = val;
|
*((ptime *) data) = val;
|
||||||
type = DATETIME;
|
type = DATETIME;
|
||||||
}
|
}
|
||||||
value_t(const unsigned long val) {
|
value_t(const unsigned long val) {
|
||||||
|
|
@ -144,10 +144,10 @@ class value_t
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value_t& operator=(const datetime_t val) {
|
value_t& operator=(const ptime val) {
|
||||||
if ((datetime_t *) data != &val) {
|
if ((ptime *) data != &val) {
|
||||||
destroy();
|
destroy();
|
||||||
*((datetime_t *) data) = val;
|
*((ptime *) data) = val;
|
||||||
type = DATETIME;
|
type = DATETIME;
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
|
|
@ -276,7 +276,7 @@ class value_t
|
||||||
|
|
||||||
bool to_boolean() const;
|
bool to_boolean() const;
|
||||||
long to_integer() const;
|
long to_integer() const;
|
||||||
datetime_t to_datetime() const;
|
ptime to_datetime() const;
|
||||||
amount_t to_amount() const;
|
amount_t to_amount() const;
|
||||||
balance_t to_balance() const;
|
balance_t to_balance() const;
|
||||||
balance_pair_t to_balance_pair() const;
|
balance_pair_t to_balance_pair() const;
|
||||||
|
|
@ -417,7 +417,7 @@ class value_t
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *((long *) data) == 0;
|
return *((long *) data) == 0;
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return ! *((datetime_t *) data);
|
return ((ptime *) data)->is_not_a_date_time();
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
return ((amount_t *) data)->realzero();
|
return ((amount_t *) data)->realzero();
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
|
|
@ -450,7 +450,7 @@ class value_t
|
||||||
const bool keep_tag = amount_t::keep_tag) const;
|
const bool keep_tag = amount_t::keep_tag) const;
|
||||||
|
|
||||||
value_t& add(const amount_t& amount, const amount_t * cost = NULL);
|
value_t& add(const amount_t& amount, const amount_t * cost = NULL);
|
||||||
value_t value(const datetime_t& moment) const;
|
value_t value(const ptime& moment) const;
|
||||||
void reduce();
|
void reduce();
|
||||||
|
|
||||||
value_t reduced() const {
|
value_t reduced() const {
|
||||||
|
|
@ -466,35 +466,57 @@ class value_t
|
||||||
const int latter_width = -1) const;
|
const int latter_width = -1) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEF_VALUE_AUX_OP(OP) \
|
#define DEFINE_VALUE_OPERATORS(T, OP) \
|
||||||
inline value_t operator OP(const balance_pair_t& val, \
|
inline value_t operator OP(const T& val, const value_t& obj) { \
|
||||||
const value_t& obj) { \
|
|
||||||
return value_t(val) OP obj; \
|
return value_t(val) OP obj; \
|
||||||
} \
|
}
|
||||||
inline value_t operator OP(const balance_t& val, \
|
|
||||||
const value_t& obj) { \
|
|
||||||
return value_t(val) OP obj; \
|
|
||||||
} \
|
|
||||||
inline value_t operator OP(const amount_t& val, \
|
|
||||||
const value_t& obj) { \
|
|
||||||
return value_t(val) OP obj; \
|
|
||||||
} \
|
|
||||||
template <typename T> \
|
|
||||||
inline value_t operator OP(T val, const value_t& obj) { \
|
|
||||||
return value_t(val) OP obj; \
|
|
||||||
}
|
|
||||||
|
|
||||||
DEF_VALUE_AUX_OP(+)
|
DEFINE_VALUE_OPERATORS(bool, ==)
|
||||||
DEF_VALUE_AUX_OP(-)
|
DEFINE_VALUE_OPERATORS(bool, !=)
|
||||||
DEF_VALUE_AUX_OP(*)
|
|
||||||
DEF_VALUE_AUX_OP(/)
|
|
||||||
|
|
||||||
DEF_VALUE_AUX_OP(<)
|
DEFINE_VALUE_OPERATORS(long, +)
|
||||||
DEF_VALUE_AUX_OP(<=)
|
DEFINE_VALUE_OPERATORS(long, -)
|
||||||
DEF_VALUE_AUX_OP(>)
|
DEFINE_VALUE_OPERATORS(long, *)
|
||||||
DEF_VALUE_AUX_OP(>=)
|
DEFINE_VALUE_OPERATORS(long, /)
|
||||||
DEF_VALUE_AUX_OP(==)
|
DEFINE_VALUE_OPERATORS(long, <)
|
||||||
DEF_VALUE_AUX_OP(!=)
|
DEFINE_VALUE_OPERATORS(long, <=)
|
||||||
|
DEFINE_VALUE_OPERATORS(long, >)
|
||||||
|
DEFINE_VALUE_OPERATORS(long, >=)
|
||||||
|
DEFINE_VALUE_OPERATORS(long, ==)
|
||||||
|
DEFINE_VALUE_OPERATORS(long, !=)
|
||||||
|
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, +)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, -)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, *)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, /)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, <)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, <=)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, >)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, >=)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, ==)
|
||||||
|
DEFINE_VALUE_OPERATORS(amount_t, !=)
|
||||||
|
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, +)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, -)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, *)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, /)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, <)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, <=)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, >)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, >=)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, ==)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_t, !=)
|
||||||
|
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, +)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, -)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, *)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, /)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, <)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, <=)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, >)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, >=)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, ==)
|
||||||
|
DEFINE_VALUE_OPERATORS(balance_pair_t, !=)
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
value_t::operator T() const
|
value_t::operator T() const
|
||||||
|
|
@ -505,7 +527,7 @@ value_t::operator T() const
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *(long *) data;
|
return *(long *) data;
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
return *(datetime_t *) data;
|
return *(ptime *) data;
|
||||||
case AMOUNT:
|
case AMOUNT:
|
||||||
return *(amount_t *) data;
|
return *(amount_t *) data;
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
|
|
@ -529,7 +551,7 @@ value_t::operator T() const
|
||||||
|
|
||||||
template <> value_t::operator bool() const;
|
template <> value_t::operator bool() const;
|
||||||
template <> value_t::operator long() const;
|
template <> value_t::operator long() const;
|
||||||
template <> value_t::operator datetime_t() const;
|
template <> value_t::operator ptime() const;
|
||||||
template <> value_t::operator double() const;
|
template <> value_t::operator double() const;
|
||||||
template <> value_t::operator std::string() const;
|
template <> value_t::operator std::string() const;
|
||||||
|
|
||||||
|
|
|
||||||
1
xml.cc
1
xml.cc
|
|
@ -1,6 +1,5 @@
|
||||||
#include "xml.h"
|
#include "xml.h"
|
||||||
#include "journal.h"
|
#include "journal.h"
|
||||||
#include "datetime.h"
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue