@@ -152,43 +152,84 @@ string16 QuoteForCommandLineToArgvW(const string16& arg,
152152
153153CommandLine::CommandLine (NoProgram no_program)
154154 : argv_(1 ),
155- begin_args_ (1 ) {
155+ begin_args_ (1 ),
156+ argc0_(0 ), argv0_(NULL ) {
156157}
157158
158159CommandLine::CommandLine (const FilePath& program)
159160 : argv_(1 ),
160- begin_args_(1 ) {
161+ begin_args_(1 ),
162+ argc0_(0 ), argv0_(NULL ) {
161163 SetProgram (program);
162164}
163165
164166CommandLine::CommandLine (int argc, const CommandLine::CharType* const * argv)
165167 : argv_(1 ),
166- begin_args_(1 ) {
168+ begin_args_(1 ),
169+ argc0_(0 ), argv0_(NULL ) {
167170 InitFromArgv (argc, argv);
168171}
169172
170173CommandLine::CommandLine (const StringVector& argv)
171174 : argv_(1 ),
172- begin_args_(1 ) {
175+ begin_args_(1 ),
176+ argc0_(0 ), argv0_(NULL ) {
173177 InitFromArgv (argv);
174178}
175179
176180CommandLine::CommandLine (const CommandLine& other)
177181 : argv_(other.argv_),
182+ original_argv_(other.original_argv_),
178183 switches_(other.switches_),
179- begin_args_(other.begin_args_) {
184+ begin_args_(other.begin_args_),
185+ argc0_(other.argc0_), argv0_(NULL ) {
186+
187+ #if defined(OS_WIN)
188+ if (other.argv0_ ) {
189+ argv0_ = new char *[argc0_ + 1 ];
190+ for (int i = 0 ; i < argc0_; ++i) {
191+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
192+ strcpy (argv0_[i], other.argv0_ [i]);
193+ }
194+ argv0_[argc0_] = NULL ;
195+ }
196+ #else
197+ argv0_ = other.argv0_ ;
198+ #endif
180199 ResetStringPieces ();
181200}
182201
183202CommandLine& CommandLine::operator =(const CommandLine& other) {
184203 argv_ = other.argv_ ;
204+ original_argv_ = other.original_argv_ ;
185205 switches_ = other.switches_ ;
186206 begin_args_ = other.begin_args_ ;
207+ #if defined(OS_WIN)
208+ if (other.argv0_ ) {
209+ argc0_ = other.argc0_ ;
210+ argv0_ = new char *[argc0_ + 1 ];
211+ for (int i = 0 ; i < argc0_; ++i) {
212+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
213+ strcpy (argv0_[i], other.argv0_ [i]);
214+ }
215+ argv0_[argc0_] = NULL ;
216+ }
217+ #else
218+ argv0_ = other.argv0_ ;
219+ #endif
187220 ResetStringPieces ();
188221 return *this ;
189222}
190223
191224CommandLine::~CommandLine () {
225+ #if defined(OS_WIN)
226+ if (!argv0_)
227+ return ;
228+ for (int i = 0 ; i < argc0_; i++) {
229+ delete[] argv0_[i];
230+ }
231+ delete[] argv0_;
232+ #endif
192233}
193234
194235#if defined(OS_WIN)
@@ -260,12 +301,34 @@ CommandLine CommandLine::FromString(const string16& command_line) {
260301void CommandLine::InitFromArgv (int argc,
261302 const CommandLine::CharType* const * argv) {
262303 StringVector new_argv;
304+ argc0_ = argc;
305+ #if !defined(OS_WIN)
306+ argv0_ = (char **)argv;
307+ #else
308+ argv0_ = new char *[argc + 1 ];
309+ for (int i = 0 ; i < argc; ++i) {
310+ std::string str (base::WideToUTF8 (argv[i]));
311+ argv0_[i] = new char [str.length () + 1 ];
312+ strcpy (argv0_[i], str.c_str ());
313+ }
314+ argv0_[argc] = NULL ;
315+ #endif
263316 for (int i = 0 ; i < argc; ++i)
264317 new_argv.push_back (argv[i]);
265318 InitFromArgv (new_argv);
266319}
267320
268321void CommandLine::InitFromArgv (const StringVector& argv) {
322+ #if !defined(OS_MACOSX)
323+ original_argv_ = argv;
324+ #else
325+ for (size_t index = 0 ; index < argv.size (); ++index) {
326+ if (argv[index].compare (0 , strlen (" --psn_" ), " --psn_" ) != 0 &&
327+ argv[index].compare (0 , strlen (" -psn_" ), " -psn_" ) != 0 ) {
328+ original_argv_.push_back (argv[index]);
329+ }
330+ }
331+ #endif
269332 argv_ = StringVector (1 );
270333 switches_.clear ();
271334 switches_by_stringpiece_.clear ();
@@ -402,6 +465,12 @@ void CommandLine::AppendArgNative(const CommandLine::StringType& value) {
402465 argv_.push_back (value);
403466}
404467
468+ #if defined(OS_MACOSX)
469+ void CommandLine::FixOrigArgv4Finder (const CommandLine::StringType& value) {
470+ original_argv_.push_back (value);
471+ }
472+ #endif
473+
405474void CommandLine::AppendArguments (const CommandLine& other,
406475 bool include_program) {
407476 if (include_program)
0 commit comments