00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "precomp.h"
00030 #include "string_format.h"
00031 #include "string_help.h"
00032 #include "exception.h"
00033
00035
00036
00037 CL_StringFormat::CL_StringFormat(const CL_String &format_string)
00038 : string(format_string)
00039 {
00040 bool arg_mode = false;
00041 int arg_start = 0;
00042 int arg_value = 0;
00043 int index, size;
00044 size = (int) string.size();
00045 for (index = 0; index < size; index++)
00046 {
00047 if (!arg_mode)
00048 {
00049 if (string[index] == TEXT('%'))
00050 {
00051 arg_mode = true;
00052 arg_value = 0;
00053 arg_start = index;
00054 }
00055 }
00056 else
00057 {
00058 switch (string[index])
00059 {
00060 case TEXT('%'):
00061 if (arg_start == index-1)
00062 {
00063 arg_mode = false;
00064 string = string.substr(0, index) + string.substr(index + 1);
00065 index--;
00066 size--;
00067 }
00068 else
00069 {
00070 create_arg(arg_value, arg_start, index-arg_start);
00071 arg_start = index;
00072 arg_value = 0;
00073 }
00074 break;
00075 case TEXT('0'):
00076 case TEXT('1'):
00077 case TEXT('2'):
00078 case TEXT('3'):
00079 case TEXT('4'):
00080 case TEXT('5'):
00081 case TEXT('6'):
00082 case TEXT('7'):
00083 case TEXT('8'):
00084 case TEXT('9'):
00085 arg_value *= 10;
00086 arg_value += string[index]-TEXT('0');
00087 break;
00088 default:
00089 if (arg_start != index-1)
00090 create_arg(arg_value, arg_start, index-arg_start);
00091 arg_mode = false;
00092 break;
00093 }
00094 }
00095 }
00096
00097 if (arg_mode && arg_start != size-1)
00098 create_arg(arg_value, arg_start, size-arg_start);
00099 }
00100
00101 CL_StringFormat::~CL_StringFormat()
00102 {
00103 }
00104
00106
00107
00108 const CL_String &CL_StringFormat::get_result() const
00109 {
00110 return string;
00111 }
00112
00114
00115
00116 void CL_StringFormat::set_arg(int index, const CL_StringA &text)
00117 {
00118 #ifdef UNICODE
00119 set_arg(index, CL_StringHelp::local8_to_ucs2(text));
00120 #else
00121 if (index >= (int) args.size())
00122 return;
00123
00124 ArgPosition pos = args[index];
00125 if (pos.length == 0)
00126 return;
00127
00128 int delta_size = ((int) text.length()) - pos.length;
00129 string = string.substr(0, pos.start) + text + string.substr(pos.start + pos.length);
00130 args[index].length = (int) text.length();
00131
00132 std::vector<ArgPosition>::size_type i, size;
00133 size = args.size();
00134 for (i = 0; i < size; i++)
00135 {
00136 if (args[i].start > pos.start)
00137 args[i].start += delta_size;
00138 }
00139 #endif
00140 }
00141
00142 void CL_StringFormat::set_arg(int index, const CL_StringW &text)
00143 {
00144 #ifdef UNICODE
00145 if (index >= args.size())
00146 return;
00147
00148 ArgPosition pos = args[index];
00149 if (pos.length == 0)
00150 return;
00151
00152 int delta_size = ((int) text.length()) - pos.length;
00153 string = string.substr(0, pos.start) + text + string.substr(pos.start + pos.length);
00154 args[index].length = text.length();
00155
00156 std::vector<ArgPosition>::size_type i, size;
00157 size = args.size();
00158 for (i = 0; i < size; i++)
00159 {
00160 if (args[i].start > pos.start)
00161 args[i].start += delta_size;
00162 }
00163 #else
00164 set_arg(index, CL_StringHelp::ucs2_to_local8(text));
00165 #endif
00166 }
00167
00168 void CL_StringFormat::set_arg(int index, int value, int min_length)
00169 {
00170 CL_String t = CL_StringHelp::int_to_text(value);
00171 if ((int) t.length() < min_length) t = CL_String(min_length-t.length(), TEXT('0')) + t;
00172 set_arg(index, t);
00173 }
00174
00175 void CL_StringFormat::set_arg(int index, double value)
00176 {
00177 set_arg(index, CL_StringHelp::double_to_text(value));
00178 }
00179
00181
00182
00183 void CL_StringFormat::create_arg(int index, int start, int length)
00184 {
00185 if (index > 256)
00186 throw CL_Exception(TEXT("Encountered more than 256 indexes in a formatted string!"));
00187
00188 ArgPosition pos(start, length);
00189 while (index >= (int) args.size())
00190 args.push_back(ArgPosition());
00191
00192 args[index].start = start;
00193 args[index].length = length;
00194 }