| Index: base/command_line.cc
 | 
| diff --git a/base/command_line.cc b/base/command_line.cc
 | 
| index c0a0f1900563a09a294852324a1d0f38829af30a..eefd6ac46cbdd6e50ada5192e281d77e41c7494f 100644
 | 
| --- a/base/command_line.cc
 | 
| +++ b/base/command_line.cc
 | 
| @@ -27,31 +27,29 @@
 | 
|  
 | 
|  CommandLine* CommandLine::current_process_commandline_ = NULL;
 | 
|  
 | 
| -// Since we use a lazy match, make sure that longer versions (like L"--")
 | 
| -// are listed before shorter versions (like L"-") of similar prefixes.
 | 
| +namespace {
 | 
| +typedef CommandLine::StringType::value_type CharType;
 | 
| +
 | 
| +const CharType kSwitchTerminator[] = FILE_PATH_LITERAL("--");
 | 
| +const CharType kSwitchValueSeparator[] = FILE_PATH_LITERAL("=");
 | 
| +// Since we use a lazy match, make sure that longer versions (like "--") are
 | 
| +// listed before shorter versions (like "-") of similar prefixes.
 | 
|  #if defined(OS_WIN)
 | 
| -const wchar_t* const kSwitchPrefixes[] = {L"--", L"-", L"/"};
 | 
| -const wchar_t kSwitchTerminator[] = L"--";
 | 
| -const wchar_t kSwitchValueSeparator[] = L"=";
 | 
| +const CharType* const kSwitchPrefixes[] = {L"--", L"-", L"/"};
 | 
|  #elif defined(OS_POSIX)
 | 
|  // Unixes don't use slash as a switch.
 | 
| -const char* const kSwitchPrefixes[] = {"--", "-"};
 | 
| -const char kSwitchTerminator[] = "--";
 | 
| -const char kSwitchValueSeparator[] = "=";
 | 
| +const CharType* const kSwitchPrefixes[] = {"--", "-"};
 | 
|  #endif
 | 
|  
 | 
|  #if defined(OS_WIN)
 | 
| -namespace {
 | 
| -// Lowercase a string.  This is used to lowercase switch names.
 | 
| -// Is this what we really want?  It seems crazy to me.  I've left it in
 | 
| -// for backwards compatibility on Windows.
 | 
| -void Lowercase(std::string* parameter) {
 | 
| -  transform(parameter->begin(), parameter->end(), parameter->begin(),
 | 
| -            tolower);
 | 
| +// Lowercase a string for case-insensitivity of switches.
 | 
| +// Is this desirable? It exists for backwards compatibility on Windows.
 | 
| +void Lowercase(std::string* arg) {
 | 
| +  transform(arg->begin(), arg->end(), arg->begin(), tolower);
 | 
|  }
 | 
|  
 | 
| -// Quote a string if necessary, such that CommandLineToArgvW() will
 | 
| -// always process it as a single argument.
 | 
| +// Quote a string if necessary, such that CommandLineToArgvW() will always
 | 
| +// process it as a single argument.
 | 
|  std::wstring WindowsStyleQuote(const std::wstring& arg) {
 | 
|    // We follow the quoting rules of CommandLineToArgvW.
 | 
|    // http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
 | 
| @@ -93,94 +91,117 @@ std::wstring WindowsStyleQuote(const std::wstring& arg) {
 | 
|  
 | 
|    return out;
 | 
|  }
 | 
| -}  // namespace
 | 
|  #endif
 | 
|  
 | 
| -CommandLine::~CommandLine() {
 | 
| -}
 | 
| -
 | 
| -#if defined(OS_WIN)
 | 
| -CommandLine::CommandLine(NoProgram no_program) {
 | 
| -}
 | 
| -
 | 
| -void CommandLine::ParseFromString(const std::wstring& command_line) {
 | 
| -  TrimWhitespace(command_line, TRIM_ALL, &command_line_string_);
 | 
| -
 | 
| -  if (command_line_string_.empty())
 | 
| -    return;
 | 
| -
 | 
| -  int num_args = 0;
 | 
| -  wchar_t** args = NULL;
 | 
| -
 | 
| -  args = CommandLineToArgvW(command_line_string_.c_str(), &num_args);
 | 
| -
 | 
| -  // Populate program_ with the trimmed version of the first arg.
 | 
| -  TrimWhitespace(args[0], TRIM_ALL, &program_);
 | 
| -
 | 
| -  bool parse_switches = true;
 | 
| -  for (int i = 1; i < num_args; ++i) {
 | 
| -    std::wstring arg;
 | 
| -    TrimWhitespace(args[i], TRIM_ALL, &arg);
 | 
| -
 | 
| -    if (!parse_switches) {
 | 
| -      args_.push_back(arg);
 | 
| -      continue;
 | 
| -    }
 | 
| +// Returns true and fills in |switch_string| and |switch_value| if
 | 
| +// |parameter_string| represents a switch.
 | 
| +bool IsSwitch(const CommandLine::StringType& parameter_string,
 | 
| +              std::string* switch_string,
 | 
| +              CommandLine::StringType* switch_value) {
 | 
| +  switch_string->clear();
 | 
| +  switch_value->clear();
 | 
|  
 | 
| -    if (arg == kSwitchTerminator) {
 | 
| -      parse_switches = false;
 | 
| +  for (size_t i = 0; i < arraysize(kSwitchPrefixes); ++i) {
 | 
| +    CommandLine::StringType prefix(kSwitchPrefixes[i]);
 | 
| +    if (parameter_string.find(prefix) != 0)
 | 
|        continue;
 | 
| -    }
 | 
|  
 | 
| -    std::string switch_string;
 | 
| -    std::wstring switch_value;
 | 
| -    if (IsSwitch(arg, &switch_string, &switch_value)) {
 | 
| -      switches_[switch_string] = switch_value;
 | 
| +    const size_t switch_start = prefix.length();
 | 
| +    const size_t equals_position = parameter_string.find(
 | 
| +        kSwitchValueSeparator, switch_start);
 | 
| +    CommandLine::StringType switch_native;
 | 
| +    if (equals_position == CommandLine::StringType::npos) {
 | 
| +      switch_native = parameter_string.substr(switch_start);
 | 
|      } else {
 | 
| -      args_.push_back(arg);
 | 
| +      switch_native = parameter_string.substr(
 | 
| +          switch_start, equals_position - switch_start);
 | 
| +      *switch_value = parameter_string.substr(equals_position + 1);
 | 
|      }
 | 
| +#if defined(OS_WIN)
 | 
| +    *switch_string = WideToASCII(switch_native);
 | 
| +    Lowercase(switch_string);
 | 
| +#else
 | 
| +    *switch_string = switch_native;
 | 
| +#endif
 | 
| +
 | 
| +    return true;
 | 
|    }
 | 
|  
 | 
| -  if (args)
 | 
| -    LocalFree(args);
 | 
| +  return false;
 | 
|  }
 | 
|  
 | 
| -// static
 | 
| -CommandLine CommandLine::FromString(const std::wstring& command_line) {
 | 
| -  CommandLine cmd;
 | 
| -  cmd.ParseFromString(command_line);
 | 
| -  return cmd;
 | 
| +}  // namespace
 | 
| +
 | 
| +CommandLine::CommandLine(NoProgram no_program) {
 | 
| +#if defined(OS_POSIX)
 | 
| +  // Push an empty argument, because we always assume argv_[0] is a program.
 | 
| +  argv_.push_back("");
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  CommandLine::CommandLine(const FilePath& program) {
 | 
| +#if defined(OS_WIN)
 | 
|    if (!program.empty()) {
 | 
|      program_ = program.value();
 | 
|      // TODO(evanm): proper quoting here.
 | 
|      command_line_string_ = L'"' + program.value() + L'"';
 | 
|    }
 | 
| -}
 | 
| -
 | 
|  #elif defined(OS_POSIX)
 | 
| -CommandLine::CommandLine(NoProgram no_program) {
 | 
| -  // Push an empty argument, because we always assume argv_[0] is a program.
 | 
| -  argv_.push_back("");
 | 
| +  argv_.push_back(program.value());
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
| +#if defined(OS_POSIX)
 | 
|  CommandLine::CommandLine(int argc, const char* const* argv) {
 | 
|    InitFromArgv(argc, argv);
 | 
|  }
 | 
|  
 | 
| -CommandLine::CommandLine(const std::vector<std::string>& argv) {
 | 
| +CommandLine::CommandLine(const StringVector& argv) {
 | 
|    InitFromArgv(argv);
 | 
|  }
 | 
| +#endif  // OS_POSIX
 | 
|  
 | 
| +// static
 | 
| +void CommandLine::Init(int argc, const char* const* argv) {
 | 
| +  delete current_process_commandline_;
 | 
| +  current_process_commandline_ = new CommandLine;
 | 
| +#if defined(OS_WIN)
 | 
| +  current_process_commandline_->ParseFromString(::GetCommandLineW());
 | 
| +#elif defined(OS_POSIX)
 | 
| +  current_process_commandline_->InitFromArgv(argc, argv);
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +void CommandLine::Reset() {
 | 
| +  DCHECK(current_process_commandline_);
 | 
| +  delete current_process_commandline_;
 | 
| +  current_process_commandline_ = NULL;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +CommandLine* CommandLine::ForCurrentProcess() {
 | 
| +  DCHECK(current_process_commandline_);
 | 
| +  return current_process_commandline_;
 | 
| +}
 | 
| +
 | 
| +#if defined(OS_WIN)
 | 
| +// static
 | 
| +CommandLine CommandLine::FromString(const std::wstring& command_line) {
 | 
| +  CommandLine cmd;
 | 
| +  cmd.ParseFromString(command_line);
 | 
| +  return cmd;
 | 
| +}
 | 
| +#endif  // OS_WIN
 | 
| +
 | 
| +#if defined(OS_POSIX)
 | 
|  void CommandLine::InitFromArgv(int argc, const char* const* argv) {
 | 
|    for (int i = 0; i < argc; ++i)
 | 
|      argv_.push_back(argv[i]);
 | 
|    InitFromArgv(argv_);
 | 
|  }
 | 
|  
 | 
| -void CommandLine::InitFromArgv(const std::vector<std::string>& argv) {
 | 
| +void CommandLine::InitFromArgv(const StringVector& argv) {
 | 
|    argv_ = argv;
 | 
|    bool parse_switches = true;
 | 
|    for (size_t i = 1; i < argv_.size(); ++i) {
 | 
| @@ -197,7 +218,7 @@ void CommandLine::InitFromArgv(const std::vector<std::string>& argv) {
 | 
|      }
 | 
|  
 | 
|      std::string switch_string;
 | 
| -    std::string switch_value;
 | 
| +    StringType switch_value;
 | 
|      if (IsSwitch(arg, &switch_string, &switch_value)) {
 | 
|        switches_[switch_string] = switch_value;
 | 
|      } else {
 | 
| @@ -205,72 +226,25 @@ void CommandLine::InitFromArgv(const std::vector<std::string>& argv) {
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| +#endif  // OS_POSIX
 | 
|  
 | 
| -CommandLine::CommandLine(const FilePath& program) {
 | 
| -  argv_.push_back(program.value());
 | 
| -}
 | 
| -
 | 
| -#endif
 | 
| -
 | 
| -// static
 | 
| -bool CommandLine::IsSwitch(const StringType& parameter_string,
 | 
| -                           std::string* switch_string,
 | 
| -                           StringType* switch_value) {
 | 
| -  switch_string->clear();
 | 
| -  switch_value->clear();
 | 
| -
 | 
| -  for (size_t i = 0; i < arraysize(kSwitchPrefixes); ++i) {
 | 
| -    StringType prefix(kSwitchPrefixes[i]);
 | 
| -    if (parameter_string.find(prefix) != 0)
 | 
| -      continue;
 | 
| -
 | 
| -    const size_t switch_start = prefix.length();
 | 
| -    const size_t equals_position = parameter_string.find(
 | 
| -        kSwitchValueSeparator, switch_start);
 | 
| -    StringType switch_native;
 | 
| -    if (equals_position == StringType::npos) {
 | 
| -      switch_native = parameter_string.substr(switch_start);
 | 
| -    } else {
 | 
| -      switch_native = parameter_string.substr(
 | 
| -          switch_start, equals_position - switch_start);
 | 
| -      *switch_value = parameter_string.substr(equals_position + 1);
 | 
| -    }
 | 
| +CommandLine::StringType CommandLine::command_line_string() const {
 | 
|  #if defined(OS_WIN)
 | 
| -    *switch_string = WideToASCII(switch_native);
 | 
| -    Lowercase(switch_string);
 | 
| -#else
 | 
| -    *switch_string = switch_native;
 | 
| +  return command_line_string_;
 | 
| +#elif defined(OS_POSIX)
 | 
| +  return JoinString(argv_, ' ');
 | 
|  #endif
 | 
| -
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  return false;
 | 
|  }
 | 
|  
 | 
| -// static
 | 
| -void CommandLine::Init(int argc, const char* const* argv) {
 | 
| -  delete current_process_commandline_;
 | 
| -  current_process_commandline_ = new CommandLine;
 | 
| +FilePath CommandLine::GetProgram() const {
 | 
|  #if defined(OS_WIN)
 | 
| -  current_process_commandline_->ParseFromString(::GetCommandLineW());
 | 
| -#elif defined(OS_POSIX)
 | 
| -  current_process_commandline_->InitFromArgv(argc, argv);
 | 
| +  return FilePath(program_);
 | 
| +#else
 | 
| +  DCHECK_GT(argv_.size(), 0U);
 | 
| +  return FilePath(argv_[0]);
 | 
|  #endif
 | 
|  }
 | 
|  
 | 
| -void CommandLine::Reset() {
 | 
| -  DCHECK(current_process_commandline_ != NULL);
 | 
| -  delete current_process_commandline_;
 | 
| -  current_process_commandline_ = NULL;
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -CommandLine* CommandLine::ForCurrentProcess() {
 | 
| -  DCHECK(current_process_commandline_);
 | 
| -  return current_process_commandline_;
 | 
| -}
 | 
| -
 | 
|  bool CommandLine::HasSwitch(const std::string& switch_string) const {
 | 
|    std::string lowercased_switch(switch_string);
 | 
|  #if defined(OS_WIN)
 | 
| @@ -305,8 +279,7 @@ CommandLine::StringType CommandLine::GetSwitchValueNative(
 | 
|    Lowercase(&lowercased_switch);
 | 
|  #endif
 | 
|  
 | 
| -  std::map<std::string, StringType>::const_iterator result =
 | 
| -      switches_.find(lowercased_switch);
 | 
| +  SwitchMap::const_iterator result = switches_.find(lowercased_switch);
 | 
|  
 | 
|    if (result == switches_.end()) {
 | 
|      return CommandLine::StringType();
 | 
| @@ -315,31 +288,30 @@ CommandLine::StringType CommandLine::GetSwitchValueNative(
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -FilePath CommandLine::GetProgram() const {
 | 
| -#if defined(OS_WIN)
 | 
| -  return FilePath(program_);
 | 
| -#else
 | 
| -  DCHECK_GT(argv_.size(), 0U);
 | 
| -  return FilePath(argv_[0]);
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
| -#if defined(OS_POSIX)
 | 
| -std::string CommandLine::command_line_string() const {
 | 
| -  return JoinString(argv_, ' ');
 | 
| +size_t CommandLine::GetSwitchCount() const {
 | 
| +  return switches_.size();
 | 
|  }
 | 
| -#endif
 | 
|  
 | 
| -#if defined(OS_WIN)
 | 
|  void CommandLine::AppendSwitch(const std::string& switch_string) {
 | 
| +#if defined(OS_WIN)
 | 
|    command_line_string_.append(L" ");
 | 
|    command_line_string_.append(kSwitchPrefixes[0] + ASCIIToWide(switch_string));
 | 
|    switches_[switch_string] = L"";
 | 
| +#elif defined(OS_POSIX)
 | 
| +  argv_.push_back(kSwitchPrefixes[0] + switch_string);
 | 
| +  switches_[switch_string] = "";
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +void CommandLine::AppendSwitchPath(const std::string& switch_string,
 | 
| +                                   const FilePath& path) {
 | 
| +  AppendSwitchNative(switch_string, path.value());
 | 
|  }
 | 
|  
 | 
|  void CommandLine::AppendSwitchNative(const std::string& switch_string,
 | 
| -                                     const std::wstring& value) {
 | 
| -  std::wstring combined_switch_string =
 | 
| +                                     const CommandLine::StringType& value) {
 | 
| +#if defined(OS_WIN)
 | 
| +  StringType combined_switch_string =
 | 
|        kSwitchPrefixes[0] + ASCIIToWide(switch_string);
 | 
|    if (!value.empty())
 | 
|      combined_switch_string += kSwitchValueSeparator + WindowsStyleQuote(value);
 | 
| @@ -348,26 +320,79 @@ void CommandLine::AppendSwitchNative(const std::string& switch_string,
 | 
|    command_line_string_.append(combined_switch_string);
 | 
|  
 | 
|    switches_[switch_string] = value;
 | 
| +#elif defined(OS_POSIX)
 | 
| +  StringType combined_switch_string = kSwitchPrefixes[0] + switch_string;
 | 
| +  if (!value.empty())
 | 
| +    combined_switch_string += kSwitchValueSeparator + value;
 | 
| +  argv_.push_back(combined_switch_string);
 | 
| +  switches_[switch_string] = value;
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  void CommandLine::AppendSwitchASCII(const std::string& switch_string,
 | 
|                                      const std::string& value_string) {
 | 
| +#if defined(OS_WIN)
 | 
|    AppendSwitchNative(switch_string, ASCIIToWide(value_string));
 | 
| +#elif defined(OS_POSIX)
 | 
| +  AppendSwitchNative(switch_string, value_string);
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +void CommandLine::AppendSwitches(const CommandLine& other) {
 | 
| +  SwitchMap::const_iterator i;
 | 
| +  for (i = other.switches_.begin(); i != other.switches_.end(); ++i)
 | 
| +    AppendSwitchNative(i->first, i->second);
 | 
| +}
 | 
| +
 | 
| +void CommandLine::CopySwitchesFrom(const CommandLine& source,
 | 
| +                                   const char* const switches[],
 | 
| +                                   size_t count) {
 | 
| +  for (size_t i = 0; i < count; ++i) {
 | 
| +    if (source.HasSwitch(switches[i])) {
 | 
| +      StringType value = source.GetSwitchValueNative(switches[i]);
 | 
| +      AppendSwitchNative(switches[i], value);
 | 
| +    }
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void CommandLine::AppendArg(const std::string& value) {
 | 
| +#if defined(OS_WIN)
 | 
|    DCHECK(IsStringUTF8(value));
 | 
|    AppendArgNative(UTF8ToWide(value));
 | 
| +#elif defined(OS_POSIX)
 | 
| +  AppendArgNative(value);
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
| -void CommandLine::AppendArgNative(const std::wstring& value) {
 | 
| +void CommandLine::AppendArgPath(const FilePath& path) {
 | 
| +  AppendArgNative(path.value());
 | 
| +}
 | 
| +
 | 
| +void CommandLine::AppendArgNative(const CommandLine::StringType& value) {
 | 
| +#if defined(OS_WIN)
 | 
|    command_line_string_.append(L" ");
 | 
|    command_line_string_.append(WindowsStyleQuote(value));
 | 
|    args_.push_back(value);
 | 
| +#elif defined(OS_POSIX)
 | 
| +  DCHECK(IsStringUTF8(value));
 | 
| +  argv_.push_back(value);
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +void CommandLine::AppendArgs(const CommandLine& other) {
 | 
| +  if(other.args_.size() <= 0)
 | 
| +    return;
 | 
| +#if defined(OS_WIN)
 | 
| +  command_line_string_.append(L" --");
 | 
| +#endif  // OS_WIN
 | 
| +  StringVector::const_iterator i;
 | 
| +  for (i = other.args_.begin(); i != other.args_.end(); ++i)
 | 
| +    AppendArgNative(*i);
 | 
|  }
 | 
|  
 | 
|  void CommandLine::AppendArguments(const CommandLine& other,
 | 
|                                    bool include_program) {
 | 
| +#if defined(OS_WIN)
 | 
|    // Verify include_program is used correctly.
 | 
|    DCHECK(!include_program || !other.GetProgram().empty());
 | 
|    if (include_program)
 | 
| @@ -377,54 +402,7 @@ void CommandLine::AppendArguments(const CommandLine& other,
 | 
|      command_line_string_ += L' ';
 | 
|  
 | 
|    command_line_string_ += other.command_line_string_;
 | 
| -
 | 
| -  std::map<std::string, StringType>::const_iterator i;
 | 
| -  for (i = other.switches_.begin(); i != other.switches_.end(); ++i)
 | 
| -    switches_[i->first] = i->second;
 | 
| -}
 | 
| -
 | 
| -void CommandLine::PrependWrapper(const std::wstring& wrapper) {
 | 
| -  if (wrapper.empty())
 | 
| -    return;
 | 
| -  // The wrapper may have embedded arguments (like "gdb --args"). In this case,
 | 
| -  // we don't pretend to do anything fancy, we just split on spaces.
 | 
| -  std::vector<std::wstring> wrapper_and_args;
 | 
| -  base::SplitString(wrapper, ' ', &wrapper_and_args);
 | 
| -  program_ = wrapper_and_args[0];
 | 
| -  command_line_string_ = wrapper + L" " + command_line_string_;
 | 
| -}
 | 
| -
 | 
|  #elif defined(OS_POSIX)
 | 
| -void CommandLine::AppendSwitch(const std::string& switch_string) {
 | 
| -  argv_.push_back(kSwitchPrefixes[0] + switch_string);
 | 
| -  switches_[switch_string] = "";
 | 
| -}
 | 
| -
 | 
| -void CommandLine::AppendSwitchNative(const std::string& switch_string,
 | 
| -                                     const std::string& value) {
 | 
| -  std::string combined_switch_string = kSwitchPrefixes[0] + switch_string;
 | 
| -  if (!value.empty())
 | 
| -    combined_switch_string += kSwitchValueSeparator + value;
 | 
| -  argv_.push_back(combined_switch_string);
 | 
| -  switches_[switch_string] = value;
 | 
| -}
 | 
| -
 | 
| -void CommandLine::AppendSwitchASCII(const std::string& switch_string,
 | 
| -                                    const std::string& value_string) {
 | 
| -  AppendSwitchNative(switch_string, value_string);
 | 
| -}
 | 
| -
 | 
| -void CommandLine::AppendArg(const std::string& value) {
 | 
| -  AppendArgNative(value);
 | 
| -}
 | 
| -
 | 
| -void CommandLine::AppendArgNative(const std::string& value) {
 | 
| -  DCHECK(IsStringUTF8(value));
 | 
| -  argv_.push_back(value);
 | 
| -}
 | 
| -
 | 
| -void CommandLine::AppendArguments(const CommandLine& other,
 | 
| -                                  bool include_program) {
 | 
|    // Verify include_program is used correctly.
 | 
|    // Logic could be shorter but this is clearer.
 | 
|    DCHECK_EQ(include_program, !other.GetProgram().empty());
 | 
| @@ -436,66 +414,69 @@ void CommandLine::AppendArguments(const CommandLine& other,
 | 
|    // arguments to our arg vector.
 | 
|    for (size_t i = 1; i < other.argv_.size(); ++i)
 | 
|      argv_.push_back(other.argv_[i]);
 | 
| +#endif
 | 
|  
 | 
| -  std::map<std::string, StringType>::const_iterator i;
 | 
| +  SwitchMap::const_iterator i;
 | 
|    for (i = other.switches_.begin(); i != other.switches_.end(); ++i)
 | 
|      switches_[i->first] = i->second;
 | 
|  }
 | 
|  
 | 
| -void CommandLine::PrependWrapper(const std::string& wrapper) {
 | 
| +void CommandLine::PrependWrapper(const CommandLine::StringType& wrapper) {
 | 
|    // The wrapper may have embedded arguments (like "gdb --args"). In this case,
 | 
|    // we don't pretend to do anything fancy, we just split on spaces.
 | 
| -  std::vector<std::string> wrapper_and_args;
 | 
| +  if (wrapper.empty())
 | 
| +    return;
 | 
| +  StringVector wrapper_and_args;
 | 
| +#if defined(OS_WIN)
 | 
| +  base::SplitString(wrapper, ' ', &wrapper_and_args);
 | 
| +  program_ = wrapper_and_args[0];
 | 
| +  command_line_string_ = wrapper + L" " + command_line_string_;
 | 
| +#elif defined(OS_POSIX)
 | 
|    base::SplitString(wrapper, ' ', &wrapper_and_args);
 | 
|    argv_.insert(argv_.begin(), wrapper_and_args.begin(), wrapper_and_args.end());
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
| -#endif
 | 
| +#if defined(OS_WIN)
 | 
| +void CommandLine::ParseFromString(const std::wstring& command_line) {
 | 
| +  TrimWhitespace(command_line, TRIM_ALL, &command_line_string_);
 | 
|  
 | 
| -void CommandLine::AppendSwitchPath(const std::string& switch_string,
 | 
| -                                   const FilePath& path) {
 | 
| -  AppendSwitchNative(switch_string, path.value());
 | 
| -}
 | 
| +  if (command_line_string_.empty())
 | 
| +    return;
 | 
|  
 | 
| -void CommandLine::AppendSwitches(const CommandLine& other) {
 | 
| -  std::map<std::string, StringType>::const_iterator i;
 | 
| -  for (i = other.switches_.begin(); i != other.switches_.end(); ++i)
 | 
| -    AppendSwitchNative(i->first, i->second);
 | 
| -}
 | 
| +  int num_args = 0;
 | 
| +  wchar_t** args = NULL;
 | 
|  
 | 
| -void CommandLine::AppendArgPath(const FilePath& path) {
 | 
| -  AppendArgNative(path.value());
 | 
| -}
 | 
| +  args = CommandLineToArgvW(command_line_string_.c_str(), &num_args);
 | 
|  
 | 
| -void CommandLine::AppendArgs(const CommandLine& other) {
 | 
| -  if(other.args_.size() <= 0)
 | 
| -    return;
 | 
| +  // Populate program_ with the trimmed version of the first arg.
 | 
| +  TrimWhitespace(args[0], TRIM_ALL, &program_);
 | 
|  
 | 
| -#if defined(OS_WIN)
 | 
| -  command_line_string_.append(L" --");
 | 
| -#endif  // OS_WIN
 | 
| -  std::vector<StringType>::const_iterator i;
 | 
| -  for (i = other.args_.begin(); i != other.args_.end(); ++i)
 | 
| -    AppendArgNative(*i);
 | 
| -}
 | 
| +  bool parse_switches = true;
 | 
| +  for (int i = 1; i < num_args; ++i) {
 | 
| +    std::wstring arg;
 | 
| +    TrimWhitespace(args[i], TRIM_ALL, &arg);
 | 
|  
 | 
| -void CommandLine::CopySwitchesFrom(const CommandLine& source,
 | 
| -                                   const char* const switches[],
 | 
| -                                   size_t count) {
 | 
| -  for (size_t i = 0; i < count; ++i) {
 | 
| -    if (source.HasSwitch(switches[i])) {
 | 
| -      StringType value = source.GetSwitchValueNative(switches[i]);
 | 
| -      AppendSwitchNative(switches[i], value);
 | 
| +    if (!parse_switches) {
 | 
| +      args_.push_back(arg);
 | 
| +      continue;
 | 
|      }
 | 
| -  }
 | 
| -}
 | 
|  
 | 
| -// private
 | 
| -CommandLine::CommandLine() {
 | 
| -}
 | 
| +    if (arg == kSwitchTerminator) {
 | 
| +      parse_switches = false;
 | 
| +      continue;
 | 
| +    }
 | 
|  
 | 
| -// static
 | 
| -CommandLine* CommandLine::ForCurrentProcessMutable() {
 | 
| -  DCHECK(current_process_commandline_);
 | 
| -  return current_process_commandline_;
 | 
| +    std::string switch_string;
 | 
| +    std::wstring switch_value;
 | 
| +    if (IsSwitch(arg, &switch_string, &switch_value)) {
 | 
| +      switches_[switch_string] = switch_value;
 | 
| +    } else {
 | 
| +      args_.push_back(arg);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  if (args)
 | 
| +    LocalFree(args);
 | 
|  }
 | 
| +#endif
 | 
| 
 |