00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 }