LangString.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <lang/LangString.h>
00022 #include <common/DefinesString.h>
00023 
00024 LangStringConverter::LangStringConverter(const char *value)
00025 {
00026         appendValue(value);
00027 }
00028 
00029 LangStringConverter::LangStringConverter(const std::string &value)
00030 {
00031         appendValue(value);
00032 }
00033 
00034 LangStringConverter::LangStringConverter(const LangString &value) :
00035         value_(value)
00036 {
00037 }
00038 
00039 LangStringConverter::LangStringConverter(const int value)
00040 {
00041         appendValue(S3D::formatStringBuffer("%i", value));
00042 }
00043 
00044 LangStringConverter::LangStringConverter(const unsigned int value)
00045 {
00046         appendValue(S3D::formatStringBuffer("%u", value));
00047 }
00048 
00049 LangStringConverter::LangStringConverter(const float value, int decimal)
00050 {
00051         switch (decimal)
00052         {
00053         case 1:
00054                 appendValue(S3D::formatStringBuffer("%.1f", value));
00055                 break;
00056         case 2:
00057                 appendValue(S3D::formatStringBuffer("%.2f", value));
00058                 break;
00059         default:
00060                 appendValue(S3D::formatStringBuffer("%.0f", value));
00061                 break;
00062         }
00063 }
00064 
00065 void LangStringConverter::appendValue(const std::string &input)
00066 {
00067         for (const char *i=input.c_str(); *i; i++)
00068         {
00069                 if (*i == '\\')
00070                 {
00071                         const unsigned int next = *(i+1);
00072                         switch (next)
00073                         {
00074                         case '\\':
00075                                 value_.push_back('\\');
00076                                 i++;
00077                                 break;
00078                         case 'n':
00079                                 value_.push_back('\n');
00080                                 i++;
00081                                 break;
00082                         case 't':
00083                                 value_.push_back('\t');
00084                                 i++;
00085                                 break;
00086                         case 'u':
00087                                 {
00088                                         char a[] = { *(i+2), *(i+3), *(i+4), *(i+5), '\0' };
00089                                         unsigned int value;
00090                                         sscanf(a, "%04X", &value);
00091                                         value_.push_back(value);
00092                                         i+=5;
00093                                 }
00094                                 break;
00095                         }
00096                 }
00097                 else
00098                 {
00099                         value_.push_back(*i);
00100                 }
00101         }
00102 }
00103 
00104 std::string LangStringConverter::getValueAsString()
00105 {
00106         std::string result;
00107         for (const unsigned int *i=value_.c_str(); *i; i++)
00108         {
00109                 if (*i < 32 || *i > 126)
00110                 {
00111                         if (*i == '\n') result.append("\\n");
00112                         else if (*i == '\\') result.append("\\\\");
00113                         else if (*i == '\n') result.append("\\t");
00114                         else result.append(S3D::formatStringBuffer("\\u%04X", *i));
00115                 }
00116                 else
00117                 {
00118                         result.push_back((char) *i);
00119                 }
00120         }
00121         
00122         return result;
00123 }
00124 
00125 LangString LangStringUtil::convertToLang(const LangStringConverter &input)
00126 {
00127         return input.getValue();
00128 }
00129 
00130 void LangStringUtil::appendToLang(LangString &output, const LangStringConverter &input)
00131 {
00132         output.append(input.getValue());
00133 }
00134 
00135 void LangStringUtil::replaceToLang(LangString &output, const LangStringConverter &input)
00136 {
00137         output.clear();
00138         output.append(input.getValue());
00139 }
00140 
00141 std::string LangStringUtil::convertFromLang(const LangString &input)
00142 {
00143         LangStringConverter converter(input);
00144         return converter.getValueAsString();
00145 }
00146 
00147 void LangStringUtil::lowercase(LangString &str1)
00148 {
00149         for (unsigned int *c=(unsigned int *) str1.c_str(); *c; c++)
00150         {
00151                 if (*c >= 'A' || *c <='Z') *c += 'a' - 'A';
00152         }
00153 }
00154 
00155 int LangStringUtil::strcmp(const LangString &str1, const LangString &str2)
00156 {
00157         if (str1.size() < str2.size()) return -1;
00158         if (str1.size() > str2.size()) return 1;
00159 
00160         for (const unsigned int *c1 = str1.c_str(),
00161                 *c2 = str2.c_str();
00162                 *c1, *c2;
00163                 c1++, c2++)
00164         {
00165                 if (c1 < c2) return -1;
00166                 if (c1 > c2) return 1;
00167         }
00168 
00169         return 0;
00170         
00171         return (str1 == str2)?0:1;
00172 }
00173 
00174 int LangStringUtil::strcasecmp(const LangString &str1, const LangString &str2)
00175 {
00176         LangString str1l(str1);
00177         LangString str2l(str2);
00178         lowercase(str1l);
00179         lowercase(str2l);
00180         return strcmp(str1l, str2l);
00181 }
00182 
00183 int LangStringUtil::strlen(const LangString &str1)
00184 {
00185         return (int) str1.size();
00186 }
00187 
00188 unsigned int *LangStringUtil::strstr(const unsigned int *str1, const LangString &str2)
00189 {
00190         unsigned int pos = LangString(str1).find(str2);
00191         if (pos == LangString::npos) return 0;
00192         return (unsigned int*)(str1 + pos);
00193 }
00194 
00195 unsigned int *LangStringUtil::stristr(const unsigned int *str1, const LangString &str2)
00196 {
00197         LangString str1l(str1);
00198         LangString str2l(str2);
00199         lowercase(str1l);
00200         lowercase(str2l);
00201         unsigned int pos = str1l.find(str2l);
00202         if (pos == LangString::npos) return 0;
00203         return (unsigned int*)(str1 + pos);
00204 }
00205 
00206 void LangStringUtil::trim(LangString &value)
00207 {
00208         int start = value.find_first_not_of(LANG_STRING(" \t\n"));
00209         int end = value.find_last_not_of(LANG_STRING(" \t\n"));
00210         if (start == LangString::npos) value.clear();
00211         else if (end == LangString::npos) value.clear();
00212         else value = LangString(value, start, end-start+1);
00213 }

Generated on Mon Feb 16 15:14:50 2009 for Scorched3D by  doxygen 1.5.3