/* * Gnome Chemistry Utils * value.cc * * Copyright (C) 2002-2006 Jean Bréfort * * 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. * * 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #include "config.h" #include "value.h" #include #include using namespace gcu; Value::Value () { } Value::~Value () { } char const *Value::GetAsString () const { return ""; } double Value::GetAsDouble () const { return 0.; } SimpleValue::SimpleValue (): Value () { } SimpleValue::~SimpleValue () { } char const *SimpleValue::GetAsString () const { if (str.length () == 0) { char *buf = gcu_value_get_string (&val); const_cast (this)->str = buf; g_free (buf); } return str.c_str (); } double SimpleValue::GetAsDouble () const { return val.value; } DimensionalValue::DimensionalValue (): Value () { } DimensionalValue::~DimensionalValue () { } char const *DimensionalValue::GetAsString () const { if (str.length () == 0) { char *buf = gcu_dimensional_value_get_string (&val); const_cast (this)->str = buf; // this does not change the value. g_free (buf); } return str.c_str (); } double DimensionalValue::GetAsDouble () const { return val.value; } StringValue::StringValue () { } StringValue::~StringValue () { } char const *StringValue::GetAsString () const { return val.c_str (); } LocalizedStringValue::LocalizedStringValue () { } LocalizedStringValue::~LocalizedStringValue () { vals.clear (); } char const *LocalizedStringValue::GetAsString () const { char *lang = getenv ("LANG"); map ::const_iterator i, end = vals.end (); if (lang) { i = vals.find (lang); if (i == end || (*i).second.length () == 0) { lang = g_strdup (lang); char *dot = strchr (lang, '.'); if (dot) { *dot = 0; i = vals.find (lang); if (i == end || (*i).second.length () > 0) { g_free (lang); return (*i).second.c_str (); } } if (strlen (lang) > 2) { lang[2] = 0; i = vals.find (lang); if (i == end || (*i).second.length () > 0) { g_free (lang); return (*i).second.c_str (); } } g_free (lang); } else return (*i).second.c_str (); } // if we are there, try "C" or "en" locales i = vals.find ("C"); if (i != end && (*i).second.length () > 0) return (*i).second.c_str (); i = vals.find ("en"); if (i != end && (*i).second.length () > 0) return (*i).second.c_str (); // if not found, return first occurence or a void string if (vals.size () > 0) return (*vals.begin ()).second.c_str (); return ""; } char const *LocalizedStringValue::GetLocalizedString (char const *lang) const { string s; if (lang) s = const_cast (this)->vals[lang]; return (s.length () > 0)? s.c_str (): GetAsString (); }