diff options
author | Tim Crews <tim@code-affinity.com> | 2013-06-14 21:29:47 -0700 |
---|---|---|
committer | Tim Crews <tim@code-affinity.com> | 2013-06-14 21:29:47 -0700 |
commit | 0dbb38fe27e81790451a8233c5959e0fe26dc5ee (patch) | |
tree | 0af89e3e10e5c4fe7de0070e9e6ccc6cb8ee7d93 | |
parent | fe810fa13f1e814e69dee2484c8b2878d5101d6c (diff) | |
download | fork-ledger-0dbb38fe27e81790451a8233c5959e0fe26dc5ee.tar.gz fork-ledger-0dbb38fe27e81790451a8233c5959e0fe26dc5ee.tar.bz2 fork-ledger-0dbb38fe27e81790451a8233c5959e0fe26dc5ee.zip |
Source changes needed for Microsoft Visual C++ compatibility.
Includes an implementation of strptime, compiled only for Win32 platform.
-rw-r--r-- | src/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/account.h | 4 | ||||
-rw-r--r-- | src/history.cc | 4 | ||||
-rw-r--r-- | src/strptime.cpp | 189 | ||||
-rw-r--r-- | src/strptime.h | 6 | ||||
-rw-r--r-- | src/times.cc | 4 |
6 files changed, 206 insertions, 5 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2d6b22f7..9fd7d295 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,7 +48,8 @@ set(LEDGER_SOURCES mask.cc times.cc error.cc - utils.cc) + utils.cc + strptime.cc) if(HAVE_BOOST_PYTHON) list(APPEND LEDGER_SOURCES @@ -130,6 +131,7 @@ set(LEDGER_INCLUDES value.h views.h xact.h + strptime.h ${PROJECT_BINARY_DIR}/system.hh) if(CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/src/account.h b/src/account.h index 7b53de15..daeee038 100644 --- a/src/account.h +++ b/src/account.h @@ -128,11 +128,11 @@ public: accounts_map_seconds_iterator accounts_begin() { return make_transform_iterator - (accounts.begin(), bind(&accounts_map::value_type::second, _1)); + (accounts.begin(), boost::bind(&accounts_map::value_type::second, _1)); } accounts_map_seconds_iterator accounts_end() { return make_transform_iterator - (accounts.end(), bind(&accounts_map::value_type::second, _1)); + (accounts.end(), boost::bind(&accounts_map::value_type::second, _1)); } void add_post(post_t * post); diff --git a/src/history.cc b/src/history.cc index dde8c441..93883ae0 100644 --- a/src/history.cc +++ b/src/history.cc @@ -334,7 +334,7 @@ void commodity_history_impl_t::map_prices( FNameMap namemap(get(vertex_name, fg)); graph_traits<FGraph>::adjacency_iterator f_vi, f_vend; - for (tie(f_vi, f_vend) = adjacent_vertices(sv, fg); f_vi != f_vend; ++f_vi) { + for (boost::tuples::tie(f_vi, f_vend) = adjacent_vertices(sv, fg); f_vi != f_vend; ++f_vi) { std::pair<Graph::edge_descriptor, bool> edgePair = edge(sv, *f_vi, fg); Graph::edge_descriptor edge = edgePair.first; @@ -392,7 +392,7 @@ commodity_history_impl_t::find_price(const commodity_t& source, amount_t price; graph_traits<FGraph>::adjacency_iterator f_vi, f_vend; - for (tie(f_vi, f_vend) = adjacent_vertices(sv, fg); f_vi != f_vend; ++f_vi) { + for (boost::tuples::tie(f_vi, f_vend) = adjacent_vertices(sv, fg); f_vi != f_vend; ++f_vi) { std::pair<Graph::edge_descriptor, bool> edgePair = edge(sv, *f_vi, fg); Graph::edge_descriptor edge = edgePair.first; diff --git a/src/strptime.cpp b/src/strptime.cpp new file mode 100644 index 00000000..b64af96b --- /dev/null +++ b/src/strptime.cpp @@ -0,0 +1,189 @@ +// Copyright 2009 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +#ifdef WIN32 +// Implement strptime under windows + +#include "strptime.h" + +#include <time.h> +#include <ctype.h> +#include <string.h> + +static const char* kWeekFull[] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" +}; + +static const char* kWeekAbbr[] = { + "Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat" +}; + +static const char* kMonthFull[] = { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" +}; + +static const char* kMonthAbbr[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +static const char* _parse_num(const char* s, int low, int high, int* value) { + const char* p = s; + for (*value = 0; *p != NULL && isdigit(*p); ++p) { + *value = (*value) * 10 + static_cast<int>(*p) - static_cast<int>('0'); + } + + if (p == s || *value < low || *value > high) return NULL; + return p; +} + +static char* _strptime(const char *s, const char *format, struct tm *tm) { + while (*format != NULL && *s != NULL) { + if (*format != '%') { + if (*s != *format) return NULL; + + ++format; + ++s; + continue; + } + + ++format; + int len = 0; + switch (*format) { + // weekday name. + case 'a': + case 'A': + tm->tm_wday = -1; + for (int i = 0; i < 7; ++i) { + len = static_cast<int>(strlen(kWeekAbbr[i])); + if (strnicmp(kWeekAbbr[i], s, len) == 0) { + tm->tm_wday = i; + break; + } + + len = static_cast<int>(strlen(kWeekFull[i])); + if (strnicmp(kWeekFull[i], s, len) == 0) { + tm->tm_wday = i; + break; + } + } + if (tm->tm_wday == -1) return NULL; + s += len; + break; + + // month name. + case 'b': + case 'B': + case 'h': + tm->tm_mon = -1; + for (int i = 0; i < 12; ++i) { + len = static_cast<int>(strlen(kMonthAbbr[i])); + if (strnicmp(kMonthAbbr[i], s, len) == 0) { + tm->tm_mon = i; + break; + } + + len = static_cast<int>(strlen(kMonthFull[i])); + if (strnicmp(kMonthFull[i], s, len) == 0) { + tm->tm_mon = i; + break; + } + } + if (tm->tm_mon == -1) return NULL; + s += len; + break; + + // month [1, 12]. + case 'm': + s = _parse_num(s, 1, 12, &tm->tm_mon); + if (s == NULL) return NULL; + --tm->tm_mon; + break; + + // day [1, 31]. + case 'd': + case 'e': + s = _parse_num(s, 1, 31, &tm->tm_mday); + if (s == NULL) return NULL; + break; + + // hour [0, 23]. + case 'H': + s = _parse_num(s, 0, 23, &tm->tm_hour); + if (s == NULL) return NULL; + break; + + // minute [0, 59] + case 'M': + s = _parse_num(s, 0, 59, &tm->tm_min); + if (s == NULL) return NULL; + break; + + // seconds [0, 60]. 60 is for leap year. + case 'S': + s = _parse_num(s, 0, 60, &tm->tm_sec); + if (s == NULL) return NULL; + break; + + // year [1900, 9999]. + case 'Y': + s = _parse_num(s, 1900, 9999, &tm->tm_year); + if (s == NULL) return NULL; + tm->tm_year -= 1900; + break; + + // year [0, 99]. + case 'y': + s = _parse_num(s, 0, 99, &tm->tm_year); + if (s == NULL) return NULL; + if (tm->tm_year <= 68) { + tm->tm_year += 100; + } + break; + + // arbitray whitespace. + case 't': + case 'n': + while (isspace(*s)) ++s; + break; + + // '%'. + case '%': + if (*s != '%') return NULL; + ++s; + break; + + // All the other format are not supported. + default: + return NULL; + } + ++format; + } + + if (*format != NULL) { + return NULL; + } else { + return const_cast<char*>(s); + } +} + +char* strptime(const char *buf, const char *fmt, struct tm *tm) { + return _strptime(buf, fmt, tm); +} + +#endif // WIN32 diff --git a/src/strptime.h b/src/strptime.h new file mode 100644 index 00000000..f5482201 --- /dev/null +++ b/src/strptime.h @@ -0,0 +1,6 @@ +#ifndef STRPTIME_H +#define STRPTIME_H + +char* strptime(const char *buf, const char *fmt, struct tm *tm); + +#endif
\ No newline at end of file diff --git a/src/times.cc b/src/times.cc index f9a6c279..b1cb3494 100644 --- a/src/times.cc +++ b/src/times.cc @@ -33,6 +33,10 @@ #include "times.h" +#ifdef WIN32 +#include "strptime.h" +#endif + namespace ledger { optional<datetime_t> epoch; |