// // aegis - project change supervisor // Copyright (C) 1999-2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include wide_output_truncate::~wide_output_truncate() { flush(); if (!buf.empty()) deeper->write(buf.get_data(), buf.size()); } wide_output_truncate::wide_output_truncate(const wide_output::pointer &a_deeper, int a_width) : deeper(a_deeper), width(a_width <= 0 ? a_deeper->page_width() : a_width), column(0) { } wide_output::pointer wide_output_truncate::open(const wide_output::pointer &a_deeper, int a_width) { return pointer(new wide_output_truncate(a_deeper, a_width)); } nstring wide_output_truncate::filename() { return deeper->filename(); } void wide_output_truncate::write_inner(const wchar_t *data, size_t len) { language_human(); while (len > 0) { wchar_t wc = *data++; --len; switch (wc) { case L'\n': case L'\f': language_C(); if (!buf.empty()) { deeper->write(buf.get_data(), buf.size()); buf.clear(); } deeper->put_wc(wc); language_human(); column = 0; break; default: // // If we have already become too wide, don't // make the deeper unnecessary function calls. // if (column >= width) break; // // Only remember this_thing character if all of it // fits within the specified width. // int cwid = wcwidth(wc); if (column + cwid > width) break; // // Make room if necessary // buf.push_back(wc); column += cwid; break; } } language_C(); } void wide_output_truncate::flush_inner() { deeper->write(buf.get_data(), buf.size()); // DO NOT reset column } int wide_output_truncate::page_width() { return width; } int wide_output_truncate::page_length() { return deeper->page_length(); } void wide_output_truncate::end_of_line_inner() { if (column > 0) put_wc(L'\n'); } const char * wide_output_truncate::type_name() const { return "wide_output_truncate"; }