Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

string_format.cpp

Go to the documentation of this file.
00001 /*
00002 **  ClanLib SDK
00003 **  Copyright (c) 1997-2005 The ClanLib Team
00004 **
00005 **  This software is provided 'as-is', without any express or implied
00006 **  warranty.  In no event will the authors be held liable for any damages
00007 **  arising from the use of this software.
00008 **
00009 **  Permission is granted to anyone to use this software for any purpose,
00010 **  including commercial applications, and to alter it and redistribute it
00011 **  freely, subject to the following restrictions:
00012 **
00013 **  1. The origin of this software must not be misrepresented; you must not
00014 **     claim that you wrote the original software. If you use this software
00015 **     in a product, an acknowledgment in the product documentation would be
00016 **     appreciated but is not required.
00017 **  2. Altered source versions must be plainly marked as such, and must not be
00018 **     misrepresented as being the original software.
00019 **  3. This notice may not be removed or altered from any source distribution.
00020 **
00021 **  Note: Some of the libraries ClanLib link to may have additional
00022 **  requirements or restrictions.
00023 **
00024 **  File Author(s):
00025 **
00026 **    Magnus Norddahl
00027 */
00028 
00029 #include "precomp.h"
00030 #include "string_format.h"
00031 #include "string_help.h"
00032 #include "exception.h"
00033 
00035 // CL_StringFormat Construction:
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 // CL_StringFormat Attributes:
00107 
00108 const CL_String &CL_StringFormat::get_result() const
00109 {
00110         return string;
00111 }
00112 
00114 // CL_StringFormat Operations:
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 // CL_StringFormat Implementation:
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 }

Generated on Sat Feb 19 22:51:16 2005 for npcore by  doxygen 1.4.1