diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/abbrev.cc | 94 | ||||
-rw-r--r-- | src/abbrev.h | 23 | ||||
-rw-r--r-- | src/register.cc | 196 | ||||
-rw-r--r-- | src/register.h | 69 |
4 files changed, 117 insertions, 265 deletions
diff --git a/src/abbrev.cc b/src/abbrev.cc new file mode 100644 index 00000000..089b8342 --- /dev/null +++ b/src/abbrev.cc @@ -0,0 +1,94 @@ +#include "abbrev.h" + +namespace ledger { + +string abbreviate(const string& str, + unsigned int width, + elision_style_t elision_style, + const bool is_account, + int abbrev_length) +{ + const unsigned int len = str.length(); + if (len <= width) + return str; + + assert(width < 4095); + + static char buf[4096]; + + switch (elision_style) { + case TRUNCATE_LEADING: + // This method truncates at the beginning. + std::strncpy(buf, str.c_str() + (len - width), width); + buf[0] = '.'; + buf[1] = '.'; + break; + + case TRUNCATE_MIDDLE: + // This method truncates in the middle. + std::strncpy(buf, str.c_str(), width / 2); + std::strncpy(buf + width / 2, + str.c_str() + (len - (width / 2 + width % 2)), + width / 2 + width % 2); + buf[width / 2 - 1] = '.'; + buf[width / 2] = '.'; + break; + + case ABBREVIATE: + if (is_account) { + std::list<string> parts; + string::size_type beg = 0; + for (string::size_type pos = str.find(':'); + pos != string::npos; + beg = pos + 1, pos = str.find(':', beg)) + parts.push_back(string(str, beg, pos - beg)); + parts.push_back(string(str, beg)); + + string result; + unsigned int newlen = len; + for (std::list<string>::iterator i = parts.begin(); + i != parts.end(); + i++) { + // Don't contract the last element + std::list<string>::iterator x = i; + if (++x == parts.end()) { + result += *i; + break; + } + + if (newlen > width) { + result += string(*i, 0, abbrev_length); + result += ":"; + newlen -= (*i).length() - abbrev_length; + } else { + result += *i; + result += ":"; + } + } + + if (newlen > width) { + // Even abbreviated its too big to show the last account, so + // abbreviate all but the last and truncate at the beginning. + std::strncpy(buf, result.c_str() + (result.length() - width), width); + buf[0] = '.'; + buf[1] = '.'; + } else { + std::strcpy(buf, result.c_str()); + } + break; + } + // fall through... + + case TRUNCATE_TRAILING: + // This method truncates at the end (the default). + std::strncpy(buf, str.c_str(), width - 2); + buf[width - 2] = '.'; + buf[width - 1] = '.'; + break; + } + buf[width] = '\0'; + + return buf; +} + +} // namespace ledger diff --git a/src/abbrev.h b/src/abbrev.h new file mode 100644 index 00000000..ad880e45 --- /dev/null +++ b/src/abbrev.h @@ -0,0 +1,23 @@ +#ifndef _ABBREV_H +#define _ABBREV_H + +#include "utils.h" + +namespace ledger { + +enum elision_style_t { + TRUNCATE_TRAILING, + TRUNCATE_MIDDLE, + TRUNCATE_LEADING, + ABBREVIATE +}; + +string abbreviate(const string& str, + unsigned int width, + elision_style_t elision_style = TRUNCATE_TRAILING, + const bool is_account = false, + int abbrev_length = 2); + +} // namespace ledger + +#endif // _ABBREV_H diff --git a/src/register.cc b/src/register.cc deleted file mode 100644 index 98aafee1..00000000 --- a/src/register.cc +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2003-2007, John Wiegley. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of New Artisans LLC nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "register.h" -#include "journal.h" - -namespace ledger { - -string abbreviate(const string& str, - unsigned int width, - elision_style_t elision_style, - const bool is_account, - int abbrev_length) -{ - const unsigned int len = str.length(); - if (len <= width) - return str; - - assert(width < 4095); - - static char buf[4096]; - - switch (elision_style) { - case TRUNCATE_LEADING: - // This method truncates at the beginning. - std::strncpy(buf, str.c_str() + (len - width), width); - buf[0] = '.'; - buf[1] = '.'; - break; - - case TRUNCATE_MIDDLE: - // This method truncates in the middle. - std::strncpy(buf, str.c_str(), width / 2); - std::strncpy(buf + width / 2, - str.c_str() + (len - (width / 2 + width % 2)), - width / 2 + width % 2); - buf[width / 2 - 1] = '.'; - buf[width / 2] = '.'; - break; - - case ABBREVIATE: - if (is_account) { - std::list<string> parts; - string::size_type beg = 0; - for (string::size_type pos = str.find(':'); - pos != string::npos; - beg = pos + 1, pos = str.find(':', beg)) - parts.push_back(string(str, beg, pos - beg)); - parts.push_back(string(str, beg)); - - string result; - unsigned int newlen = len; - for (std::list<string>::iterator i = parts.begin(); - i != parts.end(); - i++) { - // Don't contract the last element - std::list<string>::iterator x = i; - if (++x == parts.end()) { - result += *i; - break; - } - - if (newlen > width) { - result += string(*i, 0, abbrev_length); - result += ":"; - newlen -= (*i).length() - abbrev_length; - } else { - result += *i; - result += ":"; - } - } - - if (newlen > width) { - // Even abbreviated its too big to show the last account, so - // abbreviate all but the last and truncate at the beginning. - std::strncpy(buf, result.c_str() + (result.length() - width), width); - buf[0] = '.'; - buf[1] = '.'; - } else { - std::strcpy(buf, result.c_str()); - } - break; - } - // fall through... - - case TRUNCATE_TRAILING: - // This method truncates at the end (the default). - std::strncpy(buf, str.c_str(), width - 2); - buf[width - 2] = '.'; - buf[width - 1] = '.'; - break; - } - buf[width] = '\0'; - - return buf; -} - -static void scan_for_transactions(std::ostream& out, const xml::node_t * node) -{ -#if 0 - if (! node->has_flags(XML_NODE_IS_PARENT)) - return; - - foreach (const xml::node_t * child, node->as_parent_node()) { - if (child->name_id == xml::TRANSACTION_NODE) { - const xml::transaction_node_t * xact_node = - dynamic_cast<const xml::transaction_node_t *>(child); - assert(xact_node); - - const transaction_t * xact = xact_node->transaction; - assert(xact); - - out << xact->entry->date() << ' ' - << std::setw(21) << std::left - << abbreviate(xact->entry->payee, 21) << ' ' - << std::setw(21) << std::left - << abbreviate(xact->account->fullname(), 21, - ABBREVIATE, true) << ' ' - << std::setw(12) << std::right; - if (xact->amount) - out << *xact->amount; - out << '\n'; - } else { - scan_for_transactions(out, child); - } -#endif -} - -void register_command::print_document(std::ostream& out, - xml::document_t * doc) -{ -#if 1 - scan_for_transactions(out, doc); - out.flush(); -#else - value_t nodelist; - xml::xpath_t::eval(nodelist, "//transaction", doc); - - value_t::sequence_t& xact_list(nodelist.as_sequence()); - assert(xact_list); - - for (value_t::sequence_t::const_iterator i = xact_list->begin(); - i != xact_list->end(); - i++) { - const xml::node_t * node = (*i).as_xml_node(); - assert(node); - - const xml::transaction_node_t * xact_node = - dynamic_cast<const xml::transaction_node_t *>(node); - assert(xact_node); - - const transaction_t * xact = xact_node->transaction; - assert(xact); - - std::cout << xact->entry->date() << ' ' - << std::setw(21) << std::left - << abbreviate(xact->entry->payee, 21) << ' ' - << std::setw(21) << std::left - << abbreviate(xact->account->fullname(), 21, - ABBREVIATE, true) << ' ' - << std::setw(12) << std::right - << xact->amount - << std::endl; - } -#endif -} - -} // namespace ledger diff --git a/src/register.h b/src/register.h deleted file mode 100644 index 1956aaae..00000000 --- a/src/register.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2003-2007, John Wiegley. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of New Artisans LLC nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _REGISTER_H -#define _REGISTER_H - -#include "xpath.h" - -namespace ledger { - -class register_command : public xml::xpath_t::functor_t -{ - public: - register_command() : xml::xpath_t::functor_t("register") {} - - virtual void operator()(value_t&, xml::xpath_t::scope_t * locals) { - std::ostream * out = get_ptr<std::ostream>(locals, 0); - xml::document_t * doc = get_ptr<xml::document_t>(locals, 1); - - print_document(*out, doc); - } - - virtual void print_document(std::ostream& out, xml::document_t * doc); -}; - -enum elision_style_t { - TRUNCATE_TRAILING, - TRUNCATE_MIDDLE, - TRUNCATE_LEADING, - ABBREVIATE -}; - -string abbreviate(const string& str, - unsigned int width, - elision_style_t elision_style = TRUNCATE_TRAILING, - const bool is_account = false, - int abbrev_length = 2); - -} // namespace ledger - -#endif // _REGISTER_H |