X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2FTermlib%2FTerminfo.cc;h=a3ae123609094b3bed958afbfc4d428382a8d8bc;hb=refs%2Fheads%2Fmaster;hp=83459b150f9298e143e5431f47422f0697f4cb73;hpb=9cb871b939efe93e35dd96808d25089399acfc46;p=senf.git diff --git a/senf/Utils/Termlib/Terminfo.cc b/senf/Utils/Termlib/Terminfo.cc index 83459b1..a3ae123 100644 --- a/senf/Utils/Termlib/Terminfo.cc +++ b/senf/Utils/Termlib/Terminfo.cc @@ -2,23 +2,28 @@ // // Copyright (C) 2009 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Stefan Bund // -// 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 2 of the License, or -// (at your option) any later version. +// The contents of this file are subject to the Fraunhofer FOKUS Public License +// Version 1.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://senf.berlios.de/license.html // -// 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. +// The Fraunhofer FOKUS Public License Version 1.0 is based on, +// but modifies the Mozilla Public License Version 1.1. +// See the full license text for the amendments. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the License. +// +// The Original Code is Fraunhofer FOKUS code. +// +// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. +// (registered association), Hansastraße 27 c, 80686 Munich, Germany. +// All Rights Reserved. +// +// Contributor(s): +// Stefan Bund /** \file \brief Terminfo non-inline non-template implementation */ @@ -37,7 +42,7 @@ //#include "Terminfo.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// char const * const senf::term::Terminfo::properties::BooleanNames [] = { "AutoLeftMargin", "AutoRightMargin", "NoEscCtlc", "CeolStandoutGlitch", "EatNewlineGlitch", @@ -126,9 +131,16 @@ char const * const senf::term::Terminfo::properties::StringNames[] = { "AcsUlcorner", "AcsLlcorner", "AcsUrcorner", "AcsLrcorner", "AcsLtee", "AcsRtee", "AcsBtee", "AcsTtee", "AcsHline", "AcsVline", "AcsPlus", "MemoryLock", "MemoryUnlock", "BoxChars1" }; -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::term::Terminfo +prefix_ senf::term::Terminfo::InvalidTerminfoException::InvalidTerminfoException(std::string const & term) + : senf::Exception("Unreadable terminfo file") +{ + if (!term.empty()) + append( ": " + term); +} + prefix_ senf::term::Terminfo::Terminfo() {} @@ -140,10 +152,15 @@ prefix_ senf::term::Terminfo::Terminfo(std::string const & term) prefix_ void senf::term::Terminfo::load(std::string const & term) { std::string filename (findTerminfo(term)); - if (filename.empty()) throw InvalidTerminfoException(); + if (filename.empty()) throw InvalidTerminfoException(term); std::ifstream is (filename.c_str()); - if (!is) throw InvalidTerminfoException(); - load(is); + if (!is) throw InvalidTerminfoException(filename); + try { + load(is); + } catch (InvalidTerminfoException & ex) { + ex << ": " << filename; + throw ex; + } } prefix_ bool senf::term::Terminfo::getFlag(properties::Boolean p) @@ -367,18 +384,18 @@ prefix_ std::string senf::term::Terminfo::findTerminfo(std::string const & name) char const * tivar (::getenv("TERMINFO")); if (tivar) { tientry = boost::filesystem::path(tivar) / subdir; - if (boost::filesystem::exists(tientry)) return tientry.native_file_string(); + if (boost::filesystem::exists(tientry)) return tientry.string(); } } tientry = boost::filesystem::path("/etc/terminfo") / subdir; - if (boost::filesystem::exists(tientry)) return tientry.native_file_string(); + if (boost::filesystem::exists(tientry)) return tientry.string(); tientry = boost::filesystem::path("/lib/terminfo") / subdir; - if (boost::filesystem::exists(tientry)) return tientry.native_file_string(); + if (boost::filesystem::exists(tientry)) return tientry.string(); tientry = boost::filesystem::path("/usr/share/terminfo") / subdir; - if (boost::filesystem::exists(tientry)) return tientry.native_file_string(); + if (boost::filesystem::exists(tientry)) return tientry.string(); return ""; } @@ -394,6 +411,15 @@ namespace { boost::uint16_t nNumbers; boost::uint16_t nStrings; boost::uint16_t stringPoolSz; + + void letoh() { + magic = le16toh(magic); + namesSz = le16toh(namesSz); + nBooleans = le16toh(nBooleans); + nNumbers = le16toh(nNumbers); + nStrings = le16toh(nStrings); + stringPoolSz = le16toh(stringPoolSz); + } }; } @@ -402,7 +428,9 @@ prefix_ void senf::term::Terminfo::load(std::istream & is) { TerminfoHeader h; is.read(static_cast(static_cast(&h)), sizeof(h)); - if (!is || h.magic != TerminfoMagic) throw InvalidTerminfoException(); + h.letoh(); + if (!is || h.magic != TerminfoMagic) throw InvalidTerminfoException( + "invalid magic number (") << h.magic << "!=" << TerminfoMagic << ")"; name_.resize(h.namesSz); is.read(&(name_[0]), name_.size()); @@ -440,7 +468,7 @@ prefix_ void senf::term::Terminfo::load(std::istream & is) number_t v; is.read(static_cast(static_cast(&v)), sizeof(v)); if (!is) throw InvalidTerminfoException(); - *i = v; + *i = le16toh(v); } stringPool_.resize(h.stringPoolSz); @@ -456,7 +484,7 @@ prefix_ void senf::term::Terminfo::load(std::istream & is) *j = 0; } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::term::KeyParser char const * const senf::term::KeyParser::KeyNames[] = { @@ -605,7 +633,7 @@ prefix_ void senf::term::KeyParser::dump(std::ostream & os) } } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "Terminfo.mpp"