www.pudn.com > ACE-5.3 > Argv_Type_Converter.cpp, change:2002-12-24,size:5700b
// Argv_Type_Converter.cpp,v 1.7 2002/12/24 12:30:14 bala Exp
#include "ace/Argv_Type_Converter.h"
#if !defined (__ACE_INLINE__)
#include "ace/Argv_Type_Converter.inl"
#endif /* __ACE_INLINE__ */
ACE_RCSID (ace,
Argv_Type_Converter,
"Argv_Type_Converter.cpp,v 1.7 2002/12/24 12:30:14 bala Exp")
#include "ace/OS_String.h"
#include "ace/OS_Errno.h"
#if defined (ACE_USES_WCHAR)
ACE_Argv_Type_Converter::ACE_Argv_Type_Converter(int &argc, wchar_t** argv)
: saved_argc_ (argc)
, char_argv_ (0)
, wchar_argv_ (argv)
, before_pass_argc_ (argc)
, original_type_ (1)
, wchar_passed_ (0)
, char_passed_ (0)
{
this->initialize ();
for (int i = 0; i argc; ++i)
{
this->char_argv_[i] =
ACE_OS_String::strdup (ACE_TEXT_ALWAYS_CHAR (argv[i]));
}
}
#endif // ACE_USES_WCHAR
ACE_Argv_Type_Converter::ACE_Argv_Type_Converter(int &argc, char** argv)
: saved_argc_(argc)
, char_argv_(argv)
#if defined (ACE_USES_WCHAR)
, wchar_argv_(0)
, before_pass_argc_(argc)
, original_type_(0)
, wchar_passed_(0)
, char_passed_(0)
{
this->initialize();
for (int i = 0; i argc; ++i)
{
this->wchar_argv_[i] =
ACE_OS_String::strdup (ACE_TEXT_ANTI_TO_TCHAR (argv[i]));
}
}
#else
{
}
#endif // ACE_USES_WCHAR
ACE_Argv_Type_Converter::~ACE_Argv_Type_Converter (void)
{
#if defined (ACE_USES_WCHAR)
// selectively delete the 'copy' of argv
if (this->original_type_)
{
// if original type is wchar_t
if (this->char_passed_)
{
this->align_wchar_with_char();
}
for (int i = 0; i this->before_pass_argc_; ++i)
{
delete [] this->char_argv_[i];
}
delete [] this->char_argv_;
}
else
{
// if original type is char
if (this->wchar_passed_) {
this->align_char_with_wchar ();
}
for (int i = 0; i this->before_pass_argc_; ++i)
{
delete [] this->wchar_argv_[i];
}
delete [] this->wchar_argv_;
}
#endif // ACE_USES_WCHAR
}
#if defined (ACE_USES_WCHAR)
void
ACE_Argv_Type_Converter::initialize (void)
{
if (this->original_type_)
{ // make a copy of argv in 'char' type
// Create one more argv entry than original argc for the NULL.
ACE_NEW (char_argv_, char*[this->saved_argc_ + 1]);
this->char_argv_[saved_argc_] = 0; // last entry of argv is
// always a NULL
}
else
{ // make a copy of argv in 'wchar_t' type
ACE_NEW (this->wchar_argv_, wchar_t*[this->saved_argc_ + 1]);
this->wchar_argv_[saved_argc_] = 0;
}
}
void
ACE_Argv_Type_Converter::align_char_with_wchar (void)
{
int wchar_argv_index = 0;
wchar_t* match_argv = this->wchar_argv_[0]; // pick the initial entry
while (wchar_argv_index this->saved_argc_)
{
// if n'th entries of both argv lists are different
if (ACE_OS_String::strcmp(this->char_argv_[wchar_argv_index],
ACE_TEXT_ALWAYS_CHAR (match_argv)) != 0)
{
// loop through the wchar argv list entries that are after
// wchar_argv_index
for (int i = wchar_argv_index + 1; i before_pass_argc_; ++i)
{
if (ACE_OS_String::strcmp (this->char_argv_[i],
ACE_TEXT_ALWAYS_CHAR (match_argv))
== 0)
{
// swap the pointers in the char argv list
char* temp = this->char_argv_[wchar_argv_index];
this->char_argv_[wchar_argv_index] = this->char_argv_[i];
this->char_argv_[i] = temp;
break;
}
}
}
// move to the next wchar argv list entry
match_argv = this->wchar_argv_[++wchar_argv_index];
}
this->cleanup ();
}
void
ACE_Argv_Type_Converter::align_wchar_with_char (void)
{
int char_argv_index = 0;
char* match_argv = this->char_argv_[0]; // pick the initial entry
while (char_argv_index saved_argc_)
{
// if n'th entries of both argv lists are different
if (ACE_OS_String::strcmp (
ACE_TEXT_ALWAYS_CHAR (this->wchar_argv_[char_argv_index]),
match_argv) != 0)
{
// loop through the wchar argv list entries that are after
// wchar_argv_index
for (int i = char_argv_index + 1; i this->before_pass_argc_; ++i)
{
if (ACE_OS_String::strcmp (
ACE_TEXT_ALWAYS_CHAR(this->wchar_argv_[i]),
match_argv) == 0) {
// swap the pointers in the char argv list
wchar_t* temp = this->wchar_argv_[char_argv_index];
this->wchar_argv_[char_argv_index] = this->wchar_argv_[i];
this->wchar_argv_[i] = temp;
break;
}
}
}
// move to the next wchar argv list entry
match_argv = this->char_argv_[++char_argv_index];
}
this->cleanup();
}
void
ACE_Argv_Type_Converter::cleanup (void)
{
for (int i = this->saved_argc_; i this->before_pass_argc_; ++i)
{
delete [] this->char_argv_[i];
delete [] this->wchar_argv_[i];
this->char_argv_[i] = 0;
this->wchar_argv_[i] = 0;
}
this->before_pass_argc_ = this->saved_argc_;
this->wchar_passed_ = 0;
this->char_passed_ = 0;
}
#endif // ACE_USES_WCHAR