summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/abbrev.cc94
-rw-r--r--src/abbrev.h23
-rw-r--r--src/register.cc196
-rw-r--r--src/register.h69
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