Go to the documentation of this file.00001
00002
00003 #include "ace/Argv_Type_Converter.h"
00004
00005 #if !defined (__ACE_INLINE__)
00006 #include "ace/Argv_Type_Converter.inl"
00007 #endif
00008
00009 ACE_RCSID (ace,
00010 Argv_Type_Converter,
00011 "$Id: Argv_Type_Converter.cpp 85772 2009-06-23 20:14:18Z mitza $")
00012
00013 #include "ace/OS_NS_string.h"
00014 #include "ace/OS_Errno.h"
00015
00016 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00017
00018 #if defined (ACE_USES_WCHAR)
00019 ACE_Argv_Type_Converter::ACE_Argv_Type_Converter (int &argc, wchar_t** argv)
00020 : saved_argc_ (argc),
00021 char_argv_ (0),
00022 wchar_argv_ (argv),
00023 before_pass_argc_ (argc),
00024 original_type_ (true),
00025 wchar_passed_ (false),
00026 char_passed_ (false)
00027 {
00028 this->initialize ();
00029
00030 for (int i = 0; i < argc; ++i)
00031 this->char_argv_[i] = ACE_OS::strdup (ACE_TEXT_ALWAYS_CHAR (argv[i]));
00032 }
00033 #endif // ACE_USES_WCHAR
00034
00035
00036 ACE_Argv_Type_Converter::ACE_Argv_Type_Converter (int &argc, char **argv)
00037 : saved_argc_(argc),
00038 char_argv_(argv)
00039 #if defined (ACE_USES_WCHAR)
00040 , wchar_argv_(0),
00041 before_pass_argc_(argc),
00042 original_type_(false),
00043 wchar_passed_(false),
00044 char_passed_(false)
00045 {
00046 this->initialize();
00047
00048 for (int i = 0; i < argc; ++i)
00049 this->wchar_argv_[i] = ACE_OS::strdup (ACE_TEXT_ANTI_TO_TCHAR (argv[i]));
00050 }
00051 #else
00052 {
00053 }
00054 #endif // ACE_USES_WCHAR
00055
00056 ACE_Argv_Type_Converter::~ACE_Argv_Type_Converter (void)
00057 {
00058 #if defined (ACE_USES_WCHAR)
00059
00060 if (this->original_type_)
00061 {
00062
00063 if (this->char_passed_)
00064 this->align_wchar_with_char ();
00065
00066 for (int i = 0; i < this->before_pass_argc_; ++i)
00067 ACE_OS::free (this->char_argv_[i]);
00068
00069 delete [] this->char_argv_;
00070 }
00071 else
00072 {
00073
00074 if (this->wchar_passed_)
00075 this->align_char_with_wchar ();
00076
00077 for (int i = 0; i < this->before_pass_argc_; ++i)
00078 ACE_OS::free (this->wchar_argv_[i]);
00079
00080 delete [] this->wchar_argv_;
00081 }
00082 #endif // ACE_USES_WCHAR
00083 }
00084
00085 #if defined (ACE_USES_WCHAR)
00086 void
00087 ACE_Argv_Type_Converter::initialize (void)
00088 {
00089 if (this->original_type_)
00090 {
00091
00092
00093 ACE_NEW (char_argv_,
00094 char *[this->saved_argc_ + 1]);
00095 this->char_argv_[saved_argc_] = 0;
00096
00097 }
00098 else
00099 {
00100
00101 ACE_NEW (this->wchar_argv_,
00102 wchar_t*[this->saved_argc_ + 1]);
00103 this->wchar_argv_[saved_argc_] = 0;
00104 }
00105 }
00106
00107
00108 void
00109 ACE_Argv_Type_Converter::align_char_with_wchar (void)
00110 {
00111 for (int wchar_argv_index = 0; wchar_argv_index < this->saved_argc_;
00112 ++wchar_argv_index)
00113 {
00114 wchar_t *match_argv = this->wchar_argv_[wchar_argv_index];
00115
00116 if (ACE_OS::strcmp (this->char_argv_[wchar_argv_index],
00117 ACE_TEXT_ALWAYS_CHAR (match_argv)) != 0)
00118 {
00119
00120
00121 for (int i = wchar_argv_index + 1; i < before_pass_argc_; ++i)
00122 {
00123 if (ACE_OS::strcmp (this->char_argv_[i],
00124 ACE_TEXT_ALWAYS_CHAR (match_argv)) == 0)
00125 {
00126
00127 char *temp = this->char_argv_[wchar_argv_index];
00128 this->char_argv_[wchar_argv_index] = this->char_argv_[i];
00129 this->char_argv_[i] = temp;
00130 break;
00131 }
00132 }
00133 }
00134 }
00135
00136 this->cleanup ();
00137 }
00138
00139 void
00140 ACE_Argv_Type_Converter::align_wchar_with_char (void)
00141 {
00142 for (int char_argv_index = 0; char_argv_index < saved_argc_;
00143 ++char_argv_index)
00144 {
00145 char* match_argv = this->char_argv_[char_argv_index];
00146
00147 if (ACE_OS::strcmp (
00148 ACE_TEXT_ALWAYS_CHAR (this->wchar_argv_[char_argv_index]),
00149 match_argv) != 0)
00150 {
00151
00152
00153 for (int i = char_argv_index + 1; i < this->before_pass_argc_; ++i)
00154 {
00155 if (ACE_OS::strcmp (
00156 ACE_TEXT_ALWAYS_CHAR(this->wchar_argv_[i]),
00157 match_argv) == 0) {
00158
00159 wchar_t* temp = this->wchar_argv_[char_argv_index];
00160 this->wchar_argv_[char_argv_index] = this->wchar_argv_[i];
00161 this->wchar_argv_[i] = temp;
00162 break;
00163 }
00164 }
00165 }
00166 }
00167
00168 this->cleanup();
00169 }
00170
00171 void
00172 ACE_Argv_Type_Converter::cleanup (void)
00173 {
00174 for (int i = this->saved_argc_; i < this->before_pass_argc_; ++i)
00175 {
00176
00177 if (original_type_)
00178 {
00179 ACE_OS::free (this->char_argv_[i]);
00180 this->char_argv_[i] = 0;
00181 }
00182 else
00183 {
00184 ACE_OS::free (this->wchar_argv_[i]);
00185 this->wchar_argv_[i] = 0;
00186 }
00187 }
00188
00189 this->before_pass_argc_ = this->saved_argc_;
00190
00191 this->wchar_passed_ = false;
00192 this->char_passed_ = false;
00193 }
00194 #endif // ACE_USES_WCHAR
00195
00196 ACE_END_VERSIONED_NAMESPACE_DECL