// // aegis - project change supervisor // Copyright (C) 1999, 2003-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 #include #include #include #include #include #include #include #include static nstring standard_output_name(void) { static nstring name; if (name.empty()) { sub_context_ty sc; name = nstring(sc.subst_intl(i18n("standard output"))); } return name; } output_stdout::~output_stdout() { trace(("output_stdout::~output_stdout(this = %08lX)\n{\n", (long)this)); // // Make sure all buffered data has been passed to our write_inner // method. // flush(); trace(("}\n")); } output_stdout::output_stdout() : bol(true), pos(0) { trace(("output_stdout::output_stdout(this = %08lX)\n", (long)this)); } output::pointer output_stdout::create() { return pointer(new output_stdout()); } nstring output_stdout::filename() const { return standard_output_name(); } long output_stdout::ftell_inner() const { trace(("output_stdout::ftell_inner(this = %08lX) returns %ld\n", (long)this, pos)); return pos; } void output_stdout::write_inner(const void *data, size_t len) { trace(("output_stdout::write_inner(this = %08lX, data = %08lX, " "len = %ld)\n{\n", (long)this, (long)data, (long)len)); if (::write(fileno(stdout), data, len) < 0) { int errno_old = errno; sub_context_ty sc; sc.errno_setx(errno_old); sc.var_set_string("File_Name", standard_output_name()); sc.fatal_intl(i18n("write $filename: $errno")); // NOTREACHED } if (len > 0) bol = (((const char *)data)[len - 1] == '\n'); pos += len; trace(("pos = %ld\n", pos)); trace(("}\n")); } int output_stdout::page_width() const { struct stat st; if (fstat(fileno(stdout), &st) == 0 && S_ISREG(st.st_mode)) return page_width_get(DEFAULT_PRINTER_WIDTH); return page_width_get(-1) - 1; } int output_stdout::page_length() const { struct stat st; if (fstat(fileno(stdout), &st) == 0 && S_ISREG(st.st_mode)) return page_length_get(DEFAULT_PRINTER_LENGTH); return page_length_get(-1); } void output_stdout::end_of_line_inner() { trace(("output_stdout::end_of_line_inner(this = %08lX)\n{\n", (long)this)); if (!bol) fputc('\n'); trace(("pos = %ld\n", pos)); trace(("}\n")); } const char * output_stdout::type_name() const { return standard_output_name().c_str(); }