@@ -151,43 +151,84 @@ string16 QuoteForCommandLineToArgvW(const string16& arg,
151151
152152CommandLine::CommandLine (NoProgram no_program)
153153 : argv_(1 ),
154- begin_args_ (1 ) {
154+ begin_args_ (1 ),
155+ argc0_(0 ), argv0_(NULL ) {
155156}
156157
157158CommandLine::CommandLine (const FilePath& program)
158159 : argv_(1 ),
159- begin_args_(1 ) {
160+ begin_args_(1 ),
161+ argc0_(0 ), argv0_(NULL ) {
160162 SetProgram (program);
161163}
162164
163165CommandLine::CommandLine (int argc, const CommandLine::CharType* const * argv)
164166 : argv_(1 ),
165- begin_args_(1 ) {
167+ begin_args_(1 ),
168+ argc0_(0 ), argv0_(NULL ) {
166169 InitFromArgv (argc, argv);
167170}
168171
169172CommandLine::CommandLine (const StringVector& argv)
170173 : argv_(1 ),
171- begin_args_(1 ) {
174+ begin_args_(1 ),
175+ argc0_(0 ), argv0_(NULL ) {
172176 InitFromArgv (argv);
173177}
174178
175179CommandLine::CommandLine (const CommandLine& other)
176180 : argv_(other.argv_),
181+ original_argv_(other.original_argv_),
177182 switches_(other.switches_),
178- begin_args_(other.begin_args_) {
183+ begin_args_(other.begin_args_),
184+ argc0_(other.argc0_), argv0_(NULL ) {
185+
186+ #if defined(OS_WIN)
187+ if (other.argv0_ ) {
188+ argv0_ = new char *[argc0_ + 1 ];
189+ for (int i = 0 ; i < argc0_; ++i) {
190+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
191+ strcpy (argv0_[i], other.argv0_ [i]);
192+ }
193+ argv0_[argc0_] = NULL ;
194+ }
195+ #else
196+ argv0_ = other.argv0_ ;
197+ #endif
179198 ResetStringPieces ();
180199}
181200
182201CommandLine& CommandLine::operator =(const CommandLine& other) {
183202 argv_ = other.argv_ ;
203+ original_argv_ = other.original_argv_ ;
184204 switches_ = other.switches_ ;
185205 begin_args_ = other.begin_args_ ;
206+ #if defined(OS_WIN)
207+ if (other.argv0_ ) {
208+ argc0_ = other.argc0_ ;
209+ argv0_ = new char *[argc0_ + 1 ];
210+ for (int i = 0 ; i < argc0_; ++i) {
211+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
212+ strcpy (argv0_[i], other.argv0_ [i]);
213+ }
214+ argv0_[argc0_] = NULL ;
215+ }
216+ #else
217+ argv0_ = other.argv0_ ;
218+ #endif
186219 ResetStringPieces ();
187220 return *this ;
188221}
189222
190223CommandLine::~CommandLine () {
224+ #if defined(OS_WIN)
225+ if (!argv0_)
226+ return ;
227+ for (int i = 0 ; i < argc0_; i++) {
228+ delete[] argv0_[i];
229+ }
230+ delete[] argv0_;
231+ #endif
191232}
192233
193234#if defined(OS_WIN)
@@ -259,12 +300,34 @@ CommandLine CommandLine::FromString(const string16& command_line) {
259300void CommandLine::InitFromArgv (int argc,
260301 const CommandLine::CharType* const * argv) {
261302 StringVector new_argv;
303+ argc0_ = argc;
304+ #if !defined(OS_WIN)
305+ argv0_ = (char **)argv;
306+ #else
307+ argv0_ = new char *[argc + 1 ];
308+ for (int i = 0 ; i < argc; ++i) {
309+ std::string str (base::WideToUTF8 (argv[i]));
310+ argv0_[i] = new char [str.length () + 1 ];
311+ strcpy (argv0_[i], str.c_str ());
312+ }
313+ argv0_[argc] = NULL ;
314+ #endif
262315 for (int i = 0 ; i < argc; ++i)
263316 new_argv.push_back (argv[i]);
264317 InitFromArgv (new_argv);
265318}
266319
267320void CommandLine::InitFromArgv (const StringVector& argv) {
321+ #if !defined(OS_MACOSX)
322+ original_argv_ = argv;
323+ #else
324+ for (size_t index = 0 ; index < argv.size (); ++index) {
325+ if (argv[index].compare (0 , strlen (" --psn_" ), " --psn_" ) != 0 &&
326+ argv[index].compare (0 , strlen (" -psn_" ), " -psn_" ) != 0 ) {
327+ original_argv_.push_back (argv[index]);
328+ }
329+ }
330+ #endif
268331 argv_ = StringVector (1 );
269332 switches_.clear ();
270333 switches_by_stringpiece_.clear ();
@@ -401,6 +464,12 @@ void CommandLine::AppendArgNative(const CommandLine::StringType& value) {
401464 argv_.push_back (value);
402465}
403466
467+ #if defined(OS_MACOSX)
468+ void CommandLine::FixOrigArgv4Finder (const CommandLine::StringType& value) {
469+ original_argv_.push_back (value);
470+ }
471+ #endif
472+
404473void CommandLine::AppendArguments (const CommandLine& other,
405474 bool include_program) {
406475 if (include_program)
0 commit comments