@@ -155,32 +155,83 @@ string16 QuoteForCommandLineToArgvW(const string16& arg,
155
155
156
156
CommandLine::CommandLine (NoProgram no_program)
157
157
: argv_(1 ),
158
- begin_args_ (1 ) {
158
+ begin_args_ (1 ),
159
+ argc0_(0 ), argv0_(NULL ) {
159
160
}
160
161
161
162
CommandLine::CommandLine (const FilePath& program)
162
163
: argv_(1 ),
163
- begin_args_(1 ) {
164
+ begin_args_(1 ),
165
+ argc0_(0 ), argv0_(NULL ) {
164
166
SetProgram (program);
165
167
}
166
168
167
169
CommandLine::CommandLine (int argc, const CommandLine::CharType* const * argv)
168
170
: argv_(1 ),
169
- begin_args_(1 ) {
171
+ begin_args_(1 ),
172
+ argc0_(0 ), argv0_(NULL ) {
170
173
InitFromArgv (argc, argv);
171
174
}
172
175
173
176
CommandLine::CommandLine (const StringVector& argv)
174
177
: argv_(1 ),
175
- begin_args_(1 ) {
178
+ begin_args_(1 ),
179
+ argc0_(0 ), argv0_(NULL ) {
176
180
InitFromArgv (argv);
177
181
}
178
182
179
- CommandLine::CommandLine (const CommandLine& other) = default;
183
+ CommandLine::CommandLine (const CommandLine& other)
184
+ : argv_(other.argv_),
185
+ original_argv_(other.original_argv_),
186
+ switches_(other.switches_),
187
+ begin_args_(other.begin_args_),
188
+ argc0_(other.argc0_), argv0_(nullptr ) {
180
189
181
- CommandLine& CommandLine::operator =(const CommandLine& other) = default ;
190
+ #if defined(OS_WIN)
191
+ if (other.argv0_ ) {
192
+ argv0_ = new char *[argc0_ + 1 ];
193
+ for (int i = 0 ; i < argc0_; ++i) {
194
+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
195
+ strcpy (argv0_[i], other.argv0_ [i]);
196
+ }
197
+ argv0_[argc0_] = NULL ;
198
+ }
199
+ #else
200
+ argv0_ = other.argv0_ ;
201
+ #endif
202
+ }
203
+
204
+ CommandLine& CommandLine::operator =(const CommandLine& other) {
205
+ argv_ = other.argv_ ;
206
+ original_argv_ = other.original_argv_ ;
207
+ switches_ = other.switches_ ;
208
+ begin_args_ = other.begin_args_ ;
209
+ #if defined(OS_WIN)
210
+ if (other.argv0_ ) {
211
+ argc0_ = other.argc0_ ;
212
+ argv0_ = new char *[argc0_ + 1 ];
213
+ for (int i = 0 ; i < argc0_; ++i) {
214
+ argv0_[i] = new char [strlen (other.argv0_ [i]) + 1 ];
215
+ strcpy (argv0_[i], other.argv0_ [i]);
216
+ }
217
+ argv0_[argc0_] = NULL ;
218
+ }
219
+ #else
220
+ argv0_ = other.argv0_ ;
221
+ #endif
222
+ return *this ;
223
+ }
182
224
183
- CommandLine::~CommandLine () = default ;
225
+ CommandLine::~CommandLine () {
226
+ #if defined(OS_WIN)
227
+ if (!argv0_)
228
+ return ;
229
+ for (int i = 0 ; i < argc0_; i++) {
230
+ delete[] argv0_[i];
231
+ }
232
+ delete[] argv0_;
233
+ #endif
234
+ }
184
235
185
236
#if defined(OS_WIN)
186
237
// static
@@ -253,12 +304,34 @@ CommandLine CommandLine::FromString(const string16& command_line) {
253
304
void CommandLine::InitFromArgv (int argc,
254
305
const CommandLine::CharType* const * argv) {
255
306
StringVector new_argv;
307
+ argc0_ = argc;
308
+ #if !defined(OS_WIN)
309
+ argv0_ = (char **)argv;
310
+ #else
311
+ argv0_ = new char *[argc + 1 ];
312
+ for (int i = 0 ; i < argc; ++i) {
313
+ std::string str (base::WideToUTF8 (argv[i]));
314
+ argv0_[i] = new char [str.length () + 1 ];
315
+ strcpy (argv0_[i], str.c_str ());
316
+ }
317
+ argv0_[argc] = NULL ;
318
+ #endif
256
319
for (int i = 0 ; i < argc; ++i)
257
320
new_argv.push_back (argv[i]);
258
321
InitFromArgv (new_argv);
259
322
}
260
323
261
324
void CommandLine::InitFromArgv (const StringVector& argv) {
325
+ #if !defined(OS_MACOSX)
326
+ original_argv_ = argv;
327
+ #else
328
+ for (size_t index = 0 ; index < argv.size (); ++index) {
329
+ if (argv[index].compare (0 , strlen (" --psn_" ), " --psn_" ) != 0 &&
330
+ argv[index].compare (0 , strlen (" -psn_" ), " -psn_" ) != 0 ) {
331
+ original_argv_.push_back (argv[index]);
332
+ }
333
+ }
334
+ #endif
262
335
argv_ = StringVector (1 );
263
336
switches_.clear ();
264
337
begin_args_ = 1 ;
@@ -397,6 +470,12 @@ void CommandLine::AppendArgNative(const CommandLine::StringType& value) {
397
470
argv_.push_back (value);
398
471
}
399
472
473
+ #if defined(OS_MACOSX)
474
+ void CommandLine::FixOrigArgv4Finder (const CommandLine::StringType& value) {
475
+ original_argv_.push_back (value);
476
+ }
477
+ #endif
478
+
400
479
void CommandLine::AppendArguments (const CommandLine& other,
401
480
bool include_program) {
402
481
if (include_program)
0 commit comments